From: Junio C Hamano Date: Thu, 13 Oct 2005 05:18:00 GMT Subject: Re: [PATCH] Add git-findtags Message-ID: <7vbr1u6lmf.fsf@assigned-by-dhcp.cox.net> In-Reply-To: <46a038f90510122117mb466722n531dc66bac141ea1@mail.gmail.com> Martin Langhoff writes: > On 10/12/05, Junio C Hamano wrote: >> Martin Langhoff writes: > > I'm preparing a better patch based on your comments, but File::Find is > _not_ my friend, really. I really feel stupid after failing for 1hr to > use it. Something like this? use strict; use File::Find qw(find); my $git_dir = $ENV{GIT_DIR} || '.git'; my @tagfiles = (); find({ follow => 1, wanted => sub { if (-f _) { push @tagfiles, $File::Find::name; } } }, "$git_dir/refs/tags"); for (@tagfiles) { print "$_\n"; } >> BTW, wouldn't it be easier for this particular script, and more >> useful in general, if something like what 'git-rev-parse' does >> for commit objects when given "REV^0" is supported for tags? > > I don't quite follow... What I meant is this. There is an existing notation "^0" which is a postfix "dereference until you get a commit" operator. git-rev-parse --verify refs/tags/v0.99^0 git-cat-file -t refs/tags/v0.99^0 does: 1. reads SHA1 from "refs/tags/v0.99", finds the object; 2. if it is a tag object, find the object pointed by it; if the result is still a tag object, then dereference it repeatedly; 3. if the resulting object is a commit, let the caller to use it; otherwise barf. What _might_ be useful for your application is a similar operator, say, "refs/tags/junio-gpg-pub%", that does: 1. reads SHA1 from "refs/tags/junio-gpg-pub", finds the object; 2. if it is a tag object, find the object pointed by it; if the result is still a tag object, then dereference it repeatedly; 3. do not worry about the type of the result. Just output it. Instead of reserving yet another letter '%', it might be better to use something like "refs/tags/junio-gpg-pub^{tag}" as a notation for this. If you had something like this, you would not have to read tag objects yourself and dereference them by hand.