mirror of
https://git.notmuchmail.org/git/notmuch
synced 2025-01-03 15:21:41 +01:00
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"
This commit is contained in:
parent
42c80dfd07
commit
a77d9adcac
2 changed files with 37 additions and 12 deletions
|
@ -18,6 +18,8 @@
|
||||||
* Author: Carl Worth <cworth@cworth.org>
|
* Author: Carl Worth <cworth@cworth.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
#include "notmuch-client.h"
|
#include "notmuch-client.h"
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -26,7 +28,8 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
|
||||||
notmuch_config_t *config;
|
notmuch_config_t *config;
|
||||||
notmuch_database_t *notmuch;
|
notmuch_database_t *notmuch;
|
||||||
notmuch_bool_t synchronize_flags;
|
notmuch_bool_t synchronize_flags;
|
||||||
FILE *input;
|
notmuch_bool_t accumulate = FALSE;
|
||||||
|
FILE *input = stdin;
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
size_t line_size;
|
size_t line_size;
|
||||||
ssize_t line_len;
|
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);
|
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}
|
||||||
|
};
|
||||||
|
|
||||||
if (argc) {
|
int opt;
|
||||||
input = fopen (argv[0], "r");
|
do {
|
||||||
|
opt = getopt_long (argc, argv, "", options, NULL);
|
||||||
|
|
||||||
|
switch (opt) {
|
||||||
|
case 'a':
|
||||||
|
accumulate = 1;
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (opt != -1);
|
||||||
|
|
||||||
|
if (optind < argc) {
|
||||||
|
input = fopen (argv[optind], "r");
|
||||||
if (input == NULL) {
|
if (input == NULL) {
|
||||||
fprintf (stderr, "Error opening %s for reading: %s\n",
|
fprintf (stderr, "Error opening %s for reading: %s\n",
|
||||||
argv[0], strerror (errno));
|
argv[optind], strerror (errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
optind++;
|
||||||
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
|
||||||
|
@ -99,6 +118,13 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
|
||||||
goto NEXT_LINE;
|
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;
|
db_tags_str = NULL;
|
||||||
for (db_tags = notmuch_message_get_tags (message);
|
for (db_tags = notmuch_message_get_tags (message);
|
||||||
notmuch_tags_valid (db_tags);
|
notmuch_tags_valid (db_tags);
|
||||||
|
@ -120,6 +146,8 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
notmuch_message_freeze (message);
|
notmuch_message_freeze (message);
|
||||||
|
|
||||||
|
if (!accumulate)
|
||||||
notmuch_message_remove_all_tags (message);
|
notmuch_message_remove_all_tags (message);
|
||||||
|
|
||||||
next = file_tags;
|
next = file_tags;
|
||||||
|
|
|
@ -23,7 +23,6 @@ test_expect_success 'Clearing all tags' \
|
||||||
notmuch dump > clear.actual &&
|
notmuch dump > clear.actual &&
|
||||||
test_cmp clear.expected clear.actual'
|
test_cmp clear.expected clear.actual'
|
||||||
|
|
||||||
test_subtest_known_broken # missing --accumuluate
|
|
||||||
test_expect_success 'Accumulate original tags' \
|
test_expect_success 'Accumulate original tags' \
|
||||||
'notmuch tag +ABC +DEF -- from:cworth &&
|
'notmuch tag +ABC +DEF -- from:cworth &&
|
||||||
notmuch restore --accumulate < dump.expected &&
|
notmuch restore --accumulate < dump.expected &&
|
||||||
|
@ -40,13 +39,11 @@ test_expect_success 'Restore with nothing to do' \
|
||||||
notmuch dump > dump.actual &&
|
notmuch dump > dump.actual &&
|
||||||
test_cmp dump.expected dump.actual'
|
test_cmp dump.expected dump.actual'
|
||||||
|
|
||||||
test_subtest_known_broken # missing --accumuluate
|
|
||||||
test_expect_success 'Restore with nothing to do, II' \
|
test_expect_success 'Restore with nothing to do, II' \
|
||||||
'notmuch restore --accumulate dump.expected &&
|
'notmuch restore --accumulate dump.expected &&
|
||||||
notmuch dump > dump.actual &&
|
notmuch dump > dump.actual &&
|
||||||
test_cmp dump.expected dump.actual'
|
test_cmp dump.expected dump.actual'
|
||||||
|
|
||||||
test_subtest_known_broken # missing --accumuluate
|
|
||||||
test_expect_success 'Restore with nothing to do, III' \
|
test_expect_success 'Restore with nothing to do, III' \
|
||||||
'notmuch restore --accumulate < clear.expected &&
|
'notmuch restore --accumulate < clear.expected &&
|
||||||
notmuch dump > dump.actual &&
|
notmuch dump > dump.actual &&
|
||||||
|
|
Loading…
Reference in a new issue