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.
---
 lib/PublicInbox/RepoList.pm    | 4 ++--
 lib/PublicInbox/WwwCoderepo.pm | 6 +++++-
 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};

Reply via email to