user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: meta@public-inbox.org
Subject: [PATCH] lei q|up: fix saved searches for single-phrase search
Date: Mon,  8 Nov 2021 23:39:26 +0000	[thread overview]
Message-ID: <20211108233926.24646-1-e@80x24.org> (raw)

`"' (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;

                 reply	other threads:[~2021-11-08 23:39 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://public-inbox.org/README

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211108233926.24646-1-e@80x24.org \
    --to=e@80x24.org \
    --cc=meta@public-inbox.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/public-inbox.git

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).