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>
This commit is contained in:
Jakub Narebski 2006-08-24 19:37:04 +02:00 коммит произвёл Junio C Hamano
Родитель 157e43b4b0
Коммит 470b96d483
1 изменённых файлов: 52 добавлений и 0 удалений

Просмотреть файл

@ -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