#
# notmuch-mutt - notmuch (of a) helper for Mutt
#
-# Copyright: © 2011-2015 Stefano Zacchiroli <zack@upsilon.cc>
+# Copyright: © 2011-2015 Stefano Zacchiroli <zack@upsilon.cc>
# License: GNU General Public License (GPL), version 3 or above
#
# See the bottom of this file for more documentation.
use warnings;
use File::Path;
+use File::Basename;
use Getopt::Long qw(:config no_getopt_compat);
use Mail::Header;
use Mail::Box::Maildir;
use Pod::Usage;
-use String::ShellQuote;
use Term::ReadLine;
use Digest::SHA;
my $cache_dir = "$xdg_cache_dir/notmuch/mutt";
-# create an empty maildir (if missing) or empty an existing maildir"
-sub empty_maildir($) {
+# create an empty search cache maildir (if missing) or empty existing one
+sub empty_search_cache_maildir($) {
my ($maildir) = (@_);
rmtree($maildir) if (-d $maildir);
my $folder = new Mail::Box::Maildir(folder => $maildir,
my ($maildir, $remove_dups, $query) = @_;
my $dup_option = "";
- $query = shell_quote($query);
+ my @args = qw/notmuch search --output=files/;
+ push @args, "--duplicate=1" if $remove_dups;
+ push @args, $query;
- if ($remove_dups) {
- $dup_option = "--duplicate=1";
+ empty_search_cache_maildir($maildir);
+ open my $pipe, '-|', @args or die "Running @args failed: $!\n";
+ while (<$pipe>) {
+ chomp;
+ my $ln = "$maildir/cur/" . basename $_;
+ symlink $_, "$ln" or warn "Failed to symlink '$_', '$ln': $!\n";
}
-
- empty_maildir($maildir);
- system("notmuch search --output=files $dup_option $query"
- . " | sed -e 's: :\\\\ :g'"
- . " | xargs -r -I searchoutput ln -s searchoutput $maildir/cur/");
}
sub prompt($$) {
my $mid = get_message_id();
if (! defined $mid) {
- empty_maildir($results_dir);
die "notmuch-mutt: cannot find Message-Id, abort.\n";
}
- my $search_cmd = 'notmuch search --output=threads ' . shell_quote("id:$mid");
- my $tid = `$search_cmd`; # get thread id
- chomp($tid);
- search($results_dir, $remove_dups, $tid);
+ $mid =~ s/ //g; # notmuch strips spaces before storing Message-Id
+ $mid =~ s/"/""""/g; # escape all double quote characters twice
+
+ search($results_dir, $remove_dups, qq{thread:"{id:""$mid""}"});
}
sub tag_action(@) {
my $mid = get_message_id();
defined $mid or die "notmuch-mutt: cannot find Message-Id, abort.\n";
- system("notmuch", "tag", @_, "--", "id:$mid");
+ $mid =~ s/ //g; # notmuch strips spaces before storing Message-Id
+ $mid =~ s/"/""/g; # escape all double quote characters
+
+ system("notmuch", "tag", @_, "--", qq{id:"$mid"});
}
sub die_usage() {