It can be useful to manipulate tags on an entire thread instead of just
a single message.  For example:

  # Mark entire thread unread
  notmuch-mutt tag --whole-thread -- -unread < MAIL

Add the --whole-thread flag which first looks up the thread for a given
message and then applies the tag action on the entire thread.

Signed-off-by: Stefan Hajnoczi <stefanha at gmail.com>
---
Warning: I don't really know Perl :)

It would be nice if notmuch's query syntax could match threads.  Then
core notmuch CLI could perform this operation in a single command:

  # Mark entire thread unread given a single Message-ID
  notmuch tag thread-contains(id:1234 at foo.com) -- -unread

Since the core cannot do this query today this patch bolts it on top for
"notmuch-mutt tag".

 contrib/notmuch-mutt/notmuch-mutt | 38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/contrib/notmuch-mutt/notmuch-mutt 
b/contrib/notmuch-mutt/notmuch-mutt
index d14709d..8529940 100755
--- a/contrib/notmuch-mutt/notmuch-mutt
+++ b/contrib/notmuch-mutt/notmuch-mutt
@@ -125,6 +125,14 @@ sub get_message_id() {
     return $1;
 }

+sub get_thread_id($) {
+    my ($mid) = @_;
+    my $search_cmd = 'notmuch search --output=threads '
+                    . shell_quote("id:$mid");
+    `$search_cmd` =~ /^thread:(.*)$/;
+    return $1;
+}
+
 sub search_action($$$@) {
     my ($interactive, $results_dir, $remove_dups, @params) = @_;

@@ -141,20 +149,26 @@ sub search_action($$$@) {
 sub thread_action($$@) {
     my ($results_dir, $remove_dups, @params) = @_;

-    my $mid = get_message_id();
-    my $search_cmd = 'notmuch search --output=threads ' . 
shell_quote("id:$mid");
-    my $tid = `$search_cmd`;   # get thread id
-    chomp($tid);
+    my $tid = get_thread_id(get_message_id());

-    search($results_dir, $remove_dups, $tid);
+    search($results_dir, $remove_dups, "thread:$tid");
 }

-sub tag_action(@) {
+sub tag_action($@) {
+    my ($whole_thread, @params) = @_;
     my $mid = get_message_id();

-    system("notmuch tag "
-          . shell_quote(join(' ', @_))
-          . " id:$mid");
+    if ($whole_thread) {
+       my $tid = get_thread_id($mid);
+
+       system("notmuch tag "
+               . shell_quote(join(' ', @params))
+               . " thread:$tid");
+    } else {
+       system("notmuch tag "
+               . shell_quote(join(' ', @params))
+               . " id:$mid");
+    }
 }

 sub die_usage() {
@@ -170,12 +184,14 @@ sub main() {
     my $interactive = 0;
     my $help_needed = 0;
     my $remove_dups = 0;
+    my $whole_thread = 0;

     my $getopt = GetOptions(
        "h|help" => \$help_needed,
        "o|output-dir=s" => \$results_dir,
        "p|prompt" => \$interactive,
-       "r|remove-dups" => \$remove_dups);
+       "r|remove-dups" => \$remove_dups,
+       "w|whole-thread" => \$whole_thread);
     if (! $getopt || $#ARGV < 0) { die_usage() };
     my ($action, @params) = ($ARGV[0], @ARGV[1..$#ARGV]);

@@ -193,7 +209,7 @@ sub main() {
     } elsif ($action eq "thread") {
        thread_action($results_dir, $remove_dups, @params);
     } elsif ($action eq "tag") {
-       tag_action(@params);
+       tag_action($whole_thread, @params);
     } else {
        die_usage();
     }
-- 
1.7.11.4

Reply via email to