Merge branch 'gb/gitweb-patch'

* gb/gitweb-patch:
  gitweb: link to patch(es) view in commit(diff) and (short)log view
  gitweb: add patches view
  gitweb: change call pattern for git_commitdiff
  gitweb: add patch view

Conflicts:
	gitweb/gitweb.perl
This commit is contained in:
Junio C Hamano 2009-01-17 23:06:19 -08:00
commit 6fc2a19969

View File

@ -330,6 +330,21 @@ our %feature = (
'ctags' => { 'ctags' => {
'override' => 0, 'override' => 0,
'default' => [0]}, 'default' => [0]},
# The maximum number of patches in a patchset generated in patch
# view. Set this to 0 or undef to disable patch view, or to a
# negative number to remove any limit.
# To disable system wide have in $GITWEB_CONFIG
# $feature{'patches'}{'default'} = [0];
# To have project specific config enable override in $GITWEB_CONFIG
# $feature{'patches'}{'override'} = 1;
# and in project config gitweb.patches = 0|n;
# where n is the maximum number of patches allowed in a patchset.
'patches' => {
'sub' => \&feature_patches,
'override' => 0,
'default' => [16]},
); );
sub gitweb_get_feature { sub gitweb_get_feature {
@ -388,6 +403,16 @@ sub feature_snapshot {
return @fmts; return @fmts;
} }
sub feature_patches {
my @val = (git_get_project_config('patches', '--int'));
if (@val) {
return @val;
}
return ($_[0]);
}
# checking HEAD file with -e is fragile if the repository was # checking HEAD file with -e is fragile if the repository was
# initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed # initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed
# and then pruned. # and then pruned.
@ -481,6 +506,8 @@ our %actions = (
"heads" => \&git_heads, "heads" => \&git_heads,
"history" => \&git_history, "history" => \&git_history,
"log" => \&git_log, "log" => \&git_log,
"patch" => \&git_patch,
"patches" => \&git_patches,
"rss" => \&git_rss, "rss" => \&git_rss,
"atom" => \&git_atom, "atom" => \&git_atom,
"search" => \&git_search, "search" => \&git_search,
@ -4991,6 +5018,15 @@ sub git_log {
my $paging_nav = format_paging_nav('log', $hash, $head, $page, $#commitlist >= 100); my $paging_nav = format_paging_nav('log', $hash, $head, $page, $#commitlist >= 100);
my ($patch_max) = gitweb_get_feature('patches');
if ($patch_max) {
if ($patch_max < 0 || @commitlist <= $patch_max) {
$paging_nav .= " &sdot; " .
$cgi->a({-href => href(action=>"patches", -replay=>1)},
"patches");
}
}
git_header_html(); git_header_html();
git_print_page_nav('log','', $hash,undef,undef, $paging_nav); git_print_page_nav('log','', $hash,undef,undef, $paging_nav);
@ -5070,6 +5106,11 @@ sub git_commit {
} @$parents ) . } @$parents ) .
')'; ')';
} }
if (gitweb_check_feature('patches')) {
$formats_nav .= " | " .
$cgi->a({-href => href(action=>"patch", -replay=>1)},
"patch");
}
if (!defined $parent) { if (!defined $parent) {
$parent = "--root"; $parent = "--root";
@ -5346,7 +5387,14 @@ sub git_blobdiff_plain {
} }
sub git_commitdiff { sub git_commitdiff {
my $format = shift || 'html'; my %params = @_;
my $format = $params{-format} || 'html';
my ($patch_max) = gitweb_get_feature('patches');
if ($format eq 'patch') {
die_error(403, "Patch view not allowed") unless $patch_max;
}
$hash ||= $hash_base || "HEAD"; $hash ||= $hash_base || "HEAD";
my %co = parse_commit($hash) my %co = parse_commit($hash)
or die_error(404, "Unknown commit object"); or die_error(404, "Unknown commit object");
@ -5361,6 +5409,11 @@ sub git_commitdiff {
$formats_nav = $formats_nav =
$cgi->a({-href => href(action=>"commitdiff_plain", -replay=>1)}, $cgi->a({-href => href(action=>"commitdiff_plain", -replay=>1)},
"raw"); "raw");
if ($patch_max) {
$formats_nav .= " | " .
$cgi->a({-href => href(action=>"patch", -replay=>1)},
"patch");
}
if (defined $hash_parent && if (defined $hash_parent &&
$hash_parent ne '-c' && $hash_parent ne '--cc') { $hash_parent ne '-c' && $hash_parent ne '--cc') {
@ -5444,7 +5497,31 @@ sub git_commitdiff {
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
'-p', $hash_parent_param, $hash, "--" '-p', $hash_parent_param, $hash, "--"
or die_error(500, "Open git-diff-tree failed"); or die_error(500, "Open git-diff-tree failed");
} elsif ($format eq 'patch') {
# For commit ranges, we limit the output to the number of
# patches specified in the 'patches' feature.
# For single commits, we limit the output to a single patch,
# diverging from the git-format-patch default.
my @commit_spec = ();
if ($hash_parent) {
if ($patch_max > 0) {
push @commit_spec, "-$patch_max";
}
push @commit_spec, '-n', "$hash_parent..$hash";
} else {
if ($params{-single}) {
push @commit_spec, '-1';
} else {
if ($patch_max > 0) {
push @commit_spec, "-$patch_max";
}
push @commit_spec, "-n";
}
push @commit_spec, '--root', $hash;
}
open $fd, "-|", git_cmd(), "format-patch", '--encoding=utf8',
'--stdout', @commit_spec
or die_error(500, "Open git-format-patch failed");
} else { } else {
die_error(400, "Unknown commitdiff format"); die_error(400, "Unknown commitdiff format");
} }
@ -5493,6 +5570,14 @@ sub git_commitdiff {
print to_utf8($line) . "\n"; print to_utf8($line) . "\n";
} }
print "---\n\n"; print "---\n\n";
} elsif ($format eq 'patch') {
my $filename = basename($project) . "-$hash.patch";
print $cgi->header(
-type => 'text/plain',
-charset => 'utf-8',
-expires => $expires,
-content_disposition => 'inline; filename="' . "$filename" . '"');
} }
# write patch # write patch
@ -5514,11 +5599,25 @@ sub git_commitdiff {
print <$fd>; print <$fd>;
close $fd close $fd
or print "Reading git-diff-tree failed\n"; or print "Reading git-diff-tree failed\n";
} elsif ($format eq 'patch') {
local $/ = undef;
print <$fd>;
close $fd
or print "Reading git-format-patch failed\n";
} }
} }
sub git_commitdiff_plain { sub git_commitdiff_plain {
git_commitdiff('plain'); git_commitdiff(-format => 'plain');
}
# format-patch-style patches
sub git_patch {
git_commitdiff(-format => 'patch', -single=> 1);
}
sub git_patches {
git_commitdiff(-format => 'patch');
} }
sub git_history { sub git_history {
@ -5871,6 +5970,14 @@ sub git_shortlog {
$cgi->a({-href => href(-replay=>1, page=>$page+1), $cgi->a({-href => href(-replay=>1, page=>$page+1),
-accesskey => "n", -title => "Alt-n"}, "next"); -accesskey => "n", -title => "Alt-n"}, "next");
} }
my $patch_max = gitweb_check_feature('patches');
if ($patch_max) {
if ($patch_max < 0 || @commitlist <= $patch_max) {
$paging_nav .= " &sdot; " .
$cgi->a({-href => href(action=>"patches", -replay=>1)},
"patches");
}
}
git_header_html(); git_header_html();
git_print_page_nav('shortlog','', $hash,$hash,$hash, $paging_nav); git_print_page_nav('shortlog','', $hash,$hash,$hash, $paging_nav);