diff options
-rw-r--r-- | lib/PublicInbox/RepoBase.pm | 4 | ||||
-rw-r--r-- | lib/PublicInbox/RepoGitSrc.pm | 10 | ||||
-rw-r--r-- | t/repobrowse_git_src.t | 5 |
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'); |