die $!;
}
-sub reject ($) {
+sub recorderror ($) {
my ($why) = @_;
my $w = $ENV{'DGIT_DRS_WORK'}; # we are in stunthook
if (defined $w) {
- open REJ, ">", "$w/drs-reject" or die $!;
- print REJ $why, "\n" or die $!;
- close REJ or die $!;
+ chomp $why;
+ open ERR, ">", "$w/drs-error" or die $!;
+ print ERR $why, "\n" or die $!;
+ close ERR or die $!;
+ return 1;
}
+ return 0;
+}
+
+sub reject ($) {
+ my ($why) = @_;
+ recorderror "reject: $why";
die "dgit-repos-server: reject: $why\n";
}
sub maybeinstallprospective () {
return if $destrepo eq $realdestrepo;
- if (open REJ, "<", "$workrepo/drs-reject") {
- $!=0; my $why = <REJ>;
- chomp $why or die $!;
- reject $why;
+ if (open REJ, "<", "$workrepo/drs-error") {
+ local $/ = undef;
+ my $msg = <REJ>;
+ REJ->error and die $!;
+ print STDERR $msg;
+ exit 1;
} else {
$!==&ENOENT or die $!;
}
}
}
$!=0; $_=<T>; defined or die $!;
- m/^($package_re) release (\S+) for (\S+) \[dgit\]$/ or
+ m/^($package_re) release (\S+) for \S+ \((\S+)\) \[dgit\]$/ or
reject "tag message not in expected format";
die unless $1 eq $package;
debug " checksig keyring $keyringfile...";
- open P, "-|", (qw(gpgv --status-fd=1 --keyring),
+ our @cmd = (qw(gpgv --status-fd=1 --keyring),
$keyringfile,
- qw(dgit-tmp/plaintext.asc dgit-tmp/plaintext))
+ qw(dgit-tmp/plaintext.asc dgit-tmp/plaintext));
+ debugcmd @cmd;
+
+ open P, "-|", @cmd
or die $!;
while (<P>) {
- next unless s/^\[GNUPG:\]: //;
+ next unless s/^\[GNUPG:\] //;
chomp or die;
debug " checksig| $_";
my @l = split / /, $_;
}
sub checksuite () {
- debug "checksuite";
+ debug "checksuite ($suitesfile)";
open SUITES, "<", $suitesfile or die $!;
while (<SUITES>) {
chomp;
reject "unknown suite";
}
+sub tagh1 ($) {
+ my ($tag) = @_;
+ my $vals = $tagh{$tag};
+ reject "missing tag $tag in signed tag object" unless $vals;
+ reject "multiple tags $tag in signed tag object" unless @$vals == 1;
+ return $vals->[0];
+}
+
sub checks () {
debug "checks";
checksuite();
sub stunthook () {
debug "stunthook";
- print Dumper(\$ENV{GIT_DIR});
chdir $workrepo or die "chdir $workrepo: $!";
mkdir "dgit-tmp" or $!==EEXIST or die $!;
readupdates();
defined($destrepo = $ENV{'DGIT_DRS_DEST'}) or die;
defined($keyrings = $ENV{'DGIT_DRS_KEYRINGS'}) or die $!;
open STDOUT, ">&STDERR" or die $!;
- stunthook();
+ eval {
+ stunthook();
+ };
+ if ($@) {
+ recorderror "$@" or die;
+ die $@;
+ }
exit 0;
}