* [PATCHv6 0/4] gitweb: patch view @ 2008-12-18 7:13 Giuseppe Bilotta 2008-12-18 7:13 ` [PATCHv6 1/4] gitweb: add " Giuseppe Bilotta 0 siblings, 1 reply; 5+ messages in thread From: Giuseppe Bilotta @ 2008-12-18 7:13 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Junio C Hamano, Giuseppe Bilotta Sixth iteration of the patch view in gitweb, that exposes the git-format-patch output directly, allowing patchset exchange via gitweb. As suggested by Junio, the call pattern for git_commitdiff is changed to use named parameters even for the first parameter (-format). Giuseppe Bilotta (4): gitweb: add patch view gitweb: change call pattern for git_commitdiff gitweb: add patches view gitweb: link to patch(es) view in commit(diff) and (short)log view gitweb/gitweb.perl | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 108 insertions(+), 1 deletions(-) ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCHv6 1/4] gitweb: add patch view 2008-12-18 7:13 [PATCHv6 0/4] gitweb: patch view Giuseppe Bilotta @ 2008-12-18 7:13 ` Giuseppe Bilotta 2008-12-18 7:13 ` [PATCHv6 2/4] gitweb: change call pattern for git_commitdiff Giuseppe Bilotta 0 siblings, 1 reply; 5+ messages in thread From: Giuseppe Bilotta @ 2008-12-18 7:13 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Junio C Hamano, Giuseppe Bilotta The output of commitdiff_plain is not intended for git-am: * when given a range of commits, commitdiff_plain publishes a single patch with the message from the first commit, instead of a patchset * the hand-built email format replicates the commit summary both as email subject and as first line of the email itself, resulting in a duplication if the output is used with git-am. We thus create a new view that can be fed to git-am directly, allowing patch exchange via gitweb. The new view exposes the output of git format-patch directly, limiting it to a single patch in the case of a single commit. A configurable upper limit defaulting to 16 is imposed on the number of commits which will be included in a patchset, to prevent DoS attacks on the server. Setting the limit to 0 will disable the patch view, setting it to a negative number will remove the limit. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 68 insertions(+), 1 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 6eb370d..1006dfe 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -330,6 +330,21 @@ our %feature = ( 'ctags' => { 'override' => 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 { @@ -411,6 +426,16 @@ sub feature_pickaxe { return ($_[0]); } +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 # initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed # and then pruned. @@ -504,6 +529,7 @@ our %actions = ( "heads" => \&git_heads, "history" => \&git_history, "log" => \&git_log, + "patch" => \&git_patch, "rss" => \&git_rss, "atom" => \&git_atom, "search" => \&git_search, @@ -5387,6 +5413,13 @@ sub git_blobdiff_plain { sub git_commitdiff { my $format = shift || 'html'; + + my $patch_max; + if ($format eq 'patch') { + ($patch_max) = gitweb_get_feature('patches'); + die_error(403, "Patch view not allowed") unless $patch_max; + } + $hash ||= $hash_base || "HEAD"; my %co = parse_commit($hash) or die_error(404, "Unknown commit object"); @@ -5484,7 +5517,23 @@ sub git_commitdiff { open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, '-p', $hash_parent_param, $hash, "--" 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 { + push @commit_spec, '-1', '--root', $hash; + } + open $fd, "-|", git_cmd(), "format-patch", '--encoding=utf8', + '--stdout', @commit_spec + or die_error(500, "Open git-format-patch failed"); } else { die_error(400, "Unknown commitdiff format"); } @@ -5533,6 +5582,14 @@ sub git_commitdiff { print to_utf8($line) . "\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 @@ -5554,6 +5611,11 @@ sub git_commitdiff { print <$fd>; close $fd 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"; } } @@ -5561,6 +5623,11 @@ sub git_commitdiff_plain { git_commitdiff('plain'); } +# format-patch-style patches +sub git_patch { + git_commitdiff('patch'); +} + sub git_history { if (!defined $hash_base) { $hash_base = git_get_head_hash($project); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCHv6 2/4] gitweb: change call pattern for git_commitdiff 2008-12-18 7:13 ` [PATCHv6 1/4] gitweb: add " Giuseppe Bilotta @ 2008-12-18 7:13 ` Giuseppe Bilotta 2008-12-18 7:13 ` [PATCHv6 3/4] gitweb: add patches view Giuseppe Bilotta 0 siblings, 1 reply; 5+ messages in thread From: Giuseppe Bilotta @ 2008-12-18 7:13 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Junio C Hamano, Giuseppe Bilotta Since we are going to introduce an additional parameter for git_commitdiff to tune patch view, we switch to named/hash-based parameter passing for clarity and robustness. --- gitweb/gitweb.perl | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 1006dfe..18d43e7 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -5412,7 +5412,8 @@ sub git_blobdiff_plain { } sub git_commitdiff { - my $format = shift || 'html'; + my %params = @_; + my $format = $params{-format} || 'html'; my $patch_max; if ($format eq 'patch') { @@ -5620,12 +5621,12 @@ sub git_commitdiff { } sub git_commitdiff_plain { - git_commitdiff('plain'); + git_commitdiff(-format => 'plain'); } # format-patch-style patches sub git_patch { - git_commitdiff('patch'); + git_commitdiff(-format => 'patch'); } sub git_history { -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCHv6 3/4] gitweb: add patches view 2008-12-18 7:13 ` [PATCHv6 2/4] gitweb: change call pattern for git_commitdiff Giuseppe Bilotta @ 2008-12-18 7:13 ` Giuseppe Bilotta 2008-12-18 7:13 ` [PATCHv6 4/4] gitweb: link to patch(es) view in commit(diff) and (short)log view Giuseppe Bilotta 0 siblings, 1 reply; 5+ messages in thread From: Giuseppe Bilotta @ 2008-12-18 7:13 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Junio C Hamano, Giuseppe Bilotta The only difference between patch and patches view is in the treatement of single commits: the former only displays a single patch, whereas the latter displays a patchset leading to the specified commit. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 18d43e7..78aaebe 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -530,6 +530,7 @@ our %actions = ( "history" => \&git_history, "log" => \&git_log, "patch" => \&git_patch, + "patches" => \&git_patches, "rss" => \&git_rss, "atom" => \&git_atom, "search" => \&git_search, @@ -5530,7 +5531,15 @@ sub git_commitdiff { } push @commit_spec, '-n', "$hash_parent..$hash"; } else { - push @commit_spec, '-1', '--root', $hash; + 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 @@ -5626,6 +5635,10 @@ sub git_commitdiff_plain { # format-patch-style patches sub git_patch { + git_commitdiff(-format => 'patch', -single=> 1); +} + +sub git_patches { git_commitdiff(-format => 'patch'); } -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCHv6 4/4] gitweb: link to patch(es) view in commit(diff) and (short)log view 2008-12-18 7:13 ` [PATCHv6 3/4] gitweb: add patches view Giuseppe Bilotta @ 2008-12-18 7:13 ` Giuseppe Bilotta 0 siblings, 0 replies; 5+ messages in thread From: Giuseppe Bilotta @ 2008-12-18 7:13 UTC (permalink / raw) To: git; +Cc: Jakub Narebski, Petr Baudis, Junio C Hamano, Giuseppe Bilotta We link to patch view in commit and commitdiff view, and to patches view in log and shortlog view. In (short)log view, the link is only offered when the number of commits shown is no more than the allowed maximum number of patches. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com> --- gitweb/gitweb.perl | 30 ++++++++++++++++++++++++++++-- 1 files changed, 28 insertions(+), 2 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 78aaebe..fd8bc29 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -5024,6 +5024,15 @@ sub git_log { 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 .= " ⋅ " . + $cgi->a({-href => href(action=>"patches", -replay=>1)}, + "patches"); + } + } + git_header_html(); git_print_page_nav('log','', $hash,undef,undef, $paging_nav); @@ -5103,6 +5112,11 @@ sub git_commit { } @$parents ) . ')'; } + if (gitweb_check_feature('patches')) { + $formats_nav .= " | " . + $cgi->a({-href => href(action=>"patch", -replay=>1)}, + "patch"); + } if (!defined $parent) { $parent = "--root"; @@ -5416,9 +5430,8 @@ sub git_commitdiff { my %params = @_; my $format = $params{-format} || 'html'; - my $patch_max; + my ($patch_max) = gitweb_get_feature('patches'); if ($format eq 'patch') { - ($patch_max) = gitweb_get_feature('patches'); die_error(403, "Patch view not allowed") unless $patch_max; } @@ -5436,6 +5449,11 @@ sub git_commitdiff { $formats_nav = $cgi->a({-href => href(action=>"commitdiff_plain", -replay=>1)}, "raw"); + if ($patch_max) { + $formats_nav .= " | " . + $cgi->a({-href => href(action=>"patch", -replay=>1)}, + "patch"); + } if (defined $hash_parent && $hash_parent ne '-c' && $hash_parent ne '--cc') { @@ -5992,6 +6010,14 @@ sub git_shortlog { $cgi->a({-href => href(-replay=>1, page=>$page+1), -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 .= " ⋅ " . + $cgi->a({-href => href(action=>"patches", -replay=>1)}, + "patches"); + } + } git_header_html(); git_print_page_nav('shortlog','', $hash,$hash,$hash, $paging_nav); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-12-18 7:15 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-18 7:13 [PATCHv6 0/4] gitweb: patch view Giuseppe Bilotta 2008-12-18 7:13 ` [PATCHv6 1/4] gitweb: add " Giuseppe Bilotta 2008-12-18 7:13 ` [PATCHv6 2/4] gitweb: change call pattern for git_commitdiff Giuseppe Bilotta 2008-12-18 7:13 ` [PATCHv6 3/4] gitweb: add patches view Giuseppe Bilotta 2008-12-18 7:13 ` [PATCHv6 4/4] gitweb: link to patch(es) view in commit(diff) and (short)log view Giuseppe Bilotta
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).