From 7b0ba33ee90396dda20d69fe548d73b479c3912d Mon Sep 17 00:00:00 2001
From: Eric Wong <e@yhbt.net>
Date: Sat, 1 Feb 2020 09:12:15 +0000
Subject: [PATCH] config: assume multiple cgit URLs, too

Since we support inboxes with multiple URLs and multiple
infourls to reduce reliance on SPOFs, we'll do the same with
cgit URLs.
---
 lib/PublicInbox/Config.pm  |  8 ++++++--
 lib/PublicInbox/WwwText.pm | 18 +++++++++++-------
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm
index 1ba1225e..e0ca7c5a 100644
--- a/lib/PublicInbox/Config.pm
+++ b/lib/PublicInbox/Config.pm
@@ -190,6 +190,9 @@ sub cgit_repo_merge ($$$) {
 		return unless -e "$path/$se";
 	}
 	return if -e "$path/noweb";
+	# this comes from the cgit config, and AFAIK cgit only allows
+	# repos to have one URL, but that's just the PATH_INFO component,
+	# not the Host: portion
 	# $repo = { url => 'foo.git', dir => '/path/to/foo.git' }
 	my $rel = $repo->{url};
 	unless (defined $rel) {
@@ -207,7 +210,7 @@ sub cgit_repo_merge ($$$) {
 			$rel =~ s!/?\.git\z!!;
 	}
 	$self->{"coderepo.$rel.dir"} //= $path;
-	$self->{"coderepo.$rel.cgiturl"} //= $rel;
+	$self->{"coderepo.$rel.cgiturl"} //= _array($rel);
 }
 
 sub is_git_dir ($) {
@@ -332,8 +335,9 @@ sub _fill_code_repo {
 				_array($self->{lc("$pfx.${t}UrlFormat")});
 	}
 
-	if (my $cgits = $self->{lc("$pfx.cgitUrl")}) {
+	if (defined(my $cgits = $self->{"$pfx.cgiturl"})) {
 		$git->{cgit_url} = $cgits = _array($cgits);
+		$self->{"$pfx.cgiturl"} = $cgits;
 
 		# cgit supports "/blob/?id=%s", but it's only a plain-text
 		# display and requires an unabbreviated id=
diff --git a/lib/PublicInbox/WwwText.pm b/lib/PublicInbox/WwwText.pm
index fbbe8e3b..c084b5bf 100644
--- a/lib/PublicInbox/WwwText.pm
+++ b/lib/PublicInbox/WwwText.pm
@@ -168,17 +168,21 @@ EOS
 
 		my $pi_config = $ctx->{www}->{pi_config};
 		for my $cr_name (@$cr) {
-			my $url = $pi_config->{"coderepo.$cr_name.cgiturl"};
+			my $urls = $pi_config->{"coderepo.$cr_name.cgiturl"};
 			my $path = "/path/to/$cr_name";
 			$cr_name = dq_escape($cr_name);
 
 			$$txt .= qq([coderepo "$cr_name"]\n);
-			if (defined($url)) {
-				my $cpath = $path;
-				if ($path !~ m![a-z0-9_/\.\-]!i) {
-					$cpath = dq_escape($cpath);
-				}
-				$$txt .= qq(\t; git clone $url "$cpath"\n);
+			if ($urls && scalar(@$urls)) {
+				$$txt .= "\t; ";
+				$$txt .= join(" ||\n\t;\t", map {;
+					my $cpath = $path;
+					if ($path !~ m![a-z0-9_/\.\-]!i) {
+						$cpath = dq_escape($cpath);
+					}
+					qq(git clone $_ "$cpath");
+				} @$urls);
+				$$txt .= "\n";
 			}
 			$$txt .= "\tdir = $path\n";
 			$$txt .= "\tcgiturl = https://example.com/";
-- 
2.51.0