show: workaround for the missing file problem
authorYuri Volchkov <yuri.volchkov@gmail.com>
Mon, 21 Aug 2017 15:44:48 +0000 (17:44 +0200)
committerDavid Bremner <david@tethera.net>
Tue, 22 Aug 2017 21:48:29 +0000 (18:48 -0300)
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>
mime-node.c
test/T670-duplicate-mid.sh

index bb0870d024ad1f82127e37eeb564578bc9a2695a..24d73afa84589f9ee49c50b9a82225fd9b76865b 100644 (file)
@@ -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) {
index f6f160292027269507ae0fa94d4db4d3ce472c58..decbc0a4e99756c0d13e7231d913899a06deb376 100755 (executable)
@@ -39,7 +39,6 @@ test_expect_equal_file EXPECTED OUTPUT
 
 rm ${MAIL_DIR}/copy1
 test_begin_subtest 'Deleted first duplicate file does not stop notmuch show from working'
-test_subtest_known_broken
 output=$(notmuch show --body=false --format=json id:duplicate)
 expected='[[[{
     "id": "'duplicate'",