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

Mark Walters markwalters1009 at gmail.com
Sun Nov 18 09:05:42 PST 2012


Hi

On Wed, 25 Jul 2012, Peter Wang <novalazy at gmail.com> wrote:
> 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;
> +	}
> +    }

I don't like the code duplication between this and notmuch-tag.c. In
particular the two (now) differ on how they deal with malformed tags
etc. Would it be possible to unify them?

Best wishes

Mark

> +
> +    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
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list