chiark / gitweb /
Split brain: When pushing, find the dgit view in the cache
[dgit.git] / dgit
diff --git a/dgit b/dgit
index f60180c2b5e7a2ada68c4d688899851e519b6f94..d40a178a9cf78c42829265d746dd02d3d4ef19c7 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -398,7 +398,7 @@ our ($dscdata,$dscurl,$dsc,$dsc_checked,$skew_warning_vsn);
 
 sub runcmd {
     debugcmd "+",@_;
-    $!=0; $?=0;
+    $!=0; $?=-1;
     failedcmd @_ if system @_;
 }
 
@@ -1160,7 +1160,7 @@ sub check_for_git () {
             " 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+)$/) {
+       if (defined $r and $r =~ m/^divert (\w+)$/) {
            my $divert=$1;
            my ($usedistro,) = access_distros();
            # NB that if we are pushing, $usedistro will be $distro/push
@@ -1169,7 +1169,7 @@ sub check_for_git () {
            progress "diverting to $divert (using config for $instead_distro)";
            return check_for_git();
        }
-       failedcmd @cmd unless $r =~ m/^[01]$/;
+       failedcmd @cmd unless defined $r and $r =~ m/^[01]$/;
        return $r+0;
     } elsif ($how eq 'url') {
        my $prefix = access_cfg('git-check-url','git-url');
@@ -1259,7 +1259,7 @@ sub remove_stray_gits () {
 sub mktree_in_ud_from_only_subdir () {
     # changes into the subdir
     my (@dirs) = <*/.>;
-    die unless @dirs==1;
+    die "@dirs ?" unless @dirs==1;
     $dirs[0] =~ m#^([^/]+)/\.$# or die;
     my $dir = $1;
     changedir $dir;
@@ -1782,9 +1782,9 @@ sub check_not_dirty () {
 
     my @cmd = (@git, qw(diff --quiet HEAD));
     debugcmd "+",@cmd;
-    $!=0; $?=0; system @cmd;
-    return if !$! && !$?;
-    if (!$! && $?==256) {
+    $!=0; $?=-1; system @cmd;
+    return if !$?;
+    if ($?==256) {
        fail "working tree is dirty (does not match HEAD)";
     } else {
        failedcmd @cmd;
@@ -1999,7 +1999,22 @@ END
 
     if (madformat($format)) {
        # user might have not used dgit build, so maybe do this now:
-       commit_quilty_patch();
+       if (quiltmode_splitbrain()) {
+           my $upstreamversion = $clogp->{Version};
+           $upstreamversion =~ s/-[^-]*$//;
+           changedir $ud;
+           quilt_make_fake_dsc($upstreamversion);
+           my ($dgitview, $cachekey) =
+               quilt_check_splitbrain_cache($head, $upstreamversion);
+           $dgitview or fail
+ "--quilt=$quilt_mode but no cached dgit view:
+ perhaps tree changed since dgit build[-source] ?";
+           $split_brain = 1;
+           changedir '../../../..';
+           prep_ud(); # so _only_subdir() works, below
+       } else {
+           commit_quilty_patch();
+       }
     }
 
     die 'xxx fast forward (should not depend on quilt mode, but will always be needed if we did $split_brain)' if $split_brain;
@@ -2015,7 +2030,7 @@ END
     my $diffopt = $debuglevel>0 ? '--exit-code' : '--quiet';
     my @diffcmd = (@git, qw(diff), $diffopt, $tree);
     debugcmd "+",@diffcmd;
-    $!=0; $?=0;
+    $!=0; $?=-1;
     my $r = system @diffcmd;
     if ($r) {
        if ($r==256) {