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"
* Author: Carl Worth <cworth@cworth.org>
*/
* Author: Carl Worth <cworth@cworth.org>
*/
#include "notmuch-client.h"
int
#include "notmuch-client.h"
int
notmuch_config_t *config;
notmuch_database_t *notmuch;
notmuch_bool_t synchronize_flags;
notmuch_config_t *config;
notmuch_database_t *notmuch;
notmuch_bool_t synchronize_flags;
+ notmuch_bool_t accumulate = FALSE;
+ FILE *input = stdin;
char *line = NULL;
size_t line_size;
ssize_t line_len;
char *line = NULL;
size_t line_size;
ssize_t line_len;
synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
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",
if (input == NULL) {
fprintf (stderr, "Error opening %s for reading: %s\n",
- argv[0], strerror (errno));
+ argv[optind], strerror (errno));
- } else {
- printf ("No filename given. Reading dump from stdin.\n");
- input = stdin;
}
/* Dump output is one line per message. We match a sequence of
}
/* Dump output is one line per message. We match a sequence of
+ /* 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);
db_tags_str = NULL;
for (db_tags = notmuch_message_get_tags (message);
notmuch_tags_valid (db_tags);
}
notmuch_message_freeze (message);
}
notmuch_message_freeze (message);
- notmuch_message_remove_all_tags (message);
+
+ if (!accumulate)
+ notmuch_message_remove_all_tags (message);
next = file_tags;
while (next) {
next = file_tags;
while (next) {
notmuch dump > clear.actual &&
test_cmp clear.expected clear.actual'
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 &&
test_expect_success 'Accumulate original tags' \
'notmuch tag +ABC +DEF -- from:cworth &&
notmuch restore --accumulate < dump.expected &&
notmuch dump > dump.actual &&
test_cmp dump.expected dump.actual'
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_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 &&
test_expect_success 'Restore with nothing to do, III' \
'notmuch restore --accumulate < clear.expected &&
notmuch dump > dump.actual &&