From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 187BD1F4C1 for ; Sun, 10 Nov 2024 20:43:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1731271407; bh=vaIAtHfrtK85uBMliCv+JHuu1/XyoZ7YfEdW4fFjAbw=; h=From:To:Subject:Date:From; b=uI36xu4eAJEasVEcAbnE0Y1mHWZFA0dB0XI3ePqEeNY4lWjlmmRBAnchRBZqXvJPI p3CsjCYFauYVLNluxpdQ9PZeY0W16Ig1OluBamCCUJkLDNwSqCfHoxmMUP/hs/+YB7 V0sTsXO7xi2D8dNYgHl+kjHU3G8O3ccPrMz2fmDs= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] lei: show searches prefixed with `.' Date: Sun, 10 Nov 2024 20:43:26 +0000 Message-ID: <20241110204326.22684-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Sometimes, a user will use an output with a basename which starts with a `.'. glob("*") won't list files prefixed with `.' by default and glob(".* *") requires iterating twice on my system. So just rely on Perl regexps instead of glob to get the directory listing done in a single pass. We can improve error detection with autodie for opendir, as well. --- lib/PublicInbox/LeiSavedSearch.pm | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/PublicInbox/LeiSavedSearch.pm b/lib/PublicInbox/LeiSavedSearch.pm index c27b6f86..ab0a2858 100644 --- a/lib/PublicInbox/LeiSavedSearch.pm +++ b/lib/PublicInbox/LeiSavedSearch.pm @@ -4,6 +4,7 @@ # pretends to be like LeiDedupe and also PublicInbox::Inbox package PublicInbox::LeiSavedSearch; use v5.12; +use autodie qw(opendir); use parent qw(PublicInbox::Lock); use PublicInbox::Git qw(git_exe); use PublicInbox::OverIdx; @@ -57,16 +58,18 @@ sub lss_dir_for ($$;$) { my @cur = stat(_); my $want = pack('dd', @cur[1,0]); # st_ino + st_dev my ($c, $o, @st); - for my $g ("$pfx-*", '*') { - my @maybe = glob("$lss_dir$g/lei.saved-search"); - for my $f (@maybe) { - $c = $lei->cfg_dump($f) // next; - $o = $c->{'lei.q.output'} // next; - $o =~ s!$LOCAL_PFX!! or next; - @st = stat($o) or next; - next if pack('dd', @st[1,0]) ne $want; - $f =~ m!\A(.+?)/[^/]+\z! and return $1; - } + opendir(my $dh, $lss_dir); + my @d = sort(grep(!/\A\.\.?\z/, readdir($dh))); + my $re = qr/\A\Q$pfx\E-\./; + for my $d (grep(/$re/, @d), grep(!/$re/, @d)) { + my $f = "$lss_dir/$d/lei.saved-search"; + -f $f // next; + $c = $lei->cfg_dump($f) // next; + $o = $c->{'lei.q.output'} // next; + $o =~ s!$LOCAL_PFX!! or next; + @st = stat($o) or next; + next if pack('dd', @st[1,0]) ne $want; + $f =~ m!\A(.+?)/[^/]+\z! and return $1; } } $d; @@ -80,8 +83,11 @@ sub list { my $fh = File::Temp->new(TEMPLATE => 'lss_list-XXXX', TMPDIR => 1) or die "File::Temp->new: $!"; print $fh "[include]\n"; - for my $p (glob("$lss_dir/*/lei.saved-search")) { - print $fh "\tpath = ", cquote_val($p), "\n"; + opendir(my $dh, $lss_dir); + for my $d (sort(grep(!/\A\.\.?\z/, readdir($dh)))) { + next if $d eq '.' || $d eq '..'; + my $p = "$lss_dir/$d/lei.saved-search"; + say $fh "\tpath = ", cquote_val($p) if -f $p; } $fh->flush or die "flush: $fh"; my $cfg = $lei->cfg_dump($fh->filename);