X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=Debian%2FDgit.pm;h=268439afaa44e5cdfdf4e9addb0dcf3c43a7ca87;hb=36e0e040510db972a92ee25a7eed67c2700407e1;hp=8b29ba2746be30267b9cef7cf73ff60b3d95e25e;hpb=8afbacc6da4ad5ccaf931d113df175bef22cc7b1;p=dgit.git diff --git a/Debian/Dgit.pm b/Debian/Dgit.pm index 8b29ba27..268439af 100644 --- a/Debian/Dgit.pm +++ b/Debian/Dgit.pm @@ -1,10 +1,12 @@ -# +# -*- perl -*- package Debian::Dgit; use strict; use warnings; +use POSIX; + BEGIN { use Exporter (); our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); @@ -12,10 +14,10 @@ BEGIN { $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = qw(debiantag server_branch server_ref - stat_exists + stat_exists git_for_each_ref $package_re $branchprefix); - %EXPORT_TAGS = ( policyflags => qw() ); - @EXPORT_OK = qw(); + %EXPORT_TAGS = ( policyflags => [qw(NOFFCHECK FRESHREPO)] ); + @EXPORT_OK = @{ $EXPORT_TAGS{policyflags} }; } our @EXPORT_OK; @@ -23,17 +25,12 @@ our @EXPORT_OK; our $package_re = '[0-9a-z][-+.0-9a-z]*'; our $branchprefix = 'dgit'; - # policy hook exit status bits -# any unexpected bits mean failure, and then known set bits are ignored - +# see dgit-repos-server head comment for documentation +# 1 is reserved in case something fails with `exit 1' sub NOFFCHECK () { return 2; } -# suppress dgit-repos-server's ff check ("push" only) - sub FRESHREPO () { return 4; } -# blow away repo right away (ie, as if before push or fetch) -# ("check-package" and "push" only) - +# 128 is reserved sub debiantag ($) { my ($v) = @_; @@ -51,4 +48,28 @@ sub stat_exists ($) { die "stat $f: $!"; } +sub git_for_each_ref ($$) { + my ($pattern,$func) = @_; + # calls $func->($objid,$objtype,$fullrefname,$reftail); + # $reftail is RHS of ref after refs/\w+/ + # breaks if $pattern matches any ref `refs/blah' where blah has no `/' + my $fh = new IO::File "-|", qw(git for-each-ref), $pattern or die $!; + while (<$fh>) { + m#^(\w+)\s+(\w+)\s+(refs/\w+/(\S+))\s# or die "$_ ?"; + $func->($1,$2,$3,$4); + } + $!=0; $?=0; close $fh or die "$pattern $? $!"; +} + +sub git_for_each_tag_referring ($$) { + my ($objreferring, $func) = @_; + # calls $func->($objid,$fullrefname,$tagname); + git_for_each_ref('refs/tags', sub { + my ($objid,$objtype,$fullrefname,$tagname) = @_; + next unless $objtype eq 'tag'; + next if defined $objreferring and $objid ne $objreferring; + $func->($objid,$fullrefname,$tagname); + }); +} + 1;