Jakub Narebski <jnareb@xxxxxxxxx> writes: > Remove git_get_hash_by_ref while at it, as git_get_refs_list was the > only place it was used. That's a very good news. > + open my $fd, "-|", $GIT, "peek-remote", "$projectroot/$project/" > + or return; > + while (my $line = <$fd>) { > + chomp $line; > + if ($line =~ m/^([0-9a-fA-F]{40})\t$ref_dir\/?([^\^]+)$/) { > + push @refs, { hash => $1, name => $2 }; > + } elsif ($line =~ m/^[0-9a-fA-F]{40}\t$ref_dir\/?.*\^\{\}$/) { > + # assume that "peeled" ref is always after ref, > + # and that you "peel" (deref) tags only > + $refs[$#refs]->{'type'} = "tag"; > } The assumption is good; we never show a ref^{} before showing ref itself. But you probably would want to safeguard yourself from future changes by not depending on "immediately after". At least you can check $refs[-1]{'name'} is the same as the unpeeled ref you are looking at, like this: if ($line =~ m/^([0-9a-fA-F]{40})\t$ref_dir\/?([^\^]+)$/) { push @refs, { hash => $1, name => $2 }; } elsif ($line =~ m/^[0-9a-fA-F]{40}\t$ref_dir\/?(.*)\^\{\}$/ && $1 eq $refs[-1]{'name'}) { # most likely a tag is followed by its peeled # one, and when that happens we know the # previous one was of type 'tag'. $refs[$#refs]->{'type'} = "tag"; } ... > + foreach my $ref (@refs) { > + my $ref_file = $ref->{'name'}; > + my $ref_id = $ref->{'hash'}; > - my $type = git_get_type($ref_id) || next; > + my $type = $ref->{'type'} || git_get_type($ref_id) || next; And this is a good incremental change to reduce number of external calls. - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html