* [PATCH] lei: show searches prefixed with `.'
@ 2024-11-10 20:43 Eric Wong
0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2024-11-10 20:43 UTC (permalink / raw)
To: meta
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);
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2024-11-10 20:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-10 20:43 [PATCH] lei: show searches prefixed with `.' Eric Wong
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).