about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/RepoBase.pm4
-rw-r--r--lib/PublicInbox/RepoGitSrc.pm10
-rw-r--r--t/repobrowse_git_src.t5
3 files changed, 11 insertions, 8 deletions
diff --git a/lib/PublicInbox/RepoBase.pm b/lib/PublicInbox/RepoBase.pm
index e600b1df..5d38579c 100644
--- a/lib/PublicInbox/RepoBase.pm
+++ b/lib/PublicInbox/RepoBase.pm
@@ -86,7 +86,7 @@ sub r {
                 my $env = $req->{env};
                 my $base = PublicInbox::Repobrowse::base_url($env);
                 my ($redir) = @extra;
-                if ($redir =~ m!\A\.\./!) { # relative redirect
+                if (index($redir, '/') != 0) { # relative redirect
                         my @orig = split(m!/+!, $env->{PATH_INFO});
                         my @dest = split(m!/+!, $redir);
 
@@ -98,7 +98,7 @@ sub r {
                         $end = pop @dest if $dest[-1] =~ /\A[#\?]/;
                         $redir = $base . join('/', @orig, @dest) . $end;
                 } else {
-                        $redir = $base . '/' . $redir;
+                        $redir = $base . $redir;
                 }
                 push @h, qw(Content-Type text/plain Location), $redir;
 
diff --git a/lib/PublicInbox/RepoGitSrc.pm b/lib/PublicInbox/RepoGitSrc.pm
index de068940..38108442 100644
--- a/lib/PublicInbox/RepoGitSrc.pm
+++ b/lib/PublicInbox/RepoGitSrc.pm
@@ -23,7 +23,7 @@ sub call_git_src {
         my ($self, $req) = @_;
         my $repo = $req->{-repo};
         my $git = $repo->{git};
-        my $tip = $req->{tip} || $req->{repo}->tip;
+        my $tip = $req->{tip} or return $self->r(302, $req, $repo->tip);
         sub {
                 my ($res) = @_;
                 $git->check_async($req->{env}, "$tip:$req->{expath}", sub {
@@ -57,7 +57,7 @@ sub cur_path {
         my ($req) = @_;
         my @ex = @{$req->{extra}} or return '<b>root</b>';
         my $s;
-        my $tip = $req->{tip} || $req->{repo}->tip;
+        my $tip = $req->{tip};
         my $rel = $req->{relcmd};
         # avoid relative paths, here, we don't want to propagate
         # trailing-slash URLs although we tolerate them
@@ -81,7 +81,7 @@ sub git_blob_sed ($$$) {
         my @lines;
         my $buf = '';
         my $rel = $req->{relcmd};
-        my $tip = $req->{tip} || $req->{repo}->tip;
+        my $tip = $req->{tip};
         my $raw = join('/', "${rel}raw", $tip, @{$req->{extra}});
         $raw = PublicInbox::Hval->utf8($raw)->as_path;
         my $t = cur_path($req);
@@ -220,10 +220,8 @@ sub git_tree_show {
         $req->{thtml} .= "\npath: $t\n\n<b>mode\tsize\tname</b>\n";
         if (defined(my $last = $req->{extra}->[-1])) {
                 $pfx = PublicInbox::Hval->utf8($last)->as_path;
-        } elsif (defined(my $tip = $req->{tip})) {
-                $pfx = $tip;
         } else {
-                $pfx = 'src/' . $req->{-repo}->tip;
+                $pfx = 'src/' . $req->{tip};
         }
         $req->{tpfx} = $pfx;
         my $env = $req->{env};
diff --git a/t/repobrowse_git_src.t b/t/repobrowse_git_src.t
index 4d16eac4..aa341d38 100644
--- a/t/repobrowse_git_src.t
+++ b/t/repobrowse_git_src.t
@@ -14,6 +14,11 @@ test_psgi($test->{app}, sub {
         like($noslash_body, qr{href="dir/dur">dur/</a>},
                 'path ok w/o slash');
 
+        $req = 'http://example.com/test.git/src';
+        $res = $cb->(GET($req));
+        is(302, $res->code, 'got 302 response from dir');
+        is("$req/master", $res->header('Location'), 'redirected to tip');
+
         my $slash = $req . '/';
         my $r2 = $cb->(GET($slash));
         is(301, $r2->code, 'got 301 response from dir with slash');