[PATCH 10/18] insert: parse command-line tag operations

Peter Wang novalazy at gmail.com
Wed Jul 25 06:42:39 PDT 2012


Parse +tag and -tag on the 'insert' command-line.
Issue a warning about ambiguous -tag arguments which don't follow
+tag nor an explicit option list terminator.
---
 notmuch-insert.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/notmuch-insert.c b/notmuch-insert.c
index 4fb3ea3..6db03e3 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -24,6 +24,11 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 
+typedef struct {
+    const char *tag;
+    notmuch_bool_t remove;
+} tag_operation_t;
+
 static notmuch_bool_t
 check_folder_name (const char *folder)
 {
@@ -236,8 +241,11 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
     const char **new_tags;
     size_t new_tags_length;
     const char *folder = NULL;
+    tag_operation_t *tag_ops;
+    int tag_ops_count = 0;
     char *maildir;
     int opt_index;
+    notmuch_bool_t warn_tag_rem;
     notmuch_bool_t ret;
 
     notmuch_opt_desc_t options[] = {
@@ -253,6 +261,48 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
 	return 1;
     }
 
+    if (opt_index > 0 && strcmp (argv[opt_index - 1], "--") == 0) {
+	warn_tag_rem = FALSE;
+    } else {
+	warn_tag_rem = TRUE;
+    }
+
+    /* Array of tagging operations (add or remove), terminated with an
+     * empty element. */
+    tag_ops = talloc_array (ctx, tag_operation_t, argc - opt_index + 1);
+    if (tag_ops == NULL) {
+	fprintf (stderr, "Out of memory.\n");
+	return 1;
+    }
+
+    for (; opt_index < argc; opt_index++) {
+	if (argv[opt_index][0] == '+') {
+	    tag_ops[tag_ops_count].tag = argv[opt_index] + 1;
+	    tag_ops[tag_ops_count].remove = FALSE;
+	    tag_ops_count++;
+	    warn_tag_rem = FALSE;
+	} else if (argv[opt_index][0] == '-') {
+	    if (warn_tag_rem) {
+		fprintf (stderr,
+			 "Warning: ambiguous argument treated as tag removal: %s\n",
+			 argv[opt_index]);
+	    }
+	    tag_ops[tag_ops_count].tag = argv[opt_index] + 1;
+	    tag_ops[tag_ops_count].remove = TRUE;
+	    tag_ops_count++;
+	} else {
+	    break;
+	}
+    }
+
+    tag_ops[tag_ops_count].tag = NULL;
+
+    if (opt_index != argc) {
+	fprintf (stderr, "Error: bad argument to notmuch insert: %s\n",
+		 argv[opt_index]);
+	return 1;
+    }
+
     config = notmuch_config_open (ctx, NULL, NULL);
     if (config == NULL)
 	return 1;
-- 
1.7.4.4



More information about the notmuch mailing list