about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2024-01-16 11:52:55 +0000
committerEric Wong <e@80x24.org>2024-01-17 09:37:55 +0000
commit65690a33c5a527d5f3fef9320899eb9f4e1d25c8 (patch)
treee3094c2915f1de6fcfed78f650b526fb326292ce
parentd99942aa64d7da35847999808f99a068ad25213c (diff)
downloadpublic-inbox-65690a33c5a527d5f3fef9320899eb9f4e1d25c8.tar.gz
This can make it easier to find deeply-nested repositories on my
mirror of git.kernel.org.  It's not perfect, since projects like
Linux use several completely different basenames (e.g. linux.git
vs vfs.git vs net.git), but it can still help find significant
matches further up a tree.

I don't expect glob characters to conflict with actual git
repositories used by reasonable people, but direct (non-glob)
hits are still tried first.
-rw-r--r--lib/PublicInbox/RepoList.pm4
-rw-r--r--lib/PublicInbox/WwwCoderepo.pm6
2 files changed, 7 insertions, 3 deletions
diff --git a/lib/PublicInbox/RepoList.pm b/lib/PublicInbox/RepoList.pm
index 4b313ed6..39dc9c0b 100644
--- a/lib/PublicInbox/RepoList.pm
+++ b/lib/PublicInbox/RepoList.pm
@@ -16,9 +16,9 @@ sub html_top_fallback { # WwwStream->html_repo_top
 }
 
 sub html ($$$) {
-        my ($wcr, $ctx, $pfx) = @_;
+        my ($wcr, $ctx, $re) = @_;
         my $cr = $wcr->{pi_cfg}->{-coderepos};
-        my @nicks = grep(m!\A\Q$pfx\E/!, keys %$cr) or return; # 404
+        my @nicks = grep(m!$re!, keys %$cr) or return; # 404
         __PACKAGE__->html_init($ctx);
         my $zfh = $ctx->zfh;
         print $zfh "<pre>matching coderepos\n";
diff --git a/lib/PublicInbox/WwwCoderepo.pm b/lib/PublicInbox/WwwCoderepo.pm
index 4ab9a77c..61aa7862 100644
--- a/lib/PublicInbox/WwwCoderepo.pm
+++ b/lib/PublicInbox/WwwCoderepo.pm
@@ -356,8 +356,12 @@ sub srv { # endpoint called by PublicInbox::WWW
         } elsif ($path_info =~ m!\A/(.+?)/(refs/(?:heads|tags))/\z! and
                         ($ctx->{git} = $pi_cfg->get_coderepo($1))) {
                 refs_foo($self, $ctx, $2);
+        } elsif ($path_info =~ m!\A/(.*?\*.*?)/*\z!) {
+                my $re = PublicInbox::Config::glob2re($1);
+                PublicInbox::RepoList::html($self, $ctx, qr!$re\z!) // r(404);
         } elsif ($path_info =~ m!\A/(.+?)/\z!) {
-                PublicInbox::RepoList::html($self, $ctx, $1) // r(404);
+                my $re = qr!\A\Q$1\E/!;
+                PublicInbox::RepoList::html($self, $ctx, $re) // r(404);
         } elsif ($path_info =~ m!\A/(.+?)\z! and
                         ($git = $pi_cfg->get_coderepo($1))) {
                 my $qs = $ctx->{env}->{QUERY_STRING};