]> Lady’s Gitweb - Gitweb/blobdiff - gitweb.perl
gitweb: Use git_get_name_rev_tags for commitdiff_plain X-Git-Tag: header
[Gitweb] / gitweb.perl
index b27740937b3788eb8fca9c97237e041e0dd7396e5d52962543874fd588bce784..b063714c3bb2ae27019187708040f7592d1eb335b6bd0da015bd208b2a364eeb 100755 (executable)
@@ -538,7 +538,6 @@ sub format_diff_line {
        } elsif ($char eq "@") {
                $diff_class = " chunk_header";
        } elsif ($char eq "\\") {
-               # skip errors (incomplete lines)
                $diff_class = " incomplete";
        }
        $line = untabify($line);
@@ -750,6 +749,73 @@ sub git_get_references {
        return \%refs;
 }
 
+sub git_get_following_references {
+       my $hash = shift || return undef;
+       my $type = shift;
+       my $base = shift || $hash_base || "HEAD";
+
+       my $refs = git_get_references($type);
+       open my $fd, "-|", $GIT, "rev-list", $base
+               or return undef;
+       my @commits = map { chomp; $_ } <$fd>;
+       close $fd
+               or return undef;
+
+       my @reflist;
+       my $lastref;
+
+       foreach my $commit (@commits) {
+               foreach my $ref (@{$refs->{$commit}}) {
+                       $lastref = $ref;
+                       push @reflist, $lastref;
+               }
+               if ($commit eq $hash) {
+                       last;
+               }
+       }
+
+       return wantarray ? @reflist : $lastref;
+}
+
+sub git_get_preceding_references {
+       my $hash = shift || return undef;
+       my $type = shift;
+
+       my $refs = git_get_references($type);
+       open my $fd, "-|", $GIT, "rev-list", $hash
+               or return undef;
+       my @commits = map { chomp; $_ } <$fd>;
+       close $fd
+               or return undef;
+
+       my @reflist;
+
+       foreach my $commit (@commits) {
+               foreach my $ref (@{$refs->{$commit}}) {
+                       return $ref unless wantarray;
+                       push @reflist, $ref;
+               }
+       }
+
+       return @reflist;
+}
+
+sub git_get_rev_name_tags {
+       my $hash = shift || return undef;
+
+       open my $fd, "-|", $GIT, "name-rev", "--tags", $hash
+               or return;
+       my $name_rev = <$fd>;
+       close $fd;
+
+       if ($name_rev =~ m|^$hash tags/(.*)$|) {
+               return $1;
+       } else {
+               # catches also '$hash undefined' output
+               return undef;
+       }
+}
+
 ## ----------------------------------------------------------------------
 ## parse to hash functions
 
@@ -1540,7 +1606,7 @@ sub git_difftree_body {
 }
 
 sub git_patchset_body {
-       my ($patchset, $difftree, $hash, $hash_parent) = @_;
+       my ($fd, $difftree, $hash, $hash_parent) = @_;
 
        my $patch_idx = 0;
        my $in_header = 0;
@@ -1549,7 +1615,9 @@ sub git_patchset_body {
 
        print "<div class=\"patchset\">\n";
 
-       LINE: foreach my $patch_line (@$patchset) {
+       LINE:
+       while (my $patch_line @$fd>) {
+               chomp $patch_line;
 
                if ($patch_line =~ m/^diff /) { # "git diff" header
                        # beginning of patch (in patchset)
@@ -2728,7 +2796,6 @@ sub git_commitdiff {
        # read commitdiff
        my $fd;
        my @difftree;
-       my @patchset;
        if ($format eq 'html') {
                open $fd, "-|", $GIT, "diff-tree", '-r', '-M', '-C',
                        "--patch-with-raw", "--full-index", $hash_parent, $hash
@@ -2739,13 +2806,11 @@ sub git_commitdiff {
                        last unless $line;
                        push @difftree, $line;
                }
-               @patchset = map { chomp; $_ } <$fd>;
 
-               close $fd
-                       or die_error(undef, "Reading git-diff-tree failed");
        } elsif ($format eq 'plain') {
                open $fd, "-|", $GIT, "diff-tree", '-r', '-p', '-B', $hash_parent, $hash
                        or die_error(undef, "Open git-diff-tree failed");
+
        } else {
                die_error(undef, "Unknown commitdiff format");
        }
@@ -2775,10 +2840,7 @@ sub git_commitdiff {
 
        } elsif ($format eq 'plain') {
                my $refs = git_get_references("tags");
-               my @tagnames;
-               if (exists $refs->{$hash}) {
-                       @tagnames = map { s|^tags/|| } $refs->{$hash};
-               }
+               my $tagname = git_get_rev_name_tags($hash);
                my $filename = basename($project) . "-$hash.patch";
 
                print $cgi->header(
@@ -2792,10 +2854,9 @@ From: $co{'author'}
 Date: $ad{'rfc2822'} ($ad{'tz_local'})
 Subject: $co{'title'}
 TEXT
-               foreach my $tag (@tagnames) {
-                       print "X-Git-Tag: $tag\n";
-               }
+               print "X-Git-Tag: $tagname\n" if $tagname;
                print "X-Git-Url: " . $cgi->self_url() . "\n\n";
+
                foreach my $line (@{$co{'comment'}}) {
                        print "$line\n";
                }
@@ -2807,8 +2868,8 @@ TEXT
                #git_difftree_body(\@difftree, $hash, $hash_parent);
                #print "<br/>\n";
 
-               git_patchset_body(\@patchset, \@difftree, $hash, $hash_parent);
-
+               git_patchset_body($fd, \@difftree, $hash, $hash_parent);
+               close $fd;
                print "</div>\n"; # class="page_body"
                git_footer_html();
 
This page took 0.248123 seconds and 4 git commands to generate.