chiark / gitweb /
failedcmd prints $us, not $_[0] - ie, dgit doesn't pretend, in the error message...
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 5b99ed1cde43acf7e58f89886542bda82fd0005f..0182b6f9e4fe7e1842154c2d636320b6bf1d5501 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -332,7 +332,7 @@ sub printcmd {
 }
 
 sub failedcmd {
-    { local ($!); printcmd \*STDERR, "$_[0]: failed command:", @_ or die $!; };
+    { local ($!); printcmd \*STDERR, "$us: failed command:", @_ or die $!; };
     if ($!) {
        fail "failed to fork/exec: $!";
     } elsif (!($? & 0xff)) {
@@ -457,6 +457,8 @@ our %defcfg = ('dgit.default.distro' => 'debian',
               '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.backports-quirk' => '%-backports*',
+ 'dgit-distro.debian-backports.mirror' => 'http://backports.debian.org/debian-backports/',
               'dgit-distro.test-dummy.ssh' => "$td/ssh",
               'dgit-distro.test-dummy.username' => "alice",
               'dgit-distro.test-dummy.git-check' => "ssh-cmd",
@@ -489,16 +491,41 @@ sub cfg {
     badcfg "need value for one of: @_";
 }
 
-sub access_distro () {
+sub access_basedistro () {
     return cfg("dgit-suite.$isuite.distro",
               "dgit.default.distro");
 }
 
+sub access_quirk () {
+    # returns (quirk name, distro to use instead, quirk-specific info)
+    my $basedistro = access_basedistro();
+    my $backports_quirk = cfg("dgit-distro.$basedistro.backports-quirk",
+                             'RETURN-UNDEF');
+    if (defined $backports_quirk) {
+       my $re = $backports_quirk;
+       $re =~ s/[^-0-9a-z_\%*]/\\$&/ig;
+       $re =~ s/\*/.*/g;
+       $re =~ s/\%/([-0-9a-z_]+)/ or badcfg "backports-quirk needs \%";
+       if ($isuite =~ m/^$re$/) {
+           return ('backports',"$basedistro-backports",$1);
+       }
+    }
+    return ('none',$basedistro);
+}
+
+sub access_distro () {
+    return (access_quirk())[1];
+}
+
 sub access_cfg (@) {
     my (@keys) = @_;
+    my $basedistro = access_basedistro();
     my $distro = $idistro || access_distro();
-    my $value = cfg(map { ("dgit-distro.$distro.$_",
-                          "dgit.default.$_") } @keys);
+    my $value = cfg(map {
+       ("dgit-distro.$distro.$_",
+        "dgit-distro.$basedistro.$_",
+        "dgit.default.$_")
+                   } @keys);
     return $value;
 }
 
@@ -600,7 +627,7 @@ sub archive_query ($) {
     my ($method) = @_;
     my $query = access_cfg('archive-query','RETURN-UNDEF');
     if (!defined $query) {
-       my $distro = access_distro();
+       my $distro = access_basedistro();
        if ($distro eq 'debian') {
            $query = "sshpsql:".
                access_someuserhost('sshpsql').':'.
@@ -1734,6 +1761,17 @@ sub build_maybe_quilt_fixup () {
     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';
@@ -1793,9 +1831,21 @@ sub quilt_fixup_editor () {
     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';
@@ -1807,6 +1857,13 @@ sub changesopts () {
     my @opts =@changesopts[1..$#changesopts];
     if (!defined $changes_since_version) {
        my @vsns = archive_query('archive_query');
+       my @quirk = access_quirk();
+       if ($quirk[0] eq 'backports') {
+           local $isuite = $quirk[2];
+           local $csuite;
+           canonicalise_suite();
+           push @vsns, archive_query('archive_query');
+       }
        if (@vsns) {
            @vsns = map { $_->[0] } @vsns;
            @vsns = sort { -version_compare_string($a, $b) } @vsns;
@@ -1824,16 +1881,12 @@ sub changesopts () {
 }
 
 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),
@@ -1855,12 +1908,6 @@ sub build_source {
        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 "..";