chiark / gitweb /
infra: Provide get-dm-txt
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 6e175ad2b1f08b03088cd57f63087bc62c20fdb3..38b02e4e1b4ca07f8163b9e0ad440a2df0d1b24b 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -102,6 +102,7 @@ our $remotename = 'dgit';
 our @ourdscfield = qw(Dgit Vcs-Dgit-Master);
 our $branchprefix = 'dgit';
 our $csuite;
+our $instead_distro;
 
 sub lbranch () { return "$branchprefix/$csuite"; }
 my $lbranch_re = '^refs/heads/'.$branchprefix.'/([^/.]+)$';
@@ -595,15 +596,16 @@ sub access_distros () {
     # Returns list of distros to try, in order
     #
     # We want to try:
+    #    0. `instead of' distro name(s) we have been pointed to
     #    1. the access_quirk distro, if any
     #    2a. the user's specified distro, or failing that  } basedistro
     #    2b. the distro calculated from the suite          }
     my @l = access_basedistro();
 
     my (undef,$quirkdistro) = access_quirk();
-    unshift @l, $quirkdistro if defined $quirkdistro;
-
-    return @l;
+    unshift @l, $quirkdistro;
+    unshift @l, $instead_distro;
+    return grep { defined } @l;
 }
 
 sub access_cfg (@) {
@@ -655,9 +657,16 @@ sub access_cfg_ssh () {
     }
 }
 
+sub access_runeinfo ($) {
+    my ($info) = @_;
+    return ": dgit ".access_basedistro()." $info ;";
+}
+
 sub access_someuserhost ($) {
     my ($some) = @_;
-    my $user = access_cfg("$some-user",'username');
+    my $user = access_cfg("$some-user-force", 'RETURN-UNDEF');
+    defined($user) && length($user) or
+       $user = access_cfg("$some-user",'username');
     my $host = access_cfg("$some-host");
     return length($user) ? "$user\@$host" : $host;
 }
@@ -829,7 +838,7 @@ sub sshpsql ($$$) {
     my ($userhost,$dbname) = ($`,$'); #';
     my @rows;
     my @cmd = (access_cfg_ssh, $userhost,
-              ": dgit ssh-psql $runeinfo ;".
+              access_runeinfo("ssh-psql $runeinfo").
               " export LANG=C;".
               " ".shellquote qw(psql -A), $dbname, qw(-c), $sql);
     printcmd(\*DEBUG,$debugprefix."|",@cmd) if $debug>0;
@@ -971,16 +980,25 @@ sub get_archive_dsc () {
     $dsc = undef;
 }
 
+sub check_for_git ();
 sub check_for_git () {
     # returns 0 or 1
     my $how = access_cfg('git-check');
     if ($how eq 'ssh-cmd') {
        my @cmd =
            (access_cfg_ssh, access_gituserhost(),
-            ": dgit git-check $package ;".
+            access_runeinfo("git-check $package").
             " set -e; cd ".access_cfg('git-path').";".
             " if test -d $package.git; then echo 1; else echo 0; fi");
        my $r= cmdoutput @cmd;
+       if ($r =~ m/^divert (\w+)$/) {
+           my $divert=$1;
+           my ($usedistro,) = access_distros();
+           $instead_distro= cfg("dgit-distro.$usedistro.diverts.$divert");
+           $instead_distro =~ s{^/}{ access_basedistro()."/" }e;
+           printdebug "diverting $divert so using distro $instead_distro\n";
+           return check_for_git();
+       }
        failedcmd @cmd unless $r =~ m/^[01]$/;
        return $r+0;
     } elsif ($how eq 'true') {
@@ -997,7 +1015,7 @@ sub create_remote_git_repo () {
     if ($how eq 'ssh-cmd') {
        runcmd_ordryrun
            (access_cfg_ssh, access_gituserhost(),
-            " : dgit git-create $package ; ".
+            access_runeinfo("git-create $package").
             "set -e; cd ".access_cfg('git-path').";".
             " cp -a _template $package.git");
     } elsif ($how eq 'true') {