[PATCH 4/4] notmuch-restore: implement --match functionality
David Bremner
david at tethera.net
Fri Oct 28 20:04:51 PDT 2011
From: David Bremner <bremner at debian.org>
notmuch restore --match=<regex> will for each message in the dump
file, delete any tags from the database matching <regex> and add any
from the dump file matching <regex>.
I tried to keep this simple, so in particular turning on regex
matching disables one of the optimizations.
---
notmuch-restore.c | 16 +++++++++++++---
test/dump-restore | 4 ----
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/notmuch-restore.c b/notmuch-restore.c
index e5ac162..a1b6b81 100644
--- a/notmuch-restore.c
+++ b/notmuch-restore.c
@@ -64,7 +64,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
break;
case 'm':
match_enabled = TRUE;
- if ( xregcomp (&match_regex, optarg, REG_EXTENDED) )
+ if ( xregcomp (&match_regex, optarg, REG_EXTENDED|REG_NOSUB) )
return 1;
break;
case '?':
@@ -147,6 +147,10 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
{
const char *tag = notmuch_tags_get (db_tags);
+ if (match_enabled && !accumulate &&
+ !regexec (&match_regex, tag, 0, NULL, 0) )
+ notmuch_message_remove_tag (message, tag);
+
if (db_tags_str)
db_tags_str = talloc_asprintf_append (db_tags_str, " %s", tag);
else
@@ -155,14 +159,15 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
if (((file_tags == NULL || *file_tags == '\0') &&
(db_tags_str == NULL || *db_tags_str == '\0')) ||
- (file_tags && db_tags_str && strcmp (file_tags, db_tags_str) == 0))
+ (!match_enabled && file_tags && db_tags_str &&
+ strcmp (file_tags, db_tags_str) == 0))
{
goto NEXT_LINE;
}
notmuch_message_freeze (message);
- if (!accumulate)
+ if (!accumulate && !match_enabled)
notmuch_message_remove_all_tags (message);
next = file_tags;
@@ -170,6 +175,11 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
tag = strsep (&next, " ");
if (*tag == '\0')
continue;
+
+ if (match_enabled &&
+ regexec (&match_regex, tag, 0, NULL, 0))
+ continue;
+
status = notmuch_message_add_tag (message, tag);
if (status) {
fprintf (stderr,
diff --git a/test/dump-restore b/test/dump-restore
index 18925a4..a4517f6 100755
--- a/test/dump-restore
+++ b/test/dump-restore
@@ -72,7 +72,6 @@ test_expect_success 'Restoring with trivial match' \
sed 's/inbox\|unread\|signed//g' < dump-ABC_DEF.expected > dump-ABC_DEF-only
-test_subtest_known_broken
test_expect_success 'Simulate accumulate with match' \
'notmuch restore < dump.expected &&
notmuch restore --match="(ABC|DEF)" < dump-ABC_DEF-only &&
@@ -80,7 +79,6 @@ test_expect_success 'Simulate accumulate with match' \
notmuch restore < dump.expected &&
test_cmp dump-ABC_DEF.expected dump-simulate.actual'
-test_subtest_known_broken
test_expect_success 'clear only matched tags' \
'notmuch restore < dump-ABC_DEF.expected &&
notmuch restore --match="(ABC|DEF)" < clear.expected &&
@@ -88,7 +86,6 @@ test_expect_success 'clear only matched tags' \
notmuch restore < dump.expected &&
test_cmp dump.expected dump-clear-match.actual'
-test_subtest_known_broken
test_expect_success 'import only matched tags' \
'notmuch restore < dump.expected &&
notmuch restore --match="(inbox|unread)" < dump-ABC_DEF.expected &&
@@ -99,7 +96,6 @@ test_expect_success 'import only matched tags' \
sed 's/inbox\|unread\|signed\|ABC//g' < dump-ABC_DEF.expected > dump-DEF-only
sed 's/inbox\|unread\|signed\|DEF//g' < dump-ABC_DEF.expected > dump-ABC-only
-test_subtest_known_broken
test_expect_success 'combine --match and --accumulate' \
'notmuch restore < dump.expected &&
notmuch restore --match="(ABC|DEF)" < dump-ABC-only &&
--
1.7.6.3
More information about the notmuch
mailing list