[PATCH 2/2] lib: add 'safe' setting for flags

Jani Nikula jani at nikula.org
Fri Jan 6 14:45:30 PST 2012


On Sat, 16 Jul 2011 23:56:13 -0400, Antoine Beaupré <anarcat at koumbit.org> wrote:
> the 'safe' setting needs to be 'true' for flags to be manipulated by
> notmuch new/tag/restore.
> 
> for now, only the (T)rash tag is configurable and set to false (by
> default) but this could be extended to allow the user to configure which
> flags are allowed to be synchronized.
> 
> the reason why only T is configurable is because (a) it's the the only
> one that is actually dangerous and (b) I couldn't figure out how to
> properly configure multiple settings like this.
> ---
>  lib/message.cc    |   40 +++++++++++++++++++++++++---------------
>  lib/notmuch.h     |   20 ++++++++++++++++----
>  notmuch-new.c     |    1 +
>  notmuch-restore.c |    1 +
>  notmuch-tag.c     |    1 +
>  5 files changed, 44 insertions(+), 19 deletions(-)
> 
> diff --git a/lib/message.cc b/lib/message.cc
> index f633887..f812648 100644
> --- a/lib/message.cc
> +++ b/lib/message.cc
> @@ -50,16 +50,17 @@ struct maildir_flag_tag {
>      char flag;
>      const char *tag;
>      bool inverse;
> +    bool safe;
>  };
>  
>  /* ASCII ordered table of Maildir flags and associated tags */
>  static struct maildir_flag_tag flag2tag[] = {
> -    { 'D', "draft",   false},
> -    { 'F', "flagged", false},
> -    { 'P', "passed",  false},
> -    { 'R', "replied", false},
> -    { 'S', "unread",  true },
> -    { 'T', "deleted", false},
> +    { 'D', "draft",   false, true},
> +    { 'F', "flagged", false, true},
> +    { 'P', "passed",  false, true},
> +    { 'R', "replied", false, true},
> +    { 'S', "unread",  true , true},
> +    { 'T', "deleted", false, false},
>  };
>  
>  /* We end up having to call the destructor explicitly because we had
> @@ -994,7 +995,6 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message)
>      char *combined_flags = talloc_strdup (message, "");
>      unsigned i;
>      int seen_maildir_info = 0;
> -    notmuch_bool_t reckless_trash;
>  
>      for (filenames = notmuch_message_get_filenames (message);
>  	 notmuch_filenames_valid (filenames);
> @@ -1022,15 +1022,8 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message)
>      if (status)
>  	return status;
>  
> -    // TODO: this should probably be moved up in the stack to avoid
> -    // opening the config file on every message (!)
> -    config = notmuch_config_open (ctx, NULL, NULL);
> -    if (config == NULL)
> -	return 1;
> -    reckless_trash = notmuch_config_get_maildir_reckless_trash (config);
> -

Antoine -

You do *not* send a patch 1/2 that adds features and then 2/2 that takes
them away. I feel like I totally wasted my time reviewing the first.


Jani.



>      for (i = 0; i < ARRAY_SIZE(flag2tag); i++) {
> -	if (flag2tag[i].flag == 'T' && !reckless_trash) {
> +	if (!flag2tag[i].safe) {
>  	    continue;
>  	}
>  	if ((strchr (combined_flags, flag2tag[i].flag) != NULL)
> @@ -1119,6 +1112,9 @@ _get_maildir_flag_actions (notmuch_message_t *message,
>  	tag = notmuch_tags_get (tags);
>  
>  	for (i = 0; i < ARRAY_SIZE (flag2tag); i++) {
> +	    if (!flag2tag[i].safe) {
> +		continue;
> +	    }
>  	    if (strcmp (tag, flag2tag[i].tag) == 0) {
>  		if (flag2tag[i].inverse)
>  		    to_clear = talloc_asprintf_append (to_clear,
> @@ -1134,6 +1130,9 @@ _get_maildir_flag_actions (notmuch_message_t *message,
>  
>      /* Then, find the flags for all tags not present. */
>      for (i = 0; i < ARRAY_SIZE (flag2tag); i++) {
> +	if (!flag2tag[i].safe) {
> +	    continue;
> +	}
>  	if (flag2tag[i].inverse) {
>  	    if (strchr (to_clear, flag2tag[i].flag) == NULL)
>  		to_set = talloc_asprintf_append (to_set, "%c", flag2tag[i].flag);
> @@ -1256,6 +1255,17 @@ _new_maildir_filename (void *ctx,
>      return filename_new;
>  }
>  
> +void
> +notmuch_message_set_flag_safety (char flag, notmuch_bool_t safe)
> +{
> +    unsigned i;
> +    for (i = 0; i < ARRAY_SIZE (flag2tag); i++) {
> +        if (flag2tag[i].flag == flag) {
> +            flag2tag[i].safe = safe;
> +        }
> +    }
> +}
> +
>  notmuch_status_t
>  notmuch_message_tags_to_maildir_flags (notmuch_message_t *message)
>  {
> diff --git a/lib/notmuch.h b/lib/notmuch.h
> index f0c1b67..475e75a 100644
> --- a/lib/notmuch.h
> +++ b/lib/notmuch.h
> @@ -922,8 +922,7 @@ notmuch_message_remove_all_tags (notmuch_message_t *message);
>   *	'P'	Adds the "passed" tag to the message
>   *	'R'	Adds the "replied" tag to the message
>   *	'S'	Removes the "unread" tag from the message
> - * 	'T'	Adds the "deleted" tag to the message and
> - *		state->reckless_trash is TRUE.
> + * 	'T'	Adds the "deleted" tag to the message
>   *
>   * For each flag that is not present, the opposite action (add/remove)
>   * is performed for the corresponding tags.
> @@ -941,6 +940,9 @@ notmuch_message_remove_all_tags (notmuch_message_t *message);
>   * notmuch_database_add_message. See also
>   * notmuch_message_tags_to_maildir_flags for synchronizing tag changes
>   * back to maildir flags.
> + *
> + * Actions are performed only if the tag is marked as "safe" in the
> + * configuration (only used by maildir_reckless_trash for now).
>   */
>  notmuch_status_t
>  notmuch_message_maildir_flags_to_tags (notmuch_message_t *message);
> @@ -964,8 +966,7 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message);
>   *   'P' iff the message has the "passed" tag
>   *   'R' iff the message has the "replied" tag
>   *   'S' iff the message does not have the "unread" tag
> - *   'T' iff the message has the "trashed" tag and
> - *   state->reckless_trash is TRUE.
> + *   'T' iff the message has the "trashed" tag
>   *
>   * Any existing flags unmentioned in the list above will be preserved
>   * in the renaming.
> @@ -979,10 +980,21 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message);
>   * notmuch_message_remove_tag, or notmuch_message_freeze/
>   * notmuch_message_thaw). See also notmuch_message_maildir_flags_to_tags
>   * for synchronizing maildir flag changes back to tags.
> + *
> + * Actions are performed only if the tag is marked as "safe" in the
> + * configuration (only used by maildir_reckless_trash for now).
>   */
>  notmuch_status_t
>  notmuch_message_tags_to_maildir_flags (notmuch_message_t *message);
>  
> +/* Set the 'safe' setting on the given flag
> + *
> + * The flag is the one-character IMAP flag, for example for Trashed
> + * messages, it's the char 'T'.
> + */
> +void
> +notmuch_message_set_flag_safety(char flag, notmuch_bool_t safe);
> +
>  /* Freeze the current state of 'message' within the database.
>   *
>   * This means that changes to the message state, (via
> diff --git a/notmuch-new.c b/notmuch-new.c
> index 7d17793..1502a70 100644
> --- a/notmuch-new.c
> +++ b/notmuch-new.c
> @@ -801,6 +801,7 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
>  
>      add_files_state.new_tags = notmuch_config_get_new_tags (config, &add_files_state.new_tags_length);
>      add_files_state.synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
> +    notmuch_message_set_flag_safety('T', notmuch_config_get_maildir_reckless_trash (config));
>      add_files_state.message_ids_to_sync = _filename_list_create (ctx);
>      db_path = notmuch_config_get_database_path (config);
>  
> diff --git a/notmuch-restore.c b/notmuch-restore.c
> index f095f64..1f3622e 100644
> --- a/notmuch-restore.c
> +++ b/notmuch-restore.c
> @@ -43,6 +43,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
>  	return 1;
>  
>      synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
> +    notmuch_message_set_flag_safety('T', notmuch_config_get_maildir_reckless_trash (config));
>  
>      if (argc) {
>  	input = fopen (argv[0], "r");
> diff --git a/notmuch-tag.c b/notmuch-tag.c
> index 6204ae3..e2f7cb8 100644
> --- a/notmuch-tag.c
> +++ b/notmuch-tag.c
> @@ -101,6 +101,7 @@ notmuch_tag_command (void *ctx, unused (int argc), unused (char *argv[]))
>  	return 1;
>  
>      synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
> +    notmuch_message_set_flag_safety('T', notmuch_config_get_maildir_reckless_trash (config));
>  
>      query = notmuch_query_create (notmuch, query_string);
>      if (query == NULL) {
> -- 
> 1.7.2.5
> 
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list