aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/notmuchworker.cpp22
-rw-r--r--src/notmuchworker.h9
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