gitweb: parse parent..current syntax from PATH_INFO
This patch makes it possible to use an URL such as project/action/somebranch..otherbranch:/filename to get a diff between different version of a file. Paths like project/action/somebranch:/somefile..otherbranch:/otherfile are parsed as well. All '*diff' actions and in general actions that use $hash_parent[_base] and $file_parent (e.g. 'shortlog') can now get all of their parameters from PATH_INFO Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> Acked-by: Jakub Narebski <jnareb@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3550ea71f5
commit
b0be3838bb
@ -549,7 +549,12 @@ sub evaluate_path_info {
|
||||
'history',
|
||||
);
|
||||
|
||||
my ($refname, $pathname) = split(/:/, $path_info, 2);
|
||||
# we want to catch
|
||||
# [$hash_parent_base[:$file_parent]..]$hash_parent[:$file_name]
|
||||
my ($parentrefname, $parentpathname, $refname, $pathname) =
|
||||
($path_info =~ /^(?:(.+?)(?::(.+))?\.\.)?(.+?)(?::(.+))?$/);
|
||||
|
||||
# first, analyze the 'current' part
|
||||
if (defined $pathname) {
|
||||
# we got "branch:filename" or "branch:dir/"
|
||||
# we could use git_get_type(branch:pathname), but:
|
||||
@ -563,9 +568,15 @@ sub evaluate_path_info {
|
||||
if (!$pathname || substr($pathname, -1) eq "/") {
|
||||
$input_params{'action'} ||= "tree";
|
||||
$pathname =~ s,/$,,;
|
||||
} else {
|
||||
# the default action depends on whether we had parent info
|
||||
# or not
|
||||
if ($parentrefname) {
|
||||
$input_params{'action'} ||= "blobdiff_plain";
|
||||
} else {
|
||||
$input_params{'action'} ||= "blob_plain";
|
||||
}
|
||||
}
|
||||
$input_params{'hash_base'} ||= $refname;
|
||||
$input_params{'file_name'} ||= $pathname;
|
||||
} elsif (defined $refname) {
|
||||
@ -584,6 +595,27 @@ sub evaluate_path_info {
|
||||
$input_params{'hash'} ||= $refname;
|
||||
}
|
||||
}
|
||||
|
||||
# next, handle the 'parent' part, if present
|
||||
if (defined $parentrefname) {
|
||||
# a missing pathspec defaults to the 'current' filename, allowing e.g.
|
||||
# someproject/blobdiff/oldrev..newrev:/filename
|
||||
if ($parentpathname) {
|
||||
$parentpathname =~ s,^/+,,;
|
||||
$parentpathname =~ s,/$,,;
|
||||
$input_params{'file_parent'} ||= $parentpathname;
|
||||
} else {
|
||||
$input_params{'file_parent'} ||= $input_params{'file_name'};
|
||||
}
|
||||
# we assume that hash_parent_base is wanted if a path was specified,
|
||||
# or if the action wants hash_base instead of hash
|
||||
if (defined $input_params{'file_parent'} ||
|
||||
grep { $_ eq $input_params{'action'} } @wants_base) {
|
||||
$input_params{'hash_parent_base'} ||= $parentrefname;
|
||||
} else {
|
||||
$input_params{'hash_parent'} ||= $parentrefname;
|
||||
}
|
||||
}
|
||||
}
|
||||
evaluate_path_info();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user