]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
lei: show searches prefixed with `.'
authorEric Wong <e@80x24.org>
Sun, 10 Nov 2024 20:43:26 +0000 (20:43 +0000)
committerEric Wong <e@80x24.org>
Mon, 11 Nov 2024 08:03:28 +0000 (08:03 +0000)
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

index c27b6f8654fecaaec8f0d2b4c56276a3f10ab754..ab0a285878738e34f4a6e09ffaa5a60af0b4360a 100644 (file)
@@ -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);