aboutsummaryrefslogtreecommitdiffstats
path: root/src/notmuchworker.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/notmuchworker.h')
-rw-r--r--src/notmuchworker.h38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/notmuchworker.h b/src/notmuchworker.h
index fa223e6..a175d7a 100644
--- a/src/notmuchworker.h
+++ b/src/notmuchworker.h
@@ -232,14 +232,24 @@ public slots:
const QStringList &remove,
const QString &description);
- /// Applies `+add -remove` to every message the change would move within
- /// `query` (item 212, a rule applied to existing mail). The query is
- /// narrowed with SearchTerm::changes() so already-correct messages are
- /// never written, then the ids go through applyTags(), which reports the
- /// effective set for undo. Emits nothing when nothing would change.
- void applyTagsToQuery(const QString &query, const QStringList &add,
- const QStringList &remove,
- const QString &description);
+ /// Applies a tagging rule to existing mail (item 212). Resolves the
+ /// messages the WHOLE rule would move once, with SearchTerm::changes(),
+ /// then writes one tag at a time over that fixed list: `+a` for each add,
+ /// `-r` for each remove.
+ ///
+ /// One write per tag because the effective set is per MESSAGE: a single
+ /// `+promo -inbox` write reports a message that already had promo (it lost
+ /// inbox), and the undo built from it would strip promo. One resolution
+ /// because a query may name a tag the rule removes, and re-resolving after
+ /// the first write would match nothing for the rest, writing half the
+ /// rule where the hook writes all of it.
+ ///
+ /// Answers with ruleApplied() ALWAYS, even when nothing moved, and never
+ /// with tagsApplied(): the window builds the undo from the answer rather
+ /// than from the shared confirmation queue.
+ void applyRule(const QString &query, const QStringList &add,
+ const QStringList &remove, const QString &description,
+ quint64 token);
/// Resolves whole threads to the message ids and file paths they contain.
///
@@ -386,6 +396,13 @@ signals:
void threadDigestLoaded(const ThreadDigest &digest, quint64 generation);
void tagsApplied(const TagChange &change);
+ /// applyRule()'s answer: one TagChange per single-tag operation, in the
+ /// order applyRule() documents, each carrying the ids that operation
+ /// actually moved (possibly none). `token` is echoed from the request.
+ /// Emitted even after a write error, carrying what was written before it,
+ /// so the window can still offer undo for that part.
+ void ruleApplied(quint64 token, const QVector<TagChange> &changes);
+
/// One file entered or left the index outside a query (item 192).
///
/// Emitted by indexDraftFile() and removeIndexedFile(), the two entry
@@ -483,6 +500,11 @@ private:
bool openReadOnly();
void close();
+ /// applyTags() without the signal: writes `change` and fills `changedIds`
+ /// with the messages whose tags really moved. False, with errorOccurred()
+ /// emitted, when the database could not be opened for writing.
+ bool writeTags(const TagChange &change, QStringList *changedIds);
+
QByteArray configPathArg() const;
QString m_configPath;