From: Karel Zak Date: Sat, 5 Oct 2013 18:34:57 +0000 (-0700) Subject: clean up tags related code, improve %G X-Git-Tag: neomutt-20160404~13^2~29 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6a5d4b70dd3a725665ee9820d771dd8982854612;p=neomutt clean up tags related code, improve %G - clean up code - allows to use %G (and transform-tags) for unhidden tags too Signed-off-by: Karel Zak --- diff --git a/README.notmuch b/README.notmuch index d0e68b0c8..12e3183ad 100644 --- a/README.notmuch +++ b/README.notmuch @@ -179,6 +179,9 @@ notmuch support for mutt set index_format='4C %S %[%y.%m.%d] %-18.18n %?GU?%GU& ? %?GR?%GR& ? %?GI?%GI& ? %s' + The %G formatting sequence may display all tags including tags hidden by + nm_hidden_tags. + nm_record = Add messages stored to the mutt record (see $record in the mutt docs) @@ -252,10 +255,12 @@ notmuch support for mutt index_format and pager_format %g notmuch tags (labels) + %Gx specific notmuch tag defined by tag-formats (see above) for example: - set index_format = "%4C %Z %[%d/%b] %-16.15F %s %> %?g?(%g)?" + tag-formats "inbox" "GI" + set index_format = "%4C %Z %?GI?%GI? ? %[%d/%b] %-16.15F %s %> %?g?(%g)?" set pager_format = "-%Z- %C/%m: %-20.20n %s%* -- %?g?(%g)? - (%P)" * TODO: diff --git a/mutt_notmuch.c b/mutt_notmuch.c index 32dcf4455..58fc8896d 100644 --- a/mutt_notmuch.c +++ b/mutt_notmuch.c @@ -60,6 +60,16 @@ struct uri_tag { struct uri_tag *next; }; +/* + * HEADER->(nm_hdrdata *)data->tag_list node + */ +struct nm_hdrtag +{ + char *tag; + char *transformed; + struct nm_hdrtag *next; +}; + /* * HEADER->data */ @@ -67,7 +77,7 @@ struct nm_hdrdata { char *folder; char *tags; char *tags_transformed; - NM_HDR_TAG *tag_list; + struct nm_hdrtag *tag_list; char *oldpath; int magic; }; @@ -170,9 +180,9 @@ err: return -1; } -static void free_tag_list(NM_HDR_TAG **tag_list) +static void free_tag_list(struct nm_hdrtag **tag_list) { - NM_HDR_TAG *tmp; + struct nm_hdrtag *tmp; while ((tmp = *tag_list) != NULL) { @@ -285,6 +295,7 @@ char *nm_header_get_folder(HEADER *h) return h && h->data ? ((struct nm_hdrdata *) h->data)->folder : NULL; } +/* returns all unhidden tags */ char *nm_header_get_tags(HEADER *h) { return h && h->data ? ((struct nm_hdrdata *) h->data)->tags : NULL; @@ -295,14 +306,9 @@ char *nm_header_get_tags_transformed(HEADER *h) return h && h->data ? ((struct nm_hdrdata *) h->data)->tags_transformed : NULL; } -NM_HDR_TAG *nm_header_get_tags_list(HEADER *h) -{ - return h && h->data ? ((struct nm_hdrdata *) h->data)->tag_list : NULL; -} - char *nm_header_get_tag_transformed(char *tag, HEADER *h) { - NM_HDR_TAG *tmp; + struct nm_hdrtag *tmp; if (!h || !h->data) return NULL; @@ -587,15 +593,27 @@ err: return NULL; } +static void append_str_item(char **str, const char *item) +{ + char *p; + size_t sz = strlen(item); + size_t ssz = *str ? strlen(*str) : 0; + + safe_realloc(str, ssz + (ssz ? 1 : 0) + sz + 1); + p = *str + ssz; + if (ssz) { + *p++ = ' '; + sz++; + } + memcpy(p, item, sz + 1); +} static int update_header_tags(HEADER *h, notmuch_message_t *msg) { struct nm_hdrdata *data = h->data; notmuch_tags_t *tags; - char *tstr = NULL, *ttstr = NULL, *p; - size_t sz = 0, tsz = 0; - NM_HDR_TAG *tag_list = NULL; - NM_HDR_TAG *tmp; + char *tstr = NULL, *ttstr = NULL; + struct nm_hdrtag *tag_list = NULL, *tmp; dprint(2, (debugfile, "nm: tags update requested (%s)\n", h->env->message_id)); @@ -604,15 +622,26 @@ static int update_header_tags(HEADER *h, notmuch_message_t *msg) notmuch_tags_move_to_next(tags)) { const char *t = notmuch_tags_get(tags); - size_t xsz = t ? strlen(t) : 0; const char *tt = NULL; - size_t txsz = 0; - if (!xsz) + if (!t || !*t) continue; + tt = hash_find(TagTransforms, t); + if (!tt) + tt = t; + + /* tags list contains all tags */ + tmp = safe_calloc(1, sizeof(*tmp)); + tmp->tag = safe_strdup(t); + tmp->transformed = safe_strdup(tt); + tmp->next = tag_list; + tag_list = tmp; + + /* filter out hidden tags */ if (NotmuchHiddenTags) { - p = strstr(NotmuchHiddenTags, t); + char *p = strstr(NotmuchHiddenTags, t); + size_t xsz = p ? strlen(t) : 0; if (p && (p == NotmuchHiddenTags || *(p - 1) == ',' @@ -623,40 +652,11 @@ static int update_header_tags(HEADER *h, notmuch_message_t *msg) continue; } - tt = hash_find(TagTransforms, t); - - if (tt) { - txsz = strlen(tt); - } else { - tt = t; - txsz = xsz; - } - /* expand the transformed tag string */ - safe_realloc(&ttstr, tsz + (tsz ? 1 : 0) + txsz + 1); - p = ttstr + tsz; - if (tsz) { - *p++ = ' '; - tsz++; - } - memcpy(p, tt, txsz + 1); - tsz += txsz; + append_str_item(&ttstr, tt); /* expand the un-transformed tag string */ - safe_realloc(&tstr, sz + (sz ? 1 : 0) + xsz + 1); - p = tstr + sz; - if (sz) { - *p++ = ' '; - sz++; - } - memcpy(p, t, xsz + 1); - sz += xsz; - - tmp = safe_calloc(1, sizeof(NM_HDR_TAG)); - tmp->tag = safe_strdup(t); - tmp->transformed = safe_strdup(tt); - tmp->next = tag_list; - tag_list = tmp; + append_str_item(&tstr, t); } if (data->tags && tstr && strcmp(data->tags, tstr) == 0) { @@ -667,14 +667,18 @@ static int update_header_tags(HEADER *h, notmuch_message_t *msg) return 1; } + /* free old version */ FREE(&data->tags); FREE(&data->tags_transformed); free_tag_list(&data->tag_list); + /* new version */ data->tags = tstr; dprint(2, (debugfile, "nm: new tags: '%s'\n", tstr)); + data->tags_transformed = ttstr; dprint(2, (debugfile, "nm: new tag transforms: '%s'\n", ttstr)); + data->tag_list = tag_list; return 0; } diff --git a/mutt_notmuch.h b/mutt_notmuch.h index 37657689d..64c52229e 100644 --- a/mutt_notmuch.h +++ b/mutt_notmuch.h @@ -10,8 +10,6 @@ int nm_check_database(CONTEXT * ctx, int *index_hint); char *nm_header_get_folder(HEADER *h); int nm_header_get_magic(HEADER *h); char *nm_header_get_fullpath(HEADER *h, char *buf, size_t bufsz); -char *nm_header_get_tags(HEADER *h); -char *nm_header_get_tags_transformed(HEADER *h); int nm_update_filename(CONTEXT *ctx, const char *o, const char *n, HEADER *h); char *nm_uri_from_query(CONTEXT *ctx, char *buf, size_t bufsz); int nm_modify_message_tags(CONTEXT *ctx, HEADER *hdr, char *tags); @@ -31,17 +29,8 @@ int nm_get_all_tags(CONTEXT *ctx, char **tag_list, int *tag_count); */ int nm_nonctx_get_count(char *path, int *all, int *new); -/* - * HEADER->(nm_hdrdata *)data->tag_list node - */ -typedef struct nm_hdr_tag -{ - char *tag; - char *transformed; - struct nm_hdr_tag *next; -} NM_HDR_TAG; - -NM_HDR_TAG *nm_header_get_tags_list(HEADER *h); char *nm_header_get_tag_transformed(char *tag, HEADER *h); +char *nm_header_get_tags_transformed(HEADER *h); +char *nm_header_get_tags(HEADER *h); #endif /* _MUTT_NOTMUCH_H_ */