[PATCH 2/4] notmuch-restore: implement argument parsing for --match

Subject: [PATCH 2/4] notmuch-restore: implement argument parsing for --match

Date: Sat, 29 Oct 2011 00:04:49 -0300

To: notmuch@notmuchmail.org

Cc: David Bremner

From: David Bremner


From: David Bremner <bremner@debian.org>

- recognize the --match option
- require an argument
- check the argument is a correct regex.

Currently the arguments are ignored after parsing. Note that we have
to be a bit careful to avoid creating a resource leak here by error
returning before calling regfree. On the other hand, notmuch is
probably shutting down at that point, so it may not matter much.
---
 notmuch-restore.c |   18 ++++++++++++++----
 test/dump-restore |    3 ---
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/notmuch-restore.c b/notmuch-restore.c
index 13b4325..e5ac162 100644
--- a/notmuch-restore.c
+++ b/notmuch-restore.c
@@ -29,11 +29,12 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
     notmuch_database_t *notmuch;
     notmuch_bool_t synchronize_flags;
     notmuch_bool_t accumulate = FALSE;
+    notmuch_bool_t match_enabled = FALSE;
     FILE *input = stdin;
     char *line = NULL;
     size_t line_size;
     ssize_t line_len;
-    regex_t regex;
+    regex_t input_regex, match_regex;
     int rerr;
 
     config = notmuch_config_open (ctx, NULL, NULL);
@@ -49,6 +50,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
 
     struct option options[] = {
 	{ "accumulate",   no_argument,       0, 'a' },
+	{ "match",	  required_argument, 0, 'm' },
 	{ 0, 0, 0, 0}
     };
 
@@ -60,6 +62,11 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
 	case 'a':
 	    accumulate = 1;
 	    break;
+	case 'm':
+	    match_enabled = TRUE;
+	    if ( xregcomp (&match_regex, optarg, REG_EXTENDED) )
+		return 1;
+	    break;
 	case '?':
 	    return 1;
 	    break;
@@ -88,7 +95,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
      * non-space characters for the message-id, then one or more
      * spaces, then a list of space-separated tags as a sequence of
      * characters within literal '(' and ')'. */
-    if ( xregcomp (&regex,
+    if ( xregcomp (&input_regex,
 		   "^([^ ]+) \\(([^)]*)\\)$",
 		   REG_EXTENDED) )
 	INTERNAL_ERROR("compile time constant regex failed.");
@@ -103,7 +110,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
 
 	chomp_newline (line);
 
-	rerr = xregexec (&regex, line, 3, match, 0);
+	rerr = xregexec (&input_regex, line, 3, match, 0);
 	if (rerr == REG_NOMATCH)
 	{
 	    fprintf (stderr, "Warning: Ignoring invalid input line: %s\n",
@@ -186,7 +193,10 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
 	free (file_tags);
     }
 
-    regfree (&regex);
+    regfree (&input_regex);
+
+    if (match_enabled)
+	regfree (&match_regex);
 
     if (line)
 	free (line);
diff --git a/test/dump-restore b/test/dump-restore
index c176b52..c6089f9 100755
--- a/test/dump-restore
+++ b/test/dump-restore
@@ -55,16 +55,13 @@ test_expect_success 'restore extra argument' \
 
 
 test_begin_subtest 'restore --match #missing arg'
-test_subtest_known_broken
 test_expect_equal "restore: option '--match' requires an argument"\
   "$(notmuch restore --match 2>&1)"
 
 test_begin_subtest 'restore --match=<bad regex>'
-test_subtest_known_broken
 test_expect_equal 'compiling regex notmuch.*[: Invalid regular expression'\
   "$(notmuch restore --match='notmuch.*[' 2>&1)"
 
-test_subtest_known_broken
 test_expect_success 'restore --match=<good regex>' \
     'notmuch restore --match="notmuch.*" < /dev/null > /dev/null 2>&1'
 
-- 
1.7.6.3


Thread: