From b411a7a6f62a0ea39644bc31bacf41861e5b731f Mon Sep 17 00:00:00 2001 From: Mark Rada Date: Sat, 26 Sep 2009 13:46:21 -0400 Subject: [PATCH] gitweb: append short hash ids to snapshot files 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 Signed-off-by: Shawn O. Pearce --- gitweb/gitweb.perl | 40 ++++++++++++++++-- t/t9502-gitweb-standalone-parse-output.sh | 67 +++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 t/t9502-gitweb-standalone-parse-output.sh diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 8d4a2ae600..bc132a537e 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -1983,14 +1983,39 @@ sub quote_command { # get HEAD ref of given project as hash sub git_get_head_hash { + return git_get_full_hash(shift, 'HEAD'); +} + +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; + } + } + if (defined $o_git_dir) { + $git_dir = $o_git_dir; + } + 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=7', $hash) { + $hash = <$fd>; + close $fd; + if (defined $hash && $hash =~ /^([0-9a-fA-F]{7,})$/) { $retval = $1; } } @@ -5203,6 +5228,13 @@ sub git_snapshot { die_error(400, 'Object is not a tree-ish'); } + + my $full_hash = git_get_full_hash($project, $hash); + 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); @@ -5213,7 +5245,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/t9502-gitweb-standalone-parse-output.sh b/t/t9502-gitweb-standalone-parse-output.sh new file mode 100644 index 0000000000..5f2b1d53a0 --- /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 -- 2.11.4.GIT