Ниже приведен фрагмент кода из новейшего источника root / gitweb / gitweb.perl
# preparing $fd and %diffinfo for git_patchset_body
# new style URI
if (defined $hash_base && defined $hash_parent_base) {
if (defined $file_name) {
# read raw output
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
$hash_parent_base, $hash_base,
"--", (defined $file_parent ? $file_parent : ()), $file_name
or die_error(500, "Open git-diff-tree failed");
@difftree = map { chomp; $_ } <$fd>;
close $fd
or die_error(404, "Reading git-diff-tree failed");
@difftree
or die_error(404, "Blob diff not found");
} elsif (defined $hash &&
$hash =~ /[0-9a-fA-F]{40}/) {
# try to find filename from $hash
# read filtered raw output
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
$hash_parent_base, $hash_base, "--"
or die_error(500, "Open git-diff-tree failed");
@difftree =
# ':100644 100644 03b21826... 3b93d5e7... M ls-files.c'
# $hash == to_id
grep { /^:[0-7]{6} [0-7]{6} [0-9a-fA-F]{40} $hash/ }
map { chomp; $_ } <$fd>;
close $fd
or die_error(404, "Reading git-diff-tree failed");
@difftree
or die_error(404, "Blob diff not found");
} else {
die_error(400, "Missing one of the blob diff parameters");
}
if (@difftree > 1) {
die_error(400, "Ambiguous blob diff specification");
}
%diffinfo = parse_difftree_raw_line($difftree[0]);
$file_parent ||= $diffinfo{'from_file'} || $file_name;
$file_name ||= $diffinfo{'to_file'};
$hash_parent ||= $diffinfo{'from_id'};
$hash ||= $diffinfo{'to_id'};
# non-textual hash id's can be cached
if ($hash_base =~ m/^[0-9a-fA-F]{40}$/ &&
$hash_parent_base =~ m/^[0-9a-fA-F]{40}$/) {
$expires = '+1d';
}
# open patch output
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
'-p', ($format eq 'html' ? "--full-index" : ()),
$hash_parent_base, $hash_base,
"--", (defined $file_parent ? $file_parent : ()), $file_name
or die_error(500, "Open git-diff-tree failed");
}
# old/legacy style URI
if (!%diffinfo && # if new style URI failed
defined $hash && defined $hash_parent) {
# fake git-diff-tree raw output
$diffinfo{'from_mode'} = $diffinfo{'to_mode'} = "blob";
$diffinfo{'from_id'} = $hash_parent;
$diffinfo{'to_id'} = $hash;
if (defined $file_name) {
if (defined $file_parent) {
$diffinfo{'status'} = '2';
$diffinfo{'from_file'} = $file_parent;
$diffinfo{'to_file'} = $file_name;
} else { # assume not renamed
$diffinfo{'status'} = '1';
$diffinfo{'from_file'} = $file_name;
$diffinfo{'to_file'} = $file_name;
}
} else { # no filename given
$diffinfo{'status'} = '2';
$diffinfo{'from_file'} = $hash_parent;
$diffinfo{'to_file'} = $hash;
}
# non-textual hash id's can be cached
if ($hash =~ m/^[0-9a-fA-F]{40}$/ &&
$hash_parent =~ m/^[0-9a-fA-F]{40}$/) {
$expires = '+1d';
}
# open patch output
open $fd, "-|", git_cmd(), "diff", @diff_opts,
'-p', ($format eq 'html' ? "--full-index" : ()),
$hash_parent, $hash, "--"
or die_error(500, "Open git-diff failed");
} else {
die_error(400, "Missing one of the blob diff parameters")
unless %diffinfo;
}
И другие фрагменты кода (нерелевантные коды опущены) ниже предназначены для анализа параметров:
our $file_name = $cgi->param('f');
our $hash = $cgi->param('h');
our $hash_parent = $cgi->param('hp');
our $hash_base = $cgi->param('hb');
our $hash_parent_base = $cgi->param('hpb');
Поэтому следующее неверно:
defined $hash_base
К сожалению, это все, что я получил.
Из приведенных выше кодов исключение не ожидается.
Тем не менее, ваш gitweb может быть не самым новым. Я предлагаю вам проверить свои источники.