chiark / gitweb /
Split brain: Generate .gitignore patch in deterministic order
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 50c8dd06b177e64fd3d46872f887a42a0c690836..4af8f34cd2b21ab71b08529c9e0aaf2b6efe8db6 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -2515,12 +2515,14 @@ END
     }
 }
 
-sub quiltify_trees_differ ($$;$) {
-    my ($x,$y,$finegrained) = @_;
+sub quiltify_trees_differ ($$;$$) {
+    my ($x,$y,$finegrained,$ignorenamesr) = @_;
     # returns true iff the two tree objects differ other than in debian/
     # with $finegrained,
     # returns bitmask 01 - differ in upstream files except .gitignore
     #                 02 - differ in .gitignore
+    # if $ignorenamesr is defined, $ingorenamesr->{$fn}
+    #  is set for each modified .gitignore filename $fn
     local $/=undef;
     my @cmd = (@git, qw(diff-tree --name-only -z));
     push @cmd, qw(-r) if $finegrained;
@@ -2529,7 +2531,9 @@ sub quiltify_trees_differ ($$;$) {
     my $r = 0;
     foreach my $f (split /\0/, $diffs) {
        next if $f =~ m#^debian(?:/.*)?$#s;
-       $r |= ($f =~ m#^(?:.*/)?.gitignore$#s) ? 02 : 01;
+       my $isignore = $f =~ m#^(?:.*/)?.gitignore$#s;
+       $r |= $isignore ? 02 : 01;
+       $ignorenamesr->{$f}=1 if $ignorenamesr && $isignore;
     }
     printdebug "quiltify_trees_differ $x $y => $r\n";
     return $r;
@@ -2552,8 +2556,8 @@ sub quiltify_splitbrain_needed () {
     }
 }
 
-sub quiltify_splitbrain ($$) {
-    my ($clogp, $diffbits) = @_;
+sub quiltify_splitbrain ($$$$$) {
+    my ($clogp, $unapplied, $headref, $diffbits, $editedignores) = @_;
     if ($quilt_mode !~ m/gbp|dpm/) {
        # treat .gitignore just like any other upstream file
        $diffbits = { %$diffbits };
@@ -2576,6 +2580,7 @@ sub quiltify_splitbrain ($$) {
        !($diffbits->{O2A} & 02)) { # patches do not change .gitignore
        quiltify_splitbrain_needed();
        progress "creating patch to represent .gitignore changes";
+        ensuredir "debian/patches";
        my $gipatch = "debian/patches/auto-gitignore";
        open GIPATCH, ">>", "$gipatch" or die "$gipatch: $!";
        stat GIPATCH or die "$gipatch: $!";
@@ -2588,11 +2593,23 @@ The Debian packaging git branch contains these updates to the upstream
 .gitignore file(s).  This patch is autogenerated, to provide these
 updates to users of the official Debian archive view of the package.
 
+[dgit version $our_version]
 ---
 END
-    die 'xxx gitignore';
-       
+        close GIPATCH or die "$gipatch: $!";
+        runcmd shell_cmd "exec >>$gipatch", @git, qw(diff),
+            $unapplied, $headref, "--", sort keys %$editedignores;
+        open SERIES, "+>>", "debian/patches/series" or die $!;
+        defined seek SERIES, -1, 2 or $!==EINVAL or die $!;
+        my $newline;
+        defined read SERIES, $newline, 1 or die $!;
+       print SERIES "\n" or die $! unless $newline eq "\n";
+       print SERIES "auto-gitignore\n" or die $!;
+       close SERIES or die  $!;
+        runcmd @git, qw(add -- debian/patches/series), $gipatch;
+        commit_admin "Commit patch to update .gitignore";
     }
+
     die 'xxx memoisation via git-reflog';
     die 'xxx fast forward (should not depend on quilt mode, but will always be needed if we did $split_brain)';
 }
@@ -3045,17 +3062,19 @@ END
     rmtree '.pc';
     runcmd @git, qw(add -Af .);
     my $oldtiptree=git_write_tree();
+    printdebug "fake o+d/p tree object $unapplied\n";
     changedir '../work';
 
 
     # We calculate some guesswork now about what kind of tree this might
     # be.  This is mostly for error reporting.
 
+    my %editedignores;
     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),
+        H2O => quiltify_trees_differ($headref,  $unapplied, 1,\%editedignores),
         H2A => quiltify_trees_differ($headref,  $oldtiptree,1),
         O2A => quiltify_trees_differ($unapplied,$oldtiptree,1),
     };
@@ -3084,7 +3103,8 @@ END
         " --quilt=gbp --quilt=dpm --quilt=unapplied ?";
 
     if ($quilt_mode =~ m/gbp|dpm|unapplied/) {
-       quiltify_splitbrain($clogp, $diffbits);
+       quiltify_splitbrain($clogp, $unapplied, $headref,
+                            $diffbits, \%editedignores);
        return;
     }