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',
|
'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) {
|
if (defined $pathname) {
|
||||||
# we got "branch:filename" or "branch:dir/"
|
# we got "branch:filename" or "branch:dir/"
|
||||||
# we could use git_get_type(branch:pathname), but:
|
# we could use git_get_type(branch:pathname), but:
|
||||||
@ -563,9 +568,15 @@ sub evaluate_path_info {
|
|||||||
if (!$pathname || substr($pathname, -1) eq "/") {
|
if (!$pathname || substr($pathname, -1) eq "/") {
|
||||||
$input_params{'action'} ||= "tree";
|
$input_params{'action'} ||= "tree";
|
||||||
$pathname =~ s,/$,,;
|
$pathname =~ s,/$,,;
|
||||||
|
} else {
|
||||||
|
# the default action depends on whether we had parent info
|
||||||
|
# or not
|
||||||
|
if ($parentrefname) {
|
||||||
|
$input_params{'action'} ||= "blobdiff_plain";
|
||||||
} else {
|
} else {
|
||||||
$input_params{'action'} ||= "blob_plain";
|
$input_params{'action'} ||= "blob_plain";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$input_params{'hash_base'} ||= $refname;
|
$input_params{'hash_base'} ||= $refname;
|
||||||
$input_params{'file_name'} ||= $pathname;
|
$input_params{'file_name'} ||= $pathname;
|
||||||
} elsif (defined $refname) {
|
} elsif (defined $refname) {
|
||||||
@ -584,6 +595,27 @@ sub evaluate_path_info {
|
|||||||
$input_params{'hash'} ||= $refname;
|
$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();
|
evaluate_path_info();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user