diff options
author | Yuri Volchkov <yuri.volchkov@gmail.com> | 2017-08-21 17:44:48 +0200 |
---|---|---|
committer | David Bremner <david@tethera.net> | 2017-08-22 18:48:29 -0300 |
commit | 09fa51303c6ba5adfd2431d87663523aa799288b (patch) | |
tree | b1f1a0db1303397cd3752c6bbe0be04d7c4745e0 /mime-node.c | |
parent | 39cc84e9fc84065835bce0b0ebd92f4c7adbb23a (diff) |
show: workaround for the missing file problem
This patch fixes the 'Deleted first duplicate file does not stop
notmuch show from working' test.
If a message to be shown has several duplicated files, and for some
reason the first file in the list is not available anymore, notmuch
will exit with an error.
This is clearly a problem in the database, but we are not going to let
this problem be a show-stopper. Let's walk through the list, and show
the first existing file.
Signed-off-by: Yuri Volchkov <yuri.volchkov@gmail.com>
Diffstat (limited to 'mime-node.c')
-rw-r--r-- | mime-node.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/mime-node.c b/mime-node.c index bb0870d0..24d73afa 100644 --- a/mime-node.c +++ b/mime-node.c @@ -79,12 +79,32 @@ mime_node_open (const void *ctx, notmuch_message_t *message, } talloc_set_destructor (mctx, _mime_node_context_free); + /* Fast path */ mctx->file = fopen (filename, "r"); if (! mctx->file) { - fprintf (stderr, "Error opening %s: %s\n", filename, strerror (errno)); - status = NOTMUCH_STATUS_FILE_ERROR; - goto DONE; - } + /* Slow path - for some reason the first file in the list is + * not available anymore. This is clearly a problem in the + * database, but we are not going to let this problem be a + * show stopper */ + notmuch_filenames_t *filenames; + for (filenames = notmuch_message_get_filenames (message); + notmuch_filenames_valid (filenames); + notmuch_filenames_move_to_next (filenames)) + { + filename = notmuch_filenames_get (filenames); + mctx->file = fopen (filename, "r"); + if (mctx->file) + break; + } + + talloc_free (filenames); + if (! mctx->file) { + /* Give up */ + fprintf (stderr, "Error opening %s: %s\n", filename, strerror (errno)); + status = NOTMUCH_STATUS_FILE_ERROR; + goto DONE; + } + } mctx->stream = g_mime_stream_file_new (mctx->file); if (!mctx->stream) { |