our $sign = 1;
our $dryrun_level = 0;
our $changesfile;
+our $buildproductsdir = '..';
our $new_package = 0;
our $ignoredirty = 0;
our $noquilt = 0;
exit 0;
}
+our $td = $ENV{DGIT_TEST_DUMMY_DIR} || "DGIT_TEST_DUMMY_DIR-unset";
+
our %defcfg = ('dgit.default.distro' => 'debian',
'dgit.default.username' => '',
'dgit.default.archive-query-default-component' => 'main',
'dgit-distro.debian.sshpsql-host' => 'coccia.debian.org',
'dgit-distro.debian.sshpsql-dbname' => 'service=projectb',
'dgit-distro.debian.upload-host' => 'ftp-master', # for dput
- 'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/');
+ 'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/',
+ 'dgit-distro.test-dummy.ssh' => "$td/ssh",
+ 'dgit-distro.test-dummy.username' => "alice",
+ 'dgit-distro.test-dummy.git-check' => "ssh-cmd",
+ 'dgit-distro.test-dummy.git-create' => "ssh-cmd",
+ 'dgit-distro.test-dummy.git-url' => "$td/git",
+ 'dgit-distro.test-dummy.git-host' => "git",
+ 'dgit-distro.test-dummy.git-path' => "$td/git",
+ 'dgit-distro.test-dummy.archive-query' => "dummycat:$td/aq",
+ 'dgit-distro.test-dummy.mirror' => "file://$td/mirror/",
+ 'dgit-distro.test-dummy.upload-host' => 'test-dummy',
+ );
sub cfg {
foreach my $c (@_) {
$l =~ m{^ \s*( [^ \t|]+ )\s* \|
\s*( [^ \t|]+ )\s* \|
\s*( [^ \t|/]+ )(?:/([^ \t|/]+))? \s* \|
- \s*( [^ \t|]+ )\s* }x or die "$rmad $?";
+ \s*( [^ \t|]+ )\s* }x or die "$rmad ?";
$1 eq $package or die "$rmad $package ?";
my $vsn = $2;
my $newsuite = $3;
my ($userhost,$dbname) = ($`,$'); #';
my @rows;
my @cmd = (access_cfg_ssh, $userhost,
- shellquote qw(psql -A), $dbname, qw(-c), $sql);
+ "export LANG=C; ".shellquote qw(psql -A), $dbname, qw(-c), $sql);
printcmd(\*DEBUG,$debugprefix."|",@cmd) if $debug>0;
open P, "-|", @cmd or die $!;
while (<P>) {
printdebug("$debugprefix>|$_|\n");
push @rows, $_;
}
- $!=0; $?=0; close P or die "$! $?";
+ $!=0; $?=0; close P or failedcmd @cmd;
@rows or die;
my $nrows = pop @rows;
$nrows =~ s/^\((\d+) rows?\)$/$1/ or die "$nrows ?";
return $rows[0];
}
+sub canonicalise_suite_dummycat ($$) {
+ my ($proto,$data) = @_;
+ my $dpath = "$data/suite.$isuite";
+ if (!open C, "<", $dpath) {
+ $!==ENOENT or die "$dpath: $!";
+ printdebug "dummycat canonicalise_suite $isuite $dpath ENOENT\n";
+ return $isuite;
+ }
+ $!=0; $_ = <C>;
+ chomp or die "$dpath: $!";
+ close C;
+ printdebug "dummycat canonicalise_suite $isuite $dpath = $_\n";
+ return $_;
+}
+
+sub archive_query_dummycat ($$) {
+ my ($proto,$data) = @_;
+ canonicalise_suite();
+ my $dpath = "$data/package.$csuite.$package";
+ if (!open C, "<", $dpath) {
+ $!==ENOENT or die "$dpath: $!";
+ printdebug "dummycat query $csuite $package $dpath ENOENT\n";
+ return ();
+ }
+ my @rows;
+ while (<C>) {
+ next if m/^\#/;
+ next unless m/\S/;
+ die unless chomp;
+ printdebug "dummycat query $csuite $package $dpath | $_\n";
+ my @row = split /\s+/, $_;
+ @row==2 or die "$dpath: $_ ?";
+ push @rows, \@row;
+ }
+ C->error and die "$dpath: $!";
+ close C;
+ return sort { -version_compare_string($a->[0],$b->[0]); } @rows;
+}
+
sub canonicalise_suite () {
return if defined $csuite;
fail "cannot operate on $isuite suite" if $isuite eq 'UNRELEASED';
my ($clogp, $cversion, $tag, $dscfn) =
push_parse_changelog("$clogpfn");
- stat "../$dscfn" or
+ my $dscpath = "$buildproductsdir/$dscfn";
+ stat $dscpath or
fail "looked for .dsc $dscfn, but $!;".
" maybe you forgot to build";
- responder_send_file('dsc', "../$dscfn");
+ responder_send_file('dsc', $dscpath);
- push_parse_dsc("../$dscfn", $dscfn, $cversion);
+ push_parse_dsc($dscpath, $dscfn, $cversion);
my $format = getfield $dsc, 'Format';
printdebug "format $format\n";
check_not_dirty();
changedir $ud;
progress "checking that $dscfn corresponds to HEAD";
- runcmd qw(dpkg-source -x --), "../../../../$dscfn";
+ runcmd qw(dpkg-source -x --),
+ $dscpath =~ m#^/# ? $dscpath : "../../../$dscpath";
my ($tree,$dir) = mktree_in_ud_from_only_subdir();
changedir '../../../..';
my @diffcmd = (@git, qw(diff --exit-code), $tree);
# (uploadbranch());
my $head = rev_parse('HEAD');
if (!$changesfile) {
- my $multi = "../${package}_".(stripepoch $cversion)."_multi.changes";
+ my $multi = "$buildproductsdir/".
+ "${package}_".(stripepoch $cversion)."_multi.changes";
if (stat "$multi") {
$changesfile = $multi;
} else {
$!==&ENOENT or die "$multi: $!";
my $pat = "${package}_".(stripepoch $cversion)."_*.changes";
- my @cs = glob "../$pat";
+ my @cs = glob "$buildproductsdir/$pat";
fail "failed to find unique changes file".
- " (looked for $pat in .., or $multi);".
+ " (looked for $pat in $buildproductsdir, or $multi);".
" perhaps you need to use dgit -C"
unless @cs==1;
($changesfile) = @cs;
}
+ } else {
+ $changesfile = "$buildproductsdir/$changesfile";
}
responder_send_file('changes',$changesfile);
} else {
$tagobjfn =
push_mktag($head,$clogp,$tag,
- "../$dscfn",
+ $dscpath,
$changesfile,$changesfile,
$tfn);
}
if (!$we_are_responder) {
if (act_local()) {
- rename "../$dscfn.tmp","../$dscfn" or die "$dscfn $!";
+ rename "$dscpath.tmp",$dscpath or die "$dscfn $!";
} else {
- progress "[new .dsc left in $dscfn.tmp]";
+ progress "[new .dsc left in $dscpath.tmp]";
}
}
if ($we_are_responder) {
my $dryrunsuffix = act_local() ? "" : ".tmp";
responder_receive_files('signed-dsc-changes',
- "../$dscfn$dryrunsuffix",
+ "$dscpath$dryrunsuffix",
"$changesfile$dryrunsuffix");
} else {
sign_changes $changesfile;
chomp;
return unless madformat($_);
# sigh
+
+ my @cmd = (@git, qw(ls-files --exclude-standard -iodm));
+ my $problems = cmdoutput @cmd;
+ if (length $problems) {
+ print STDERR "problematic files:\n";
+ print STDERR " $_\n" foreach split /\n/, $problems;
+ fail "Cannot do quilt fixup in tree containing ignored files. ".
+ "Perhaps your package's clean target is broken, in which".
+ " case -wg (which says to use git-clean -xdf) may help.";
+ }
+
my $clogp = parsechangelog();
my $version = getfield $clogp, 'Version';
my $author = getfield $clogp, 'Maintainer';
exit 0;
}
+sub clean_tree () {
+ if ($cleanmode eq 'dpkg-source') {
+ runcmd_ordryrun_local @dpkgbuildpackage, qw(-T clean);
+ } elsif ($cleanmode eq 'git') {
+ runcmd_ordryrun_local @git, qw(clean -xdf);
+ } elsif ($cleanmode eq 'none') {
+ } else {
+ die "$cleanmode ?";
+ }
+}
+
sub build_prep () {
badusage "-p is not allowed when building" if defined $package;
check_not_dirty();
+ clean_tree();
my $clogp = parsechangelog();
$isuite = getfield $clogp, 'Distribution';
$package = getfield $clogp, 'Source';
my @vsns = archive_query('archive_query');
if (@vsns) {
@vsns = map { $_->[0] } @vsns;
- @vsns = sort { version_compare_string($a, $b) } @vsns;
+ @vsns = sort { -version_compare_string($a, $b) } @vsns;
$changes_since_version = $vsns[0];
progress "changelog will contain changes since $vsns[0]";
} else {
}
sub cmd_build {
- badusage "dgit build implies --clean=dpkg-source"
- if $cleanmode ne 'dpkg-source';
build_prep();
runcmd_ordryrun_local @dpkgbuildpackage, qw(-us -uc), changesopts(), @ARGV;
printdone "build successful\n";
}
sub cmd_git_build {
- badusage "dgit git-build implies --clean=dpkg-source"
- if $cleanmode ne 'dpkg-source';
build_prep();
my @cmd =
(qw(git-buildpackage -us -uc --git-no-sign-tags),
runcmd_ordryrun_local (@dpkgbuildpackage, qw(-us -uc -S)),
changesopts();
} else {
- if ($cleanmode eq 'git') {
- runcmd_ordryrun_local @git, qw(clean -xdf);
- } elsif ($cleanmode eq 'none') {
- } else {
- die "$cleanmode ?";
- }
my $pwd = cmdoutput qw(env - pwd);
my $leafdir = basename $pwd;
changedir "..";
} elsif (m/^--since-version=([^_]+|_)$/) {
push @ropts, $_;
$changes_since_version = $1;
- } elsif (m/^--(\w+)=(.*)/s &&
+ } elsif (m/^--([-0-9a-z]+)=(.*)/s &&
($om = $opts_opt_map{$1}) &&
length $om->[0]) {
push @ropts, $_;
$om->[0] = $2;
- } elsif (m/^--(\w+):(.*)/s &&
+ } elsif (m/^--([-0-9a-z]+):(.*)/s &&
!$opts_opt_cmdonly{$1} &&
($om = $opts_opt_map{$1})) {
push @ropts, $_;
} elsif (m/^--distro=(.*)/s) {
push @ropts, $_;
$idistro = $1;
+ } elsif (m/^--build-products-dir=(.*)/s) {
+ push @ropts, $_;
+ $buildproductsdir = $1;
} elsif (m/^--clean=(dpkg-source|git|none)$/s) {
push @ropts, $_;
$cleanmode = $1;
} elsif (s/^-C(.*)//s) {
push @ropts, $&;
$changesfile = $1;
+ if ($changesfile =~ s#^(.*)/##) {
+ $buildproductsdir = $1;
+ }
} elsif (s/^-k(.*)//s) {
$keyid=$1;
} elsif (s/^-wn//s) {