]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei q|up: fix saved searches for single-phrase search
authorEric Wong <e@80x24.org>
Mon, 8 Nov 2021 23:39:26 +0000 (23:39 +0000)
committerEric Wong <e@80x24.org>
Tue, 9 Nov 2021 00:43:36 +0000 (00:43 +0000)
`"' (double-quote) needs to be quoted for stdin searches.

We also need to differentiate between "lei q --stdin" usage
when calling "lei up", do it by setting an internal "rawstr"
knob to ensure we can parse the config properly regardless
of whether the initial search used --stdin or not.

lib/PublicInbox/LeiSavedSearch.pm
lib/PublicInbox/LeiUp.pm
t/lei-q-save.t

index b2f1ad1027d3a3a53a652b3abb65dc78df23c1b5..1d13aef6728a6a5ebcbcd942a93630f61872e1ed 100644 (file)
@@ -21,6 +21,7 @@ my %cquote = ("\n" => '\\n', "\t" => '\\t', "\b" => '\\b');
 sub cquote_val ($) { # cf. git-config(1)
        my ($val) = @_;
        $val =~ s/([\n\t\b])/$cquote{$1}/g;
+       $val =~ s/\"/\\\"/g;
        $val;
 }
 
@@ -162,6 +163,10 @@ EOM
                my $val = $lei->{opt}->{$k} // next;
                print $fh "\t$k = $val\n";
        }
+       $lei->{opt}->{stdin} and print $fh <<EOM;
+[lei "internal"]
+       rawstr = 1 # stdin was used initially
+EOM
        close($fh) or return $lei->fail("close $f: $!");
        $self->{lock_path} = "$self->{-f}.flock";
        $self->{-ovf} = "$dir/over.sqlite3";
index 66d950b2ac7b2a57a3e6c9c5afebef356b9d5471..d7873a3f34693211d6e492d16480163cd5fb02ea 100644 (file)
@@ -26,13 +26,15 @@ sub up1 ($$) {
        my $lss = PublicInbox::LeiSavedSearch->up($lei, $out) or return;
        my $f = $lss->{'-f'};
        my $mset_opt = $lei->{mset_opt} = { relevance => -2 };
-       my $q = $mset_opt->{q_raw} = $lss->{-cfg}->{'lei.q'} //
+       my $q = $lss->{-cfg}->get_all('lei.q') //
                                die("lei.q unset in $f (out=$out)\n");
        my $lse = $lei->{lse} // die 'BUG: {lse} missing';
-       if (ref($q)) {
-               $mset_opt->{qstr} = $lse->query_argv_to_string($lse->git, $q);
+       if ($lss->{-cfg}->{'lei.internal.rawstr'}) {
+               scalar(@$q) > 1 and
+                       die "$f: lei.q has multiple values (@$q) (out=$out)\n";
+               $lse->query_approxidate($lse->git, $mset_opt->{qstr} = $q->[0]);
        } else {
-               $lse->query_approxidate($lse->git, $mset_opt->{qstr} = $q);
+               $mset_opt->{qstr} = $lse->query_argv_to_string($lse->git, $q);
        }
        # n.b. only a few CLI args are accepted for "up", so //= usually sets
        for my $k ($lss->ARRAY_FIELDS) {
index cd35461ce1b7f1f880e1f307582a0832a72f4fb6..3d09fe37cd108c666d94347fd2e10e241147d810 100644 (file)
@@ -240,5 +240,46 @@ test_lei(sub {
        lei_ok qw(forget-search --prune);
        lei_ok qw(ls-search);
        unlike($lei_out, qr!\Q$home/after\E!, "`after' pruned");
+
+       my $d = "$home/d";
+       lei_ok [qw(import -q -F eml)], undef,
+               {0 => \"Subject: do not call\n\n"};
+       lei_ok qw(q -o), $d, 's:do not call';
+
+       my @orig = glob("$d/*/*");
+       is(scalar(@orig), 1, 'got one message via argv');
+       lei_ok [qw(import -q -Feml)], undef,
+               {0 => \"Subject: do not ever call\n\n"};
+       lei_ok 'up', $d;
+       is_deeply([glob("$d/*/*")], \@orig, 'nothing written');
+       lei_ok [qw(import -q -Feml)], undef,
+               {0 => \"Subject: do not call, ever\n\n"};
+       lei_ok 'up', $d;
+       @after = glob("$d/*/*");
+       is(scalar(@after), 2, '2 total, messages, now');
+       is_deeply([glob("$d/cur/*")], \@orig, 'cur untouched');
+       my @new = glob("$d/new/*");
+       is(scalar(@new), 1, "new message written to `new'");
+       is(eml_load($new[0])->header('Subject'), 'do not call, ever',
+               'up retrieved correct message');
+
+       $d = "$home/d-stdin";
+       lei_ok [ qw(q -q -o), $d ], undef, { 0 => \'s:"do not ever call"' };
+       @orig = glob("$d/*/*");
+       is(scalar(@orig), 1, 'got one message via stdin');
+
+       lei_ok [qw(import -q -Feml)], undef,
+               {0 => \"Subject: do not fall or ever call\n\n"};
+       lei_ok [qw(import -q -Feml)], undef,
+               {0 => \"Subject: do not ever call, again\n\n"};
+       lei_ok 'up', $d;
+       @new = glob("$d/new/*");
+       is(scalar(@new), 1, "new message written to `new'") or do {
+               for (@new) { diag "$_ ".eml_load($_)->header('Subject') }
+       };
+       is_deeply([glob("$d/cur/*")], \@orig, 'cur untouched');
+       is(eml_load($new[0])->header('Subject'), 'do not ever call, again',
+               'up retrieved correct message');
+
 });
 done_testing;