unofficial mirror of meta@public-inbox.org
 help / color / mirror / Atom feed
* [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).