aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch-restore.c
diff options
context:
space:
mode:
authorGravatar David Bremner <bremner@debian.org>2011-10-19 18:18:24 -0300
committerGravatar David Bremner <bremner@debian.org>2011-10-23 10:27:57 -0300
commita77d9adcacf001025092087fb6c1d77743cdf699 (patch)
tree1aefc7985d08b1cd9f05fa09859bab667c12bcf0 /notmuch-restore.c
parent42c80dfd07740ed07cf58eefd0c30dc78cbafc08 (diff)
notmuch-restore: implement --accumulate option
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"
Diffstat (limited to 'notmuch-restore.c')
-rw-r--r--notmuch-restore.c46
1 files changed, 37 insertions, 9 deletions
diff --git a/notmuch-restore.c b/notmuch-restore.c
index f530bb4e..75bc09a6 100644
--- a/notmuch-restore.c
+++ b/notmuch-restore.c
@@ -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) {