- Xapian::TermIterator i, end;
- notmuch_string_list_t *tags;
- i = message->doc.termlist_begin();
- end = message->doc.termlist_end();
- tags = _notmuch_database_get_terms_with_prefix (message, i, end,
- _find_prefix ("tag"));
- _notmuch_string_list_sort (tags);
- return _notmuch_tags_create (message, tags);
+ notmuch_tags_t *tags;
+
+ if (!message->tag_list)
+ _notmuch_message_ensure_metadata (message);
+
+ tags = _notmuch_tags_create (message, message->tag_list);
+ /* _notmuch_tags_create steals the reference to the tag_list, but
+ * in this case it's still used by the message, so we add an
+ * *additional* talloc reference to the list. As a result, it's
+ * possible to modify the message tags (which talloc_unlink's the
+ * current list from the message) while still iterating because
+ * the iterator will keep the current list alive. */
+ talloc_reference (message, message->tag_list);
+ return tags;