X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=0182b6f9e4fe7e1842154c2d636320b6bf1d5501;hp=7752d824f6c30023304ac8a0716d84f67d41a2eb;hb=1433215598fbec3c84be732ca5379f6eb236e775;hpb=5dbf5d3d2ef07b059c732abe77d1657e3fc3f714 diff --git a/dgit b/dgit index 7752d824..0182b6f9 100755 --- 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'; @@ -1819,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;