Teach gitweb how to produce nicer snapshot names by only using the short hash id. If clients make requests using a tree-ish that is not a partial or full SHA-1 hash, then the short hash will also be appended to whatever they asked for. This also includes tests cases for t9502-gitweb-standalone-parse-output. Signed-off-by: Mark Rada <marada@xxxxxxxxxxxx> --- gitweb/gitweb.perl | 26 +++++++++++ t/t9502-gitweb-standalone-parse-output.sh | 67 +++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 0 deletions(-) create mode 100644 t/t9502-gitweb-standalone-parse-output.sh diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index e1beca5..fdecc3d 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -2006,6 +2006,26 @@ sub git_get_full_hash { return $retval; } +# try and get a shorter hash id +sub git_get_short_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', '--short', $hash) { + $hash = <$fd>; + close $fd; + if (defined $hash && $hash =~ /^([0-9a-fA-F]{7,})$/) { + $retval = $1; + } + } + if (defined $o_git_dir) { + $git_dir = $o_git_dir; + } + return $retval; +} + # get type of given object sub git_get_type { my $hash = shift; @@ -5207,6 +5227,12 @@ sub git_snapshot { die_error(404, 'Hash id was not valid'); } + + if ($full_hash !~ /$hash/) { + $hash .= '-' . git_get_short_hash($project, $hash); + } else { + $hash = git_get_short_hash($project, $hash); + } my $name = $project; $name =~ s,([^/])/*\.git$,$1,; $name = basename($name); diff --git a/t/t9502-gitweb-standalone-parse-output.sh b/t/t9502-gitweb-standalone-parse-output.sh new file mode 100644 index 0000000..1a2a27f --- /dev/null +++ b/t/t9502-gitweb-standalone-parse-output.sh @@ -0,0 +1,67 @@ +#!/bin/sh +# +# Copyright (c) 2009 Mark Rada +# + +test_description='gitweb as standalone script (parsing script output). + +This test runs gitweb (git web interface) as a CGI script from the +commandline, and checks that it produces the correct output, either +in the HTTP header or the actual script output.' + + +. ./gitweb-lib.sh + +# ---------------------------------------------------------------------- +# snapshot file name + +test_commit \ + 'SnapshotFileTests' \ + 'i can has snapshot?' + +test_expect_success \ + 'snapshots: give full hash' \ + 'ID=`git rev-parse --verify HEAD` && + gitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" && + ID=`git rev-parse --short HEAD` && + grep ".git-$ID.tar.gz" gitweb.output' +test_debug 'cat gitweb.output' + +test_expect_success \ + 'snapshots: give short hash' \ + 'ID=`git rev-parse --short HEAD` && + gitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" && + grep ".git-$ID.tar.gz" gitweb.output' +test_debug 'cat gitweb.output' + +test_expect_success \ + 'snapshots: give almost full hash' \ + 'ID=`git rev-parse --short=30 HEAD` && + gitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" && + ID=`git rev-parse --short HEAD` && + grep ".git-$ID.tar.gz" gitweb.output' +test_debug 'cat gitweb.output' + +test_expect_success \ + 'snapshots: give HEAD tree-ish' \ + 'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tgz" && + ID=`git rev-parse --short HEAD` && + grep ".git-HEAD-$ID.tar.gz" gitweb.output' +test_debug 'cat gitweb.output' + +test_expect_success \ + 'snapshots: give branch name tree-ish' \ + 'gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" && + ID=`git rev-parse --short master` && + grep ".git-master-$ID.tar.gz" gitweb.output' +test_debug 'cat gitweb.output' + +test_expect_success \ + 'snapshots: give tag tree-ish' \ + 'gitweb_run "p=.git;a=snapshot;h=SnapshotFileTests;sf=tgz" && + ID=`git rev-parse --short SnapshotFileTests` && + grep ".git-SnapshotFileTests-$ID.tar.gz" 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