chiark / gitweb /
Split brain: Pass $clogp to quiltify_splitbrain (nfc)
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 4ac5748b15f2cf8a45dec2d095a2436b40a92a53..29cf5076acd0942d746dda59249ef3c7469115c7 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -70,6 +70,8 @@ our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)");
 our $suite_re = '[-+.0-9a-z]+';
 our $cleanmode_re = 'dpkg-source(?:-d)?|git|git-ff|check|none';
 
+our $git_authline_re = '^([^<>]+) \<(\S+)\> (\d+ [-+]\d+)$';
+
 our (@git) = qw(git);
 our (@dget) = qw(dget);
 our (@curl) = qw(curl -f);
@@ -83,6 +85,7 @@ our (@dpkgbuildpackage) = qw(dpkg-buildpackage -i\.git/ -I.git);
 our (@dpkgsource) = qw(dpkg-source -i\.git/ -I.git);
 our (@dpkggenchanges) = qw(dpkg-genchanges);
 our (@mergechanges) = qw(mergechanges -f);
+our (@gbppq) = qw(gbp-pq);
 our (@changesopts) = ('');
 
 our %opts_opt_map = ('dget' => \@dget, # accept for compatibility
@@ -114,6 +117,7 @@ autoflush STDOUT 1;
 
 our $supplementary_message = '';
 our $need_split_build_invocation = 0;
+our $split_brain = 0;
 
 END {
     local ($@, $?);
@@ -1314,9 +1318,10 @@ sub clogp_authline ($) {
     $author =~ s#,.*##ms;
     my $date = cmdoutput qw(date), '+%s %z', qw(-d), getfield($clogp,'Date');
     my $authline = "$author $date";
-    $authline =~ m/^[^<>]+ \<\S+\> \d+ [-+]\d+$/ or
+    $authline =~ m/$git_authline_re/o or
        fail "unexpected commit author line format \`$authline'".
        " (was generated from changelog Maintainer field)";
+    return ($1,$2,$3) if wantarray;
     return $authline;
 }
 
@@ -2513,8 +2518,9 @@ END
 sub quiltify_trees_differ ($$;$) {
     my ($x,$y,$finegrained) = @_;
     # returns true iff the two tree objects differ other than in debian/
-    # returns bitmas 01 - differ in upstream files except .gitignore
-    #                02 - differ in .gitignore
+    # with $finegrained,
+    # returns bitmask 01 - differ in upstream files except .gitignore
+    #                 02 - differ in .gitignore
     local $/=undef;
     my @cmd = (@git, qw(diff-tree --name-only -z));
     push @cmd, qw(-r) if $finegrained;
@@ -2536,14 +2542,33 @@ sub quiltify_tree_sentinelfiles ($) {
         qw(-- debian/rules debian/control);
     $r =~ s/\n/,/g;
     return $r;
+                                }
+
+sub quiltify_splitbrain_needed () {
+    if (!$split_brain) {
+       progress "creating dgit view";
+       runcmd @git, qw(checkout -q -b dgit-view);
+       $split_brain = 1;
+    }
 }
 
-sub quiltify_splitbrain () {
-    # memoisation via git-reflog
-    my $may_apply = $quilt_mode =~ m/gbp|unapplied/;
-    die "xxx not yet implemented";
-#    if ($may_apply &&
-#      quiltify_trees_differ($userhead,)) {}
+sub quiltify_splitbrain ($$) {
+    my ($clogp, $diffbits) = @_;
+    if ($quilt_mode !~ m/gbp|dpm/) {
+       # treat .gitignore just like any other upstream file
+       $diffbits = { %$diffbits };
+       $_ = !!$_ foreach values %$diffbits;
+    }
+    if ($quilt_mode =~ m/gbp|unapplied/ &&
+       ($diffbits->{O2A} & 01) && # some patches
+       !($diffbits->{H2O} & 01)) { # but HEAD is like orig
+       quiltify_splitbrain_needed();
+       runcmd @gbppq, qw(import);
+       die "SPLIT BRAIN";
+    }
+    die 'xxx gitignore';
+    die 'xxx memoisation via git-reflog';
+    die 'xxx fast forward';
 }
 
 sub quiltify ($$$$) {
@@ -3000,14 +3025,19 @@ END
     # We calculate some guesswork now about what kind of tree this might
     # be.  This is mostly for error reporting.
 
-    my $user2unapplied    = quiltify_trees_differ($headref,   $unapplied, 1);
-    my $user2applied      = quiltify_trees_differ($headref,   $oldtiptree,1);
-    my $applied2unapplied = quiltify_trees_differ($oldtiptree,$unapplied, 1);
+    my $diffbits = {
+        # H = user's HEAD
+        # O = orig, without patches applied
+        # A = "applied", ie orig with H's debian/patches applied
+        H2O => quiltify_trees_differ($headref,  $unapplied, 1),
+        H2A => quiltify_trees_differ($headref,  $oldtiptree,1),
+        O2A => quiltify_trees_differ($unapplied,$oldtiptree,1),
+    };
 
     my @dl;
     foreach my $b (qw(01 02)) {
-        foreach my $v ($user2unapplied, $applied2unapplied, $user2applied) {
-            push @dl, ($v & $b) ? '##' : '==';
+        foreach my $v (qw(H2O O2A H2A)) {
+            push @dl, ($diffbits->{$v} & $b) ? '##' : '==';
         }
     }
     printdebug "differences \@dl @dl.\n";
@@ -3019,16 +3049,16 @@ END
                                  $dl[2],                     $dl[5];
 
     my @failsuggestion;
-    if (!($user2unapplied & $applied2unapplied)) {
+    if (!($diffbits->{H2O} & $diffbits->{O2A})) {
         push @failsuggestion, "This might be a patches-unapplied branch.";
-    }  elsif (!($user2applied & $applied2unapplied)) {
+    }  elsif (!($diffbits->{H2A} & $diffbits->{O2A})) {
         push @failsuggestion, "This might be a patches-applied branch.";
     }
     push @failsuggestion, "Maybe you need to specify one of".
         " --quilt=gbp --quilt=dpm --quilt=unapplied ?";
 
-    if ($quilt_mode =~ m/gbp|dpm|apply/) {
-       quiltify_splitbrain();
+    if ($quilt_mode =~ m/gbp|dpm|unapplied/) {
+       quiltify_splitbrain($clogp, $diffbits);
        return;
     }