about summary refs log tree commit homepage
path: root/lib/PublicInbox/WwwStream.pm
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-27 20:31:44 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-27 21:20:01 +0000
commit7b5ea579e6a9490a4a38958acac8e078d805eec7 (patch)
tree28e99dd0ee8c6740ed0f5aaf22837db31ca983cd /lib/PublicInbox/WwwStream.pm
parenta966564fef08a4f25670778efbff139fbbf47c84 (diff)
downloadpublic-inbox-7b5ea579e6a9490a4a38958acac8e078d805eec7.tar.gz
This will require multiple client invocations, but should reduce
load on the server and make it easier for readers to only clone
the latest data.

Unfortunately, supporting a cloneurl file for externally-hosted
repos will be more difficult as we cannot easily know if the
clones use v1 or v2 repositories, or how many git partitions
they have.
Diffstat (limited to 'lib/PublicInbox/WwwStream.pm')
-rw-r--r--lib/PublicInbox/WwwStream.pm23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm
index 05519984..76317544 100644
--- a/lib/PublicInbox/WwwStream.pm
+++ b/lib/PublicInbox/WwwStream.pm
@@ -72,17 +72,32 @@ sub _html_end {
         my $obj = $ctx->{-inbox};
         my $desc = ascii_html($obj->description);
 
+        my (%seen, @urls);
         my $http = $obj->base_url($ctx->{env});
-        chop $http;
-        my %seen = ( $http => 1 );
-        my @urls = ($http);
+        chop $http; # no trailing slash
+        my $part = $obj->max_git_part;
+        if (defined($part)) { # v2
+                # most recent partition first:
+                for (; $part >= 0; $part--) {
+                        my $url = "$http/$part";
+                        $seen{$url} = 1;
+                        push @urls, $url;
+                }
+        } else { # v1
+                $seen{$http} = 1;
+                push @urls, $http;
+        }
+
+        # FIXME: partitioning in can be different in other repositories,
+        # use the "cloneurl" file as-is for now:
         foreach my $u (@{$obj->cloneurl}) {
                 next if $seen{$u};
                 $seen{$u} = 1;
                 push @urls, $u =~ /\Ahttps?:/ ? qq(<a\nhref="$u">$u</a>) : $u;
         }
+
         if (scalar(@urls) == 1) {
-                $urls .= " git clone --mirror $http";
+                $urls .= " git clone --mirror $urls[0]";
         } else {
                 $urls .= "\n" .
                         join("\n", map { "\tgit clone --mirror $_" } @urls);