about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-08-11 11:26:17 +0000
committerEric Wong <e@80x24.org>2021-08-11 21:50:08 +0000
commitd15e80db44399867d8ca53528e38f70f54562b88 (patch)
tree40e1f4d12f3ca6a88b9e149ad4f85c6e9884ee8a
parent4c6f9a39621fdae852e0655b7db3d61f03c716c5 (diff)
downloadpublic-inbox-d15e80db44399867d8ca53528e38f70f54562b88.tar.gz
Storing relative paths with '..' in them can be expensive to
resolve when running 'lei up', so prefer storing canonicalized
absolute paths.  We only do this for paths with '..' in them,
though, since this can lose symlink info.
-rw-r--r--lib/PublicInbox/LeiSavedSearch.pm9
-rw-r--r--t/lei-q-save.t9
2 files changed, 17 insertions, 1 deletions
diff --git a/lib/PublicInbox/LeiSavedSearch.pm b/lib/PublicInbox/LeiSavedSearch.pm
index cfbf68c3..2a0e9321 100644
--- a/lib/PublicInbox/LeiSavedSearch.pm
+++ b/lib/PublicInbox/LeiSavedSearch.pm
@@ -115,9 +115,16 @@ sub up { # updating existing saved search via "lei up"
 sub new { # new saved search "lei q --save"
         my ($cls, $lei) = @_;
         my $self = bless { ale => $lei->ale }, $cls;
+        require File::Path;
         my $dst = $lei->{ovv}->{dst};
+
+        # canonicalize away relative paths into the config
+        if ($lei->{ovv}->{fmt} eq 'maildir' &&
+                        $dst =~ m!(?:/*|\A)\.\.(?:/*|\z)! && !-d $dst) {
+                File::Path::make_path($dst);
+                $lei->{ovv}->{dst} = $dst = $lei->abs_path($dst);
+        }
         my $dir = lss_dir_for($lei, \$dst);
-        require File::Path;
         File::Path::make_path($dir); # raises on error
         $self->{-cfg} = {};
         my $f = $self->{'-f'} = "$dir/lei.saved-search";
diff --git a/t/lei-q-save.t b/t/lei-q-save.t
index b1ca4e92..eada2dd4 100644
--- a/t/lei-q-save.t
+++ b/t/lei-q-save.t
@@ -202,5 +202,14 @@ test_lei(sub {
 
         lei_ok([qw(edit-search), $v2s], { VISUAL => 'cat', EDITOR => 'cat' });
         like($lei_out, qr/^\[lei/sm, 'edit-search can cat');
+
+        lei_ok('-C', "$home/v2s",
+                qw(q -q --save -o ../s m:testmessage@example.com));
+        lei_ok qw(ls-search);
+        unlike $lei_out, qr{/\.\./s$}sm, 'relative path not in ls-search';
+        like $lei_out, qr{^\Q$home\E/s$}sm,
+                'absolute path appears in ls-search';
+        lei_ok qw(up ../s -C), "$home/v2s", \'relative lei up';
+        lei_ok qw(up), "$home/s", \'absolute lei up';
 });
 done_testing;