unofficial mirror of meta@public-inbox.org
 help / color / mirror / Atom feed
* [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).