X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=infra%2Fdgit-repos-policy-debian;h=7ad2c7d57b48145d095e68d8d80fa2e314f42bff;hb=496eedd22761330b59f4f7b81d2b860e154c9b37;hp=a0ac51916027d74e481cad34a47c80a04d2776ae;hpb=4a1b8fa04cf960003af5b2bc3c54687a0e9d6945;p=dgit.git diff --git a/infra/dgit-repos-policy-debian b/infra/dgit-repos-policy-debian index a0ac5191..7ad2c7d5 100755 --- a/infra/dgit-repos-policy-debian +++ b/infra/dgit-repos-policy-debian @@ -2,7 +2,9 @@ # dgit repos policy hook script for Debian use strict; -$SIG{__WARN__} = sub { die $_[0]; }; + +use Debian::Dgit qw(:DEFAULT :policyflags); +setup_sigwarn(); use POSIX; use JSON; @@ -11,7 +13,6 @@ use DBI; use IPC::Open2; use Data::Dumper; -use Debian::Dgit qw(:DEFAULT :policyflags); use Debian::Dgit::Policy::Debian; initdebug('%'); @@ -67,6 +68,11 @@ our %deliberately; # [1] looking for the relevant git tag for the version number and not # caring what that tag refers to. # +# When we are doing a push to a fresh repo, any version will do: in +# this case, this is the first dgit upload of an existing package, +# and we trust that the uploader hasn't included in their git +# history any previous non-dgit uploads. +# # A wrinkle: if we approved a push recently, we treat NEW as having # a version which is in our history. This is because the package may # still be being uploaded. (We record this using the timestamp of the @@ -100,33 +106,41 @@ sub apiquery ($) { return $r; } -sub specific_suite_has_vsn_in_our_history ($) { - my ($suite) = @_; +sub vsn_in_our_history ($) { + my ($vsn) = @_; + + my $tagref = "refs/tags/".debiantag $vsn, $distro; + printdebug " checking history vsn=$vsn tagref=$tagref\n"; + $?=0; my $r = system qw(git show-ref --verify --quiet), $tagref; + return 1 if !$r; + return 0 if $r==256; + die "$pkg tagref $tagref $? $!"; +} + +sub specific_suite_has_suitable_vsn ($$) { + my ($suite, $vsn_check) = @_; # tests $vsn_check->($version) my $in_suite = apiquery "dsc_in_suite/$suite/$pkg"; foreach my $entry (@$in_suite) { my $vsn = $entry->{version}; die "$pkg ?" unless defined $vsn; - my $tagref = "refs/tags/".debiantag $vsn, $distro; - printdebug " checking history suite=$suite vsn=$vsn tagref=$tagref\n"; - $?=0; my $r = system qw(git show-ref --verify --quiet), $tagref; - return 1 if !$r; - next if $r==256; - die "$pkg tagref $tagref $? $!"; + printdebug " checking history found suite=$suite vsn=$vsn\n"; + return 1 if $vsn_check->($vsn); } return 0; } sub new_has_vsn_in_our_history () { - return specific_suite_has_vsn_in_our_history('new'); + return specific_suite_has_suitable_vsn('new', \&vsn_in_our_history); } -sub good_suite_has_vsn_in_our_history () { +sub good_suite_has_suitable_vsn ($) { + my ($vsn_check) = @_; # as for specific_suite_has_specific_vsn my $suites = apiquery "suites"; foreach my $suitei (@$suites) { my $suite = $suitei->{name}; die unless defined $suite; next if $suite =~ m/\bnew$/; - return 1 if specific_suite_has_vsn_in_our_history($suite); + return 1 if specific_suite_has_suitable_vsn($suite, $vsn_check); } return 0; } @@ -221,7 +235,7 @@ sub check_package () { my $age = time - $mtime; printdebug "check_package age=$age\n"; - if (good_suite_has_vsn_in_our_history) { + if (good_suite_has_suitable_vsn(\&vsn_in_our_history)) { chmod $publicmode, "." or die $!; $pkg_secret = 0; return 0; @@ -346,7 +360,7 @@ END printdebug "|< ", $_ if $debuglevel>=2; next if m/^\w+ missing$/; - die unless m/^(\w+) (\w+) (\d+)\s/; + die "($taintid @objscatcmd) $_ ?" unless m/^(\w+) (\w+) (\d+)\s/; my ($objid,$objtype,$nbytes) = ($1,$2,$3); my $drop; @@ -412,7 +426,7 @@ END } if (length $freshrepo) { - if (!good_suite_has_vsn_in_our_history()) { + if (!good_suite_has_suitable_vsn(sub { 1; })) { stat $freshrepo or die "$freshrepo $!"; my $oldmode = ((stat _)[2]); my $oldwrites = $oldmode & 0222;