summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 7c5e2eb)
raw | patch | inline | side by side (parent: 7c5e2eb)
author | Jakub Narebski <jnareb@gmail.com> | |
Fri, 25 Aug 2006 19:14:49 +0000 (21:14 +0200) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Sat, 26 Aug 2006 02:42:24 +0000 (19:42 -0700) |
git_blobdiff and git_blobdiff_plain are now collapsed into one
subroutine git_blobdiff, with format (currently 'html' which is
default format corresponding to git_blobdiff, and 'plain'
corresponding to git_blobdiff_plain) specified in argument.
blobdiff_plain format is now generated either by git-diff-tree
or by git-diff. Added X-Git-Url: header. From-file and to-file name
in header are corrected.
Note that for now commitdiff_plain does not detect renames
and copying, while blobdiff_plain does.
While at it, set expires to "+1d" for non-textual hash ids.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
subroutine git_blobdiff, with format (currently 'html' which is
default format corresponding to git_blobdiff, and 'plain'
corresponding to git_blobdiff_plain) specified in argument.
blobdiff_plain format is now generated either by git-diff-tree
or by git-diff. Added X-Git-Url: header. From-file and to-file name
in header are corrected.
Note that for now commitdiff_plain does not detect renames
and copying, while blobdiff_plain does.
While at it, set expires to "+1d" for non-textual hash ids.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
gitweb/gitweb.perl | patch | blob | history |
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 0fa35f336994df9756d372c2c89169d0875091c9..11b3fdc178c9a1da5aeab48225bc39fe3d777843 100755 (executable)
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
}
sub git_blobdiff {
+ my $format = shift || 'html';
+
my $fd;
my @difftree;
my %diffinfo;
+ my $expires;
# preparing $fd and %diffinfo for git_patchset_body
# new style URI
$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, "diff-tree", '-r', '-p', '-M', '-C', $hash_parent_base, $hash_base,
"--", $file_name
$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, "diff", '-p', $hash_parent, $hash
open $fd, "-|", $GIT, "diff", '-p', $hash, $hash_parent
or die_error(undef, "Open git-diff failed");
}
# header
- my $formats_nav =
- $cgi->a({-href => href(action=>"blobdiff_plain",
- hash=>$hash, hash_parent=>$hash_parent,
- hash_base=>$hash_base, hash_parent_base=>$hash_parent_base,
- file_name=>$file_name, file_parent=>$file_parent)},
- "plain");
- git_header_html();
- if (defined $hash_base && (my %co = parse_commit($hash_base))) {
- git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav);
- git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
- } else {
- print "<div class=\"page_nav\"><br/>$formats_nav<br/></div>\n";
- print "<div class=\"title\">$hash vs $hash_parent</div>\n";
- }
- if (defined $file_name) {
- git_print_page_path($file_name, "blob", $hash_base);
+ if ($format eq 'html') {
+ my $formats_nav =
+ $cgi->a({-href => href(action=>"blobdiff_plain",
+ hash=>$hash, hash_parent=>$hash_parent,
+ hash_base=>$hash_base, hash_parent_base=>$hash_parent_base,
+ file_name=>$file_name, file_parent=>$file_parent)},
+ "plain");
+ git_header_html(undef, $expires);
+ if (defined $hash_base && (my %co = parse_commit($hash_base))) {
+ git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav);
+ git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
+ } else {
+ print "<div class=\"page_nav\"><br/>$formats_nav<br/></div>\n";
+ print "<div class=\"title\">$hash vs $hash_parent</div>\n";
+ }
+ if (defined $file_name) {
+ git_print_page_path($file_name, "blob", $hash_base);
+ } else {
+ print "<div class=\"page_path\"></div>\n";
+ }
+
+ } elsif ($format eq 'plain') {
+ print $cgi->header(
+ -type => 'text/plain',
+ -charset => 'utf-8',
+ -expires => $expires,
+ -content_disposition => qq(inline; filename="${file_name}.patch"));
+
+ print "X-Git-Url: " . $cgi->self_url() . "\n\n";
+
} else {
- print "<div class=\"page_path\"></div>\n";
+ die_error(undef, "Unknown blobdiff format");
}
# patch
- print "<div class=\"page_body\">\n";
+ if ($format eq 'html') {
+ print "<div class=\"page_body\">\n";
- git_patchset_body($fd, [ \%diffinfo ], $hash_base, $hash_parent_base);
- close $fd;
+ git_patchset_body($fd, [ \%diffinfo ], $hash_base, $hash_parent_base);
+ close $fd;
- print "</div>\n"; # class="page_body"
- git_footer_html();
+ print "</div>\n"; # class="page_body"
+ git_footer_html();
+
+ } else {
+ while (my $line = <$fd>) {
+ $line =~ s!a/($hash|$hash_parent)!a/$diffinfo{'from_file'}!g;
+ $line =~ s!b/($hash|$hash_parent)!b/$diffinfo{'to_file'}!g;
+
+ print $line;
+
+ last if $line =~ m!^\+\+\+!;
+ }
+ local $/ = undef;
+ print <$fd>;
+ close $fd;
+ }
}
sub git_blobdiff_plain {
- mkdir($git_temp, 0700);
- print $cgi->header(-type => "text/plain", -charset => 'utf-8');
- git_diff_print($hash_parent, $file_name || $hash_parent, $hash, $file_name || $hash, "plain");
+ git_blobdiff('plain');
}
sub git_commitdiff {