[PATCH] notmuch-mutt: add --whole-thread flag

Stefan Hajnoczi stefanha at gmail.com
Tue Oct 9 12:48:26 PDT 2012


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



More information about the notmuch mailing list