about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-02-10 08:59:26 -0100
committerEric Wong <e@80x24.org>2021-02-10 19:21:47 +0000
commitefae1c2f67220c18f57bd1ebdf7115abd4d6c6e0 (patch)
tree0123b9c732525e40e199d2fdfb558d9ef2fcab33
parent9eb840de546dfe9b6c6aa1588f5bb8c0153c7d71 (diff)
downloadpublic-inbox-efae1c2f67220c18f57bd1ebdf7115abd4d6c6e0.tar.gz
This fixes both an old bug in "lei q" argv handling and one
recent regression introduced with the change to use approxidate.

Field prefixes are also handled correctly inside parenthesized
statements when the field follows "(" without a separation
character.

Fixes: fbb7ccabbf54a405 ("lei q: use git approxidate with d:, dt: and rt: ranges")
-rw-r--r--lib/PublicInbox/Search.pm4
-rw-r--r--t/search.t11
2 files changed, 12 insertions, 3 deletions
diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm
index 76a270bc..b3fd532d 100644
--- a/lib/PublicInbox/Search.pm
+++ b/lib/PublicInbox/Search.pm
@@ -330,8 +330,10 @@ sub query_argv_to_string {
                 if (s!\b(d|rt|dt):([[:print:]]+)\z!date_parse_prepare(
                                                 $to_parse //= [], $1, $2)!sge) {
                         $_;
+                } elsif (/\s/) {
+                        s/(.*?)\b(\w+:)// ? qq{$1$2"$_"} : qq{"$_"};
                 } else {
-                        /\s/ ? (s/\A(\w+:)// ? qq{$1"$_"} : qq{"$_}) : $_
+                        $_
                 }
         } @$argv);
         # git-rev-parse can handle any number of args up to system
diff --git a/t/search.t b/t/search.t
index 36a8fb30..bcfe91f5 100644
--- a/t/search.t
+++ b/t/search.t
@@ -536,13 +536,20 @@ $ibx->with_umask(sub {
 });
 
 SKIP: {
+        my ($s, $g) = ($ibx->search, $ibx->git);
+        my $q = $s->query_argv_to_string($g, ["quoted phrase"]);
+        is($q, q["quoted phrase"], 'quoted phrase');
+        $q = $s->query_argv_to_string($g, ['s:pa ce']);
+        is($q, q[s:"pa ce"], 'space with prefix');
+        $q = $s->query_argv_to_string($g, ["\(s:pa ce", "AND", "foo\)"]);
+        is($q, q[(s:"pa ce" AND foo)], 'space AND foo');
+
         local $ENV{TZ} = 'UTC';
         my $now = strftime('%H:%M:%S', gmtime(time));
         if ($now =~ /\A23:(?:59|60)/ || $now =~ /\A00:00:0[01]\z/) {
                 skip 'too close to midnight, time is tricky', 6;
         }
-        my ($s, $g) = ($ibx->search, $ibx->git);
-        my $q = $s->query_argv_to_string($g, [qw(d:20101002 blah)]);
+        $q = $s->query_argv_to_string($g, [qw(d:20101002 blah)]);
         is($q, 'd:20101002..20101003 blah', 'YYYYMMDD expanded to range');
         $q = $s->query_argv_to_string($g, [qw(d:2010-10-02)]);
         is($q, 'd:20101002..20101003', 'YYYY-MM-DD expanded to range');