gitweb: retrieve snapshot format from PATH_INFO

We parse requests for $project/snapshot/$head.$sfx as equivalent to
$project/snapshot/$head?sf=$sfx, where $sfx is any of the known
(although not necessarily supported) snapshot formats (or its default
suffix).

The filename for the resulting package preserves the requested
extensions (so asking for a .tgz gives a .tgz, and asking for a .tar.gz
gives a .tar.gz), although for obvious reasons it doesn't preserve the
basename (git/snapshot/next.tgz returns a file names git-next.tgz).

This introduces a potential case for ambiguity if a project has a head
that ends with a snapshot-like suffix (.zip, .tgz, .tar.gz, etc) and the
sf CGI parameter is not present; however, gitweb only produces URLs with
the sf parameter currently, so this is only a potential issue for
hand-coded URLs for extremely unusual project.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Giuseppe Bilotta 2008-11-02 10:21:38 +01:00 committed by Junio C Hamano
parent 5e166843f5
commit 1ec2fb5fa3

View File

@ -616,6 +616,45 @@ sub evaluate_path_info {
$input_params{'hash_parent'} ||= $parentrefname;
}
}
# for the snapshot action, we allow URLs in the form
# $project/snapshot/$hash.ext
# where .ext determines the snapshot and gets removed from the
# passed $refname to provide the $hash.
#
# To be able to tell that $refname includes the format extension, we
# require the following two conditions to be satisfied:
# - the hash input parameter MUST have been set from the $refname part
# of the URL (i.e. they must be equal)
# - the snapshot format MUST NOT have been defined already (e.g. from
# CGI parameter sf)
# It's also useless to try any matching unless $refname has a dot,
# so we check for that too
if (defined $input_params{'action'} &&
$input_params{'action'} eq 'snapshot' &&
defined $refname && index($refname, '.') != -1 &&
$refname eq $input_params{'hash'} &&
!defined $input_params{'snapshot_format'}) {
# We loop over the known snapshot formats, checking for
# extensions. Allowed extensions are both the defined suffix
# (which includes the initial dot already) and the snapshot
# format key itself, with a prepended dot
while (my ($fmt, %opt) = each %known_snapshot_formats) {
my $hash = $refname;
my $sfx;
$hash =~ s/(\Q$opt{'suffix'}\E|\Q.$fmt\E)$//;
next unless $sfx = $1;
# a valid suffix was found, so set the snapshot format
# and reset the hash parameter
$input_params{'snapshot_format'} = $fmt;
$input_params{'hash'} = $hash;
# we also set the format suffix to the one requested
# in the URL: this way a request for e.g. .tgz returns
# a .tgz instead of a .tar.gz
$known_snapshot_formats{$fmt}{'suffix'} = $sfx;
last;
}
}
}
evaluate_path_info();