]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WwwStream.pm
www: support cloning individual v2 git partitions
[public-inbox.git] / lib / PublicInbox / WwwStream.pm
index 01f7b31ba186001723d21dcbe2d3291e5f4383bc..76317544b9c2ee74b496770d63d2ba71d36ff970 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2016 all contributors <meta@public-inbox.org>
+# Copyright (C) 2016-2018 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # HTML body stream for which yields getline+close methods
@@ -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);