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@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@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