X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=50c45d7a4168045b6cc4e43a6ea557012bafd488;hp=7752d824f6c30023304ac8a0716d84f67d41a2eb;hb=44a2c13511958d2dec9de240fbbcc1102869b9a8;hpb=5dbf5d3d2ef07b059c732abe77d1657e3fc3f714 diff --git a/dgit b/dgit index 7752d824..50c45d7a 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)) { @@ -448,15 +448,18 @@ our %defcfg = ('dgit.default.distro' => 'debian', 'dgit.default.username' => '', 'dgit.default.archive-query-default-component' => 'main', 'dgit.default.ssh' => 'ssh', + 'dgit-distro.debian.git-user' => 'dgit', 'dgit-distro.debian.git-host' => 'git.debian.org', 'dgit-distro.debian.git-proto' => 'git+ssh://', - 'dgit-distro.debian.git-path' => '/git/dgit-repos/repos', - 'dgit-distro.debian.git-check' => 'ssh-cmd', - 'dgit-distro.debian.git-create' => 'ssh-cmd', + 'dgit-distro.debian.git-path' => '/dgit-repos/', + 'dgit-distro.debian.git-check' => 'true', + 'dgit-distro.debian.git-create' => 'true', '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.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 +492,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 +628,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').':'. @@ -810,6 +838,8 @@ sub check_for_git () { my $r= cmdoutput @cmd; failedcmd @cmd unless $r =~ m/^[01]$/; return $r+0; + } elsif ($how eq 'true') { + return 1; } else { badcfg "unknown git-check \`$how'"; } @@ -822,6 +852,8 @@ sub create_remote_git_repo () { (access_cfg_ssh, access_gituserhost(), "set -e; cd ".access_cfg('git-path').";". " cp -a _template $package.git"); + } elsif ($how eq 'true') { + # nothing to do } else { badcfg "unknown git-create \`$how'"; } @@ -1403,27 +1435,24 @@ sub dopush () { if (!check_for_git()) { create_remote_git_repo(); } - runcmd_ordryrun @git, qw(push),access_giturl(),"HEAD:".rrref(); + runcmd_ordryrun @git, qw(push),access_giturl(), + "HEAD:".rrref(), "refs/tags/$tag"; runcmd_ordryrun @git, qw(update-ref -m), 'dgit push', lrref(), 'HEAD'; - if (!$we_are_responder) { - if (act_local()) { - rename "$dscpath.tmp",$dscpath or die "$dscfn $!"; - } else { - progress "[new .dsc left in $dscpath.tmp]"; - } - } - if ($we_are_responder) { my $dryrunsuffix = act_local() ? "" : ".tmp"; responder_receive_files('signed-dsc-changes', "$dscpath$dryrunsuffix", "$changesfile$dryrunsuffix"); } else { + if (act_local()) { + rename "$dscpath.tmp",$dscpath or die "$dscfn $!"; + } else { + progress "[new .dsc left in $dscpath.tmp]"; + } sign_changes $changesfile; } - runcmd_ordryrun @git, qw(push),access_giturl(),"refs/tags/$tag"; my $host = access_cfg('upload-host','RETURN-UNDEF'); my @hostarg = defined($host) ? ($host,) : (); runcmd_ordryrun @dput, @hostarg, $changesfile; @@ -1734,6 +1763,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 +1859,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;