I changed some variable names to be nicer looking. -- Mark Rada (ferrous26) marada@xxxxxxxxxxxx --->8--- Makes things nicer in cases when you hand craft the snapshot URL but make a typo in defining the hash variable (e.g. netx instead of next); you will now get an error message instead of a broken tarball. To maintain backwards compatibility, git_get_head_hash is now a wrapper for git_get_full_hash, as suggested by Jakub Narebski. Tests for t9501 are included to demonstrate added functionality. Signed-off-by: Mark Rada <marada@xxxxxxxxxxxx> --- gitweb/gitweb.perl | 19 +++++++++++++------ t/t9501-gitweb-standalone-http-status.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 24b2193..e1beca5 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -1983,14 +1983,20 @@ sub quote_command { # get HEAD ref of given project as hash sub git_get_head_hash { + return git_get_full_hash(shift, 'HEAD'); +} + +# given a project and tree-ish, returns full hash +sub git_get_full_hash { my $project = shift; + my $hash = shift; my $o_git_dir = $git_dir; my $retval = undef; $git_dir = "$projectroot/$project"; - if (open my $fd, "-|", git_cmd(), "rev-parse", "--verify", "HEAD") { - my $head = <$fd>; + if (open my $fd, '-|', git_cmd(), 'rev-parse', '--verify', $hash) { + $hash = <$fd>; close $fd; - if (defined $head && $head =~ /^([0-9a-fA-F]{40})$/) { + if (defined $hash && $hash =~ /^([0-9a-fA-F]{40})$/) { $retval = $1; } } @@ -5196,8 +5202,9 @@ sub git_snapshot { die_error(403, "Unsupported snapshot format"); } - if (!defined $hash) { - $hash = git_get_head_hash($project); + my $full_hash = git_get_full_hash($project, $hash); + if (!$full_hash) { + die_error(404, 'Hash id was not valid'); } my $name = $project; @@ -5210,7 +5217,7 @@ sub git_snapshot { $cmd = quote_command( git_cmd(), 'archive', "--format=$known_snapshot_formats{$format}{'format'}", - "--prefix=$name/", $hash); + "--prefix=$name/", $full_hash); if (exists $known_snapshot_formats{$format}{'compressor'}) { $cmd .= ' | ' . quote_command(@{$known_snapshot_formats{$format}{'compressor'}}); } diff --git a/t/t9501-gitweb-standalone-http-status.sh b/t/t9501-gitweb-standalone-http-status.sh index d0ff21d..632007e 100644 --- a/t/t9501-gitweb-standalone-http-status.sh +++ b/t/t9501-gitweb-standalone-http-status.sh @@ -75,4 +75,33 @@ test_expect_success \ test_debug 'cat gitweb.output' +# ---------------------------------------------------------------------- +# snapshot hash ids + +test_expect_success \ + 'snapshots: good treeish id' \ + 'gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" && + grep "Status: 200 OK" gitweb.output' +test_debug 'cat gitweb.output' + +test_expect_success \ + 'snapshots: bad treeish id' \ + 'gitweb_run "p=.git;a=snapshot;h=frizzumFrazzum;sf=tgz" && + grep "404 - Hash id was not valid" gitweb.output' +test_debug 'cat gitweb.output' + +test_expect_success \ + 'snapshots: good object id' \ + 'ID=`git rev-parse --verify HEAD` && + gitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" && + grep "Status: 200 OK" gitweb.output' +test_debug 'cat gitweb.output' + +test_expect_success \ + 'snapshots: bad object id' \ + 'gitweb_run "p=.git;a=snapshot;h=abcdef01234;sf=tgz" && + grep "404 - Hash id was not valid" gitweb.output' +test_debug 'cat gitweb.output' + + test_done -- 1.6.4.2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html