From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 29CDE1F8C2; Wed, 10 Feb 2021 09:59:26 +0000 (UTC) Date: Wed, 10 Feb 2021 08:59:26 -0100 From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] search: fix argv handling of quoted phrases Message-ID: <20210210095926.GA12727@dcvr> References: <20210208090521.28909-1-e@80x24.org> <20210208090521.28909-12-e@80x24.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20210208090521.28909-12-e@80x24.org> List-Id: 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") --- lib/PublicInbox/Search.pm | 4 +++- t/search.t | 11 +++++++++-- 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');