]> 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 dbb25a9c7b93644b1a36bd9b30d1a7de3a514e0dbb86a50545027e63c8c4fb59..b063714c3bb2ae27019187708040f7592d1eb335b6bd0da015bd208b2a364eeb 100755 (executable)
@@ -749,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
 
@@ -2773,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(
@@ -2790,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";
                }
This page took 0.234102 seconds and 4 git commands to generate.