X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=infra%2Fdgit-repos-server;h=ae25aaa3bc1c7579fdc4ffcd302b4acf281ebda5;hb=8c95b29b79a159e5153f51affece9cf9314b4d84;hp=e2bec01e810b1dc512a2e7851a66934ae466282d;hpb=683b0eb026fa6b43cc0a9ae122764f9a5d031f59;p=dgit.git diff --git a/infra/dgit-repos-server b/infra/dgit-repos-server index e2bec01e..ae25aaa3 100755 --- a/infra/dgit-repos-server +++ b/infra/dgit-repos-server @@ -62,7 +62,7 @@ $SIG{__WARN__} = sub { die $_[0]; }; # as a result of this the stunt pre-receive hook runs; it does this: # + understand what refs we are allegedly updating and # check some correspondences: -# * we are updating only refs/tags/debian/* and refs/dgit/* +# * we are updating only refs/tags/DISTRO/* and refs/dgit/* # * and only one of each # * and the tag does not already exist # and @@ -163,7 +163,8 @@ $SIG{__WARN__} = sub { die $_[0]; }; # appropriate lock. # # If policy hook wants to run dgit (or something else in the dgit -# package), it should use DGIT-LIVE-DIR/dgit (etc.) +# package), it should use DGIT-LIVE-DIR/dgit (etc.), or if that is +# ENOENT, use the installed version. use POSIX; @@ -189,7 +190,7 @@ our $keyrings; our @lockfhs; our @deliberatelies; -our %supersedes; +our %previously; our $policy; our @policy_args; @@ -290,10 +291,11 @@ sub mkemptyrepo ($$) { sub mkrepo_fromtemplate ($) { my ($dir) = @_; my $template = "$dgitrepos/_template"; - locksometree($template); + my $templatelock = locksometree($template); printdebug "copy template $template -> $dir\n"; my $r = system qw(cp -a --), $template, $dir; !$r or die "create new repo $dir failed: $r $!"; + close $templatelock; } sub movetogarbage () { @@ -321,7 +323,7 @@ sub movetogarbage () { ensuredir "$dgitrepos/_removed-tags"; open PREVIOUS, ">>", removedtagsfile or die removedtagsfile." $!"; - git_for_each_ref('refs/tags/'.debiantag('*'), sub { + git_for_each_ref('refs/tags/'.debiantag('*',$distro), sub { my ($objid,$objtype,$fullrefname,$reftail) = @_; print PREVIOUS "\n$objid $reftail .\n" or die $!; }, $real); @@ -456,7 +458,7 @@ sub readupdates () { printdebug " upd.| $_\n"; m/^(\S+) (\S+) (\S+)$/ or die "$_ ?"; my ($old, $sha1, $refname) = ($1, $2, $3); - if ($refname =~ m{^refs/tags/(?=debian/)}) { + if ($refname =~ m{^refs/tags/(?=$distro/)}) { reject "pushing multiple tags!" if defined $tagname; $tagname = $'; #'; $tagval = $sha1; @@ -515,9 +517,9 @@ sub parsetag () { die "$1 != $distro" unless $1 eq $distro; } elsif (s/^(--deliberately-$deliberately_re) //) { push @deliberatelies, $1; - } elsif (s/^supersede:(\S+)=(\w+) //) { - die "supersede $1 twice" if defined $supersedes{$1}; - $supersedes{$1} = $2; + } elsif (s/^previously:(\S+)=(\w+) //) { + die "previously $1 twice" if defined $previously{$1}; + $previously{$1} = $2; } elsif (s/^[-+.=0-9a-z]\S* //) { } else { die "unknown dgit info in tag ($_)"; @@ -707,17 +709,17 @@ sub checktagnoreplay () { my $nchecked = 0; my @problems; - my $check_ref_superseded= sub { + my $check_ref_previously= sub { my ($objid,$objtype,$fullrefname,$reftail) = @_; my $supkey = $fullrefname; $supkey =~ s{^refs/}{} or die "$supkey $objid ?"; - my $supobjid = $supersedes{$supkey}; + my $supobjid = $previously{$supkey}; if (!defined $supobjid) { printdebug "checktagnoreply - missing\n"; - push @problems, "does not supersede $supkey"; + push @problems, "does not declare previously $supkey"; } elsif ($supobjid ne $objid) { - push @problems, "supersedes $supkey=$supobjid". - " but previously $supkey=$objid"; + push @problems, "declared previously $supkey=$supobjid". + " but actually previously $supkey=$objid"; } else { $nchecked++; } @@ -725,11 +727,11 @@ sub checktagnoreplay () { if ($policy & FRESHREPO) { foreach my $kind (qw(tags heads)) { - git_for_each_ref("refs/$kind", $check_ref_superseded); + git_for_each_ref("refs/$kind", $check_ref_previously); } } else { my $branch= server_branch($suite); - my $branchhead= git_get_ref($branch); + my $branchhead= git_get_ref(server_ref($suite)); if (!length $branchhead) { # No such branch - NOFFCHECK was unnecessary. Oh well. printdebug "checktagnoreplay - not FRESHREPO, new branch, ok\n"; @@ -738,10 +740,10 @@ sub checktagnoreplay () { " checking for overwriting refs/$branch=$branchhead\n"; git_for_each_tag_referring($branchhead, sub { my ($tagobjid,$refobjid,$fullrefname,$tagname) = @_; - $check_ref_superseded->($tagobjid,undef,$fullrefname,undef); + $check_ref_previously->($tagobjid,undef,$fullrefname,undef); }); printdebug "checktagnoreplay - not FRESHREPO, nchecked=$nchecked"; - push @problems, "does not supersede any tag". + push @problems, "does not declare previously any tag". " referring to branch head $branch=$branchhead" unless $nchecked; } @@ -771,11 +773,9 @@ sub checks () { tagh1('object') eq $commit or reject "tag refers to wrong commit"; tagh1('tag') eq $tagname or reject "tag name in tag is wrong"; - my $v = $version; - $v =~ y/~:/_%/; - - printdebug "translated version $v\n"; - $tagname eq "debian/$v" or die; + my $expecttagname = debiantag $version, $distro; + printdebug "expected tag $expecttagname\n"; + $tagname eq $expecttagname or die; lockrealtree();