aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2023-09-18 06:16:47 -0300
committerDavid Bremner <david@tethera.net>2023-09-18 06:16:47 -0300
commit1129cf890ef812321ac8296a4ca964a796df0b87 (patch)
treeffe0b3a98a7210c292d94d3ae6c9ebbed70fd4a5 /contrib
parent12aa05f07cb8aae736895c46fb25e0106daf207c (diff)
parentd4e0aaa76bd9e7a9e36abf47dc9ad3ea8bc10334 (diff)
Merge remote-tracking branch 'origin/master' into nmwebnmweb
Diffstat (limited to 'contrib')
-rw-r--r--contrib/notmuch-mutt/README2
-rwxr-xr-xcontrib/notmuch-mutt/notmuch-mutt69
2 files changed, 58 insertions, 13 deletions
diff --git a/contrib/notmuch-mutt/README b/contrib/notmuch-mutt/README
index 26996c4a..c7520228 100644
--- a/contrib/notmuch-mutt/README
+++ b/contrib/notmuch-mutt/README
@@ -39,8 +39,6 @@ To *run* notmuch-mutt you will need Perl with the following libraries:
(Debian package: libmail-box-perl)
- Mail::Header <https://metacpan.org/pod/Mail::Header>
(Debian package: libmailtools-perl)
-- String::ShellQuote <https://metacpan.org/pod/String::ShellQuote>
- (Debian package: libstring-shellquote-perl)
- Term::ReadLine::Gnu <https://metacpan.org/pod/Term::ReadLine::Gnu>
(Debian package: libterm-readline-gnu-perl)
diff --git a/contrib/notmuch-mutt/notmuch-mutt b/contrib/notmuch-mutt/notmuch-mutt
index d1e2c084..1ac68065 100755
--- a/contrib/notmuch-mutt/notmuch-mutt
+++ b/contrib/notmuch-mutt/notmuch-mutt
@@ -2,7 +2,7 @@
#
# 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.
@@ -13,11 +13,11 @@ use warnings;
use File::Path;
use File::Basename;
+use File::Find;
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;
@@ -26,9 +26,53 @@ my $xdg_cache_dir = "$ENV{HOME}/.cache";
$xdg_cache_dir = $ENV{XDG_CACHE_HOME} if $ENV{XDG_CACHE_HOME};
my $cache_dir = "$xdg_cache_dir/notmuch/mutt";
+sub die_dir($$) {
+ my ($maildir, $error) = @_;
+ die "notmuch-mutt: search cache maildir $maildir $error\n".
+ "Please ensure that the notmuch-mutt search cache Maildir\n".
+ "contains no subfolders or real mail data, only symlinks to mail\n";
+}
+
+sub die_subdir($$$) {
+ my ($maildir, $subdir, $error) = @_;
+ die_dir($maildir, "subdir $subdir $error");
+}
-# create an empty maildir (if missing) or empty an existing maildir"
-sub empty_maildir($) {
+# check that the search cache maildir is that and not a real maildir
+# otherwise there could be data loss when the search cache is emptied
+sub check_search_cache_maildir($) {
+ my ($maildir) = (@_);
+
+ return unless -e $maildir;
+
+ -d $maildir or die_dir($maildir, 'is not a directory');
+
+ opendir(my $mdh, $maildir) or die_dir($maildir, "cannot be opened: $!");
+ my @contents = grep { !/^\.\.?$/ } readdir $mdh;
+ closedir $mdh;
+
+ my @required = ('cur', 'new', 'tmp');
+ foreach my $d (@required) {
+ -l "$maildir/$d" and die_dir($maildir, "contains symlink $d");
+ -e "$maildir/$d" or die_subdir($maildir, $d, 'is missing');
+ -d "$maildir/$d" or die_subdir($maildir, $d, 'is not a directory');
+ find(sub {
+ $_ eq '.' and return;
+ $_ eq '..' and return;
+ -l $_ or die_subdir($maildir, $d, "contains non-symlink $_");
+ }, "$maildir/$d");
+ }
+
+ my %required = map { $_ => 1 } @required;
+ foreach my $d (@contents) {
+ -l "$maildir/$d" and die_dir( $maildir, "contains symlink $d");
+ -d "$maildir/$d" or die_dir( $maildir, "contains non-directory $d");
+ exists($required[$d]) or die_dir( $maildir, "contains directory $d");
+ }
+}
+
+# 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,
@@ -46,7 +90,8 @@ sub search($$$) {
push @args, "--duplicate=1" if $remove_dups;
push @args, $query;
- empty_maildir($maildir);
+ check_search_cache_maildir($maildir);
+ empty_search_cache_maildir($maildir);
open my $pipe, '-|', @args or die "Running @args failed: $!\n";
while (<$pipe>) {
chomp;
@@ -121,21 +166,23 @@ sub thread_action($$@) {
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() {