notmuch-restore: implement --accumulate option
authorDavid Bremner <bremner@debian.org>
Wed, 19 Oct 2011 21:18:24 +0000 (18:18 -0300)
committerDavid Bremner <bremner@debian.org>
Sun, 23 Oct 2011 13:27:57 +0000 (10:27 -0300)
Modify command line argument handling to take a --accumulate flag.
Test for extra arguments beyond the input file.

The --accumulate switch causes the union of the existing and new tags to be
applied, instead of replacing each message's tags as they are read in from the
dump file.

Based on a patch by Thomas Schwinge:

      id:"1317317857-29636-1-git-send-email-thomas@schwinge.name"

notmuch-restore.c
test/dump-restore

index f530bb4ed9388833e91a70cecd321c9daeb521d2..75bc09a68629da667fb8e3a62257ba028c6fc431 100644 (file)
@@ -18,6 +18,8 @@
  * Author: Carl Worth <cworth@cworth.org>
  */
 
+#include <getopt.h>
+
 #include "notmuch-client.h"
 
 int
@@ -26,7 +28,8 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
     notmuch_config_t *config;
     notmuch_database_t *notmuch;
     notmuch_bool_t synchronize_flags;
-    FILE *input;
+    notmuch_bool_t accumulate = FALSE;
+    FILE *input = stdin;
     char *line = NULL;
     size_t line_size;
     ssize_t line_len;
@@ -44,18 +47,34 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
 
     synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
 
-    argc--; argv++; /* skip subcommand argument */
+    struct option options[] = {
+       { "accumulate",   no_argument,       0, 'a' },
+       { 0, 0, 0, 0}
+    };
+
+    int opt;
+    do {
+       opt = getopt_long (argc, argv, "", options, NULL);
+
+       switch (opt) {
+       case 'a':
+           accumulate = 1;
+           break;
+       case '?':
+           return 1;
+           break;
+       }
+
+    } while (opt != -1);
 
-    if (argc) {
-       input = fopen (argv[0], "r");
+    if (optind < argc) {
+       input = fopen (argv[optind], "r");
        if (input == NULL) {
            fprintf (stderr, "Error opening %s for reading: %s\n",
-                    argv[0], strerror (errno));
+                    argv[optind], strerror (errno));
            return 1;
        }
-    } else {
-       printf ("No filename given. Reading dump from stdin.\n");
-       input = stdin;
+       optind++;
     }
 
     /* Dump output is one line per message. We match a sequence of
@@ -99,6 +118,13 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
            goto NEXT_LINE;
        }
 
+       /* In order to detect missing messages, this check/optimization is
+        * intentionally done *after* first finding the message.  */
+       if (accumulate && (file_tags == NULL || *file_tags == '\0'))
+       {
+           goto NEXT_LINE;
+       }
+
        db_tags_str = NULL;
        for (db_tags = notmuch_message_get_tags (message);
             notmuch_tags_valid (db_tags);
@@ -120,7 +146,9 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
        }
 
        notmuch_message_freeze (message);
-       notmuch_message_remove_all_tags (message);
+
+       if (!accumulate)
+           notmuch_message_remove_all_tags (message);
 
        next = file_tags;
        while (next) {
index 0f62d9da2e8b0ad6ffc1c7e333e4eeef0883007f..85096716ba3753a09ddecf8e3e01ddcb0a32d1ac 100755 (executable)
@@ -23,7 +23,6 @@ test_expect_success 'Clearing all tags' \
   notmuch dump > clear.actual &&
   test_cmp clear.expected clear.actual'
 
-test_subtest_known_broken      # missing --accumuluate
 test_expect_success 'Accumulate original tags' \
   'notmuch tag +ABC +DEF -- from:cworth &&
   notmuch restore --accumulate < dump.expected &&
@@ -40,13 +39,11 @@ test_expect_success 'Restore with nothing to do' \
   notmuch dump > dump.actual &&
   test_cmp dump.expected dump.actual'
 
-test_subtest_known_broken      # missing --accumuluate
 test_expect_success 'Restore with nothing to do, II' \
   'notmuch restore --accumulate dump.expected &&
   notmuch dump > dump.actual &&
   test_cmp dump.expected dump.actual'
 
-test_subtest_known_broken      # missing --accumuluate
 test_expect_success 'Restore with nothing to do, III' \
   'notmuch restore --accumulate < clear.expected &&
   notmuch dump > dump.actual &&