* [PATCH] lei q|up: fix saved searches for single-phrase search
@ 2021-11-08 23:39 Eric Wong
0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2021-11-08 23:39 UTC (permalink / raw)
To: meta
`"' (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 | 5 ++++
lib/PublicInbox/LeiUp.pm | 10 +++++---
t/lei-q-save.t | 41 +++++++++++++++++++++++++++++++
3 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/lib/PublicInbox/LeiSavedSearch.pm b/lib/PublicInbox/LeiSavedSearch.pm
index b2f1ad10..1d13aef6 100644
--- a/lib/PublicInbox/LeiSavedSearch.pm
+++ b/lib/PublicInbox/LeiSavedSearch.pm
@@ -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";
diff --git a/lib/PublicInbox/LeiUp.pm b/lib/PublicInbox/LeiUp.pm
index 66d950b2..d7873a3f 100644
--- a/lib/PublicInbox/LeiUp.pm
+++ b/lib/PublicInbox/LeiUp.pm
@@ -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) {
diff --git a/t/lei-q-save.t b/t/lei-q-save.t
index cd35461c..3d09fe37 100644
--- a/t/lei-q-save.t
+++ b/t/lei-q-save.t
@@ -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;
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2021-11-08 23:39 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-08 23:39 [PATCH] lei q|up: fix saved searches for single-phrase search Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).