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:
parent
5e166843f5
commit
1ec2fb5fa3
@ -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();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user