aboutsummaryrefslogtreecommitdiff
path: root/gitweb
diff options
context:
space:
mode:
authorJakub Narebski <jnareb@gmail.com>2006-08-24 19:37:04 +0200
committerJunio C Hamano <junkio@cox.net>2006-08-25 19:39:34 -0700
commit470b96d4837c5b019f15c8a5b013501724236de4 (patch)
treeb04731bbcafd7eb13a17b458146de0015528fadd /gitweb
parent157e43b4b0dd5a08eb7a6838192ac58bca62fa5b (diff)
downloadgit-470b96d4837c5b019f15c8a5b013501724236de4.tar.gz
git-470b96d4837c5b019f15c8a5b013501724236de4.tar.xz
gitweb: Add git_get_{following,preceding}_references functions
Adds git_get_following_references function, based on code which was used in git_commitdiff_plain to generate X-Git-Tag: header, and companion git_get_preceding_references function. Both functions return array of all references of given type (as returned by git_get_references) following/preceding given commit in array (list) context, and last following/first preceding ref in scalar context. Stripping ref (list of refs) of "$type/" (e.g. "tags/") is left to caller. Signed-off-by: Jakub Narebski <jnareb@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'gitweb')
-rwxr-xr-xgitweb/gitweb.perl52
1 files changed, 52 insertions, 0 deletions
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 08e0472c6..b964302a5 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -749,6 +749,58 @@ 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;
+ my $firstref;
+
+ foreach my $commit (@commits) {
+ foreach my $ref (@{$refs->{$commit}}) {
+ $firstref = $ref unless $firstref;
+ push @reflist, $ref;
+ }
+ }
+
+ return wantarray ? @reflist : $firstref;
+}
+
## ----------------------------------------------------------------------
## parse to hash functions