diff options
Diffstat (limited to 'infra/dgit-repos-server')
-rwxr-xr-x | infra/dgit-repos-server | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/infra/dgit-repos-server b/infra/dgit-repos-server index 2b20d1e..9c7e36d 100755 --- a/infra/dgit-repos-server +++ b/infra/dgit-repos-server @@ -3,7 +3,7 @@ # # git protocol proxy to check dgit pushes etc. # -# Copyright (C) 2014-2016 Ian Jackson +# Copyright (C) 2014-2017,2019 Ian Jackson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -154,8 +154,10 @@ setup_sigwarn(); # VERSION SUITE TAGNAME DELIBERATELIES [...] # POLICY-HOOK-SCRIPT ... push-confirm PACKAGE \ # VERSION SUITE TAGNAME DELIBERATELIES FRESH-REPO|'' [...] +# POLICY-HOOK-SCRIPT ... policy-client-query PACKAGE POL-CL-QUERY [...] # # DELIBERATELIES is like this: --deliberately-foo,--deliberately-bar,... +# POL-CL-QUERY is in the syntax of a package name # # Exit status of policy hook is a bitmask. # Bit weight constants are defined in Dgit.pm. @@ -200,6 +202,26 @@ setup_sigwarn(); # package), it should use DGIT-LIVE-DIR/dgit (etc.), or if that is # ENOENT, use the installed version. # +# POL-CL-QUERY is one of the following: +# +# tainted-objects SUITE +# => [ { "gitobjid": "sha", +# "comment": $string, # in server"s native language, UTF-8 +# "overrides": [ "--deliberately-include-q-h", ... ], +# # optional (may be absent, not null): +# "gitobjtype": "commit", # as from git-cat-file -t +# "time": $time_t, +# "hint": $string, # client should translate if it can +# } } +# +# Arguments after POL-CL-QUERY cannot contain `;` or whitespace; +# they are obtained by dgit-ssh-dispatch by naive whitespace-splitting +# a string from SSH_ORIGINAL_COMMAND. +# +# (Response value is JSON unless otherwise specified.) +# If POL-CL-QUERY is not supported, the server will exit successfully +# producing no output. +# # Mirror hook scripts are invoked like this: # MIRROR-HOOK-SCRIPT DISTRO-DIR ACTION... # and currently there is only one action invoked by dgit-repos-server: @@ -591,7 +613,8 @@ sub parsetag_general ($$) { if ($dgititemfn->()) { } elsif (s/^distro\=(\S+) //) { $distrofn->($1); - } elsif (s/^[-+.=0-9a-z]\S* //) { + } elsif (s/^([-+.=0-9a-z]\S*) //) { + printdebug " parsetag ignoring unrecognised \`$1'\n"; } else { die "unknown dgit info in tag ($_)"; } @@ -783,7 +806,7 @@ sub checktagnoreplay () { # current head for the suite (there must be at least one). # # This prevents any tag implying a NOFFCHECK push being - # replayed to rewind from a different head. + # replayed to overwrite a different head. # # The possibility of an earlier ff-only push being replayed is # eliminated as follows: the tag from such a push would still @@ -1105,7 +1128,7 @@ sub mode_tag2upload () { or $quit->("tag name not for us"); $version = $1; - $version =~ y/_\%\#/:~/d; + $version =~ y/_\%\#/~:/d; my $work = 'work'; @@ -1213,7 +1236,7 @@ END $upstreamc = $1; } elsif (s/^upstream-tag=(\S+) //) { $upstreamt = $1; - } elsif (s/^quilt=([-+0-9a-z]+) //) { + } elsif (s/^--quilt=([-+0-9a-z]+) //) { $quilt = $1; } else { return 0; @@ -1262,7 +1285,7 @@ END $clogf->('Version', $version); $clogf->('Source', $package); - @fetch = (@dgit, qw(fetch), $suite); + @fetch = (@dgit, qw(--for-push fetch), $suite); debugcmd "+",@_; $!=0; $?=-1; if (system @fetch) { @@ -1282,11 +1305,12 @@ END if (defined $quilt) { push @dgitcmd, "--quilt=$quilt"; if ($quilt =~ m/baredebian/) { - die "needed upstream commmitish with --quilt=baredebian"; - push @dgitcmd, "--upstream-commitish=$upstreamc"; + die "needed upstream commmitish with --quilt=baredebian" + unless defined $upstreamc; + push @dgitcmd, "--upstream-commitish=refs/tags/$upstreamt"; } } - push @dgitcmd, qw(push-source --new --overwrite), $suite; + push @dgitcmd, qw(push-source --new --trust-changelog), $suite; runcmd @dgitcmd; |