diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/notmuchworker.cpp | 22 | ||||
| -rw-r--r-- | src/notmuchworker.h | 9 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/notmuchworker.cpp b/src/notmuchworker.cpp index 2588f4e..d41b54b 100644 --- a/src/notmuchworker.cpp +++ b/src/notmuchworker.cpp @@ -41,6 +41,7 @@ #include "maildirname.h" #include "mimeparser.h" #include "nmraii.h" +#include "searchterm.h" namespace { @@ -1082,6 +1083,27 @@ void NotmuchWorker::applyTagsToThreads(const QStringList &threadIds, applyTags(TagChange{ messageIds, add, remove, description }); } +void NotmuchWorker::applyTagsToQuery(const QString &query, + const QStringList &add, + const QStringList &remove, + const QString &description) +{ + if (!openReadOnly()) + return; + + QStringList messageIds; + if (!collectMessageIds(m_db, SearchTerm::changes(query, add, remove), + &messageIds)) { + emit errorOccurred(QStringLiteral("Cannot resolve the rule's query")); + return; + } + + // Empty is not an error: the rule has nothing left to do. applyTags() + // returns at once on an empty list, and stays silent, as it must + // (CLAUDE.md, item 176). + applyTags(TagChange{ messageIds, add, remove, description }); +} + void NotmuchWorker::applyTags(const TagChange &change) { if (change.messageIds.isEmpty()) diff --git a/src/notmuchworker.h b/src/notmuchworker.h index ad5f616..fa223e6 100644 --- a/src/notmuchworker.h +++ b/src/notmuchworker.h @@ -232,6 +232,15 @@ 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); + /// Resolves whole threads to the message ids and file paths they contain. /// /// Delete thread MOVES every message, and a move needs message ids, which |
