]> 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 dfbcf4105a14ae74d97181183f547c01aef9318a..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
@@ -12,6 +12,7 @@ our $TOR2WEB_URL = 'https://www.tor2web.org/';
 our $CODE_URL = 'https://public-inbox.org/';
 our $PROJECT = 'public-inbox';
 
+# noop for HTTP.pm (and any other PSGI servers)
 sub close {}
 
 sub new {
@@ -71,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);
@@ -106,19 +122,20 @@ sub _html_end {
        '<hr><pre>'.join("\n\n",
                $desc,
                $urls,
-               'Code for this site: '.
+               'AGPL code for this site: '.
                qq(git clone <a\nhref="$url">$url</a> $PROJECT)
        ).'</pre></body></html>';
 }
 
+# callback for HTTP.pm (and any other PSGI servers)
 sub getline {
        my ($self) = @_;
        my $nr = $self->{nr}++;
 
        return _html_top($self) if $nr == 0;
 
-       if (my $mid = $self->{cb}) { # middle
-               $mid = $mid->($nr, $self->{ctx}) and return $mid;
+       if (my $middle = $self->{cb}) {
+               $middle = $middle->($nr, $self->{ctx}) and return $middle;
        }
 
        delete $self->{cb} ? _html_end($self) : undef;