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-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF 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 C2A231F910 for ; Tue, 1 Nov 2022 09:36:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1667295372; bh=TFF8qy3SLJxvp+aAjiCdqgodk9glXrFjU5mvf5l4teg=; h=From:To:Subject:Date:From; b=YlcYj1Km20yHjabE96bHlgPslXrdg5D4H0Gq2KYJAwtGwsiDhJ0rikjjGDLDM+v8q 2uOPe3UlFdz+VcqUmOV0QjDQw7cLon/mv61vhESTY+oUXr8ESs3v9LERHgB9bERwCR CHx41vICXZozlRaN46D/Y0h4J4IoEER+ggVT+Rrc= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] lei: fix globbing semantics to match end-of-filename Date: Tue, 1 Nov 2022 09:36:12 +0000 Message-Id: <20221101093612.2195043-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Globs such as `*/foo' should not match `*/foobar'. I noticed this while adding glob support to public-inbox-clone. This may subtly break some existing cases, but there aren't many lei users, yet, and globbing semantics should match what most other glob-using programs, do... We'll also make `lei ls-mail-sync' behave more consistently with `lei ls-external', as far as the basename matching fallback goes. --- lib/PublicInbox/LeiExternal.pm | 4 ++-- lib/PublicInbox/LeiLsExternal.pm | 1 + lib/PublicInbox/LeiLsMailSync.pm | 7 +++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/LeiExternal.pm b/lib/PublicInbox/LeiExternal.pm index 30bb1a45..a6562e7f 100644 --- a/lib/PublicInbox/LeiExternal.pm +++ b/lib/PublicInbox/LeiExternal.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2020-2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # *-external commands of lei @@ -88,7 +88,7 @@ sub get_externals { my @cur = externals_each($self); my $do_glob = !$self->{opt}->{globoff}; # glob by default if ($do_glob && (my $re = glob2re($loc))) { - @m = grep(m!$re!, @cur); + @m = grep(m!$re/?\z!, @cur); return @m if scalar(@m); } elsif (index($loc, '/') < 0) { # exact basename match: @m = grep(m!/\Q$loc\E/?\z!, @cur); diff --git a/lib/PublicInbox/LeiLsExternal.pm b/lib/PublicInbox/LeiLsExternal.pm index dd2eb2e7..e624cbd4 100644 --- a/lib/PublicInbox/LeiLsExternal.pm +++ b/lib/PublicInbox/LeiLsExternal.pm @@ -13,6 +13,7 @@ sub lei_ls_external { my ($OFS, $ORS) = $lei->{opt}->{z} ? ("\0", "\0\0") : (" ", "\n"); $filter //= '*'; my $re = $do_glob ? $lei->glob2re($filter) : undef; + $re .= '/?\\z' if defined $re; $re //= index($filter, '/') < 0 ? qr!/\Q$filter\E/?\z! : # exact basename match qr/\Q$filter\E/; # grep -F semantics diff --git a/lib/PublicInbox/LeiLsMailSync.pm b/lib/PublicInbox/LeiLsMailSync.pm index 2b167b1d..8da0c284 100644 --- a/lib/PublicInbox/LeiLsMailSync.pm +++ b/lib/PublicInbox/LeiLsMailSync.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # front-end for the "lei ls-mail-sync" sub-command @@ -12,7 +12,10 @@ sub lei_ls_mail_sync { my $lms = $lei->lms or return; my $opt = $lei->{opt}; my $re = $opt->{globoff} ? undef : $lei->glob2re($filter // '*'); - $re //= qr/\Q$filter\E/; + $re .= '/?\\z' if defined $re; + $re //= index($filter, '/') < 0 ? + qr!/\Q$filter\E/?\z! : # exact basename match + qr/\Q$filter\E/; # grep -F semantics my @f = $lms->folders; @f = $opt->{'invert-match'} ? grep(!/$re/, @f) : grep(/$re/, @f); if ($opt->{'local'} && !$opt->{remote}) {