From 65690a33c5a527d5f3fef9320899eb9f4e1d25c8 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 16 Jan 2024 11:52:55 +0000 Subject: www: repolist: support globbing in URL 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 "
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};
-- 
cgit v1.2.3-24-ge0c7