about summary refs log tree commit homepage
diff options
context:
space:
mode:
-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;