chiark / gitweb /
badcommit-fixup: wip dummy commits
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 5 Jan 2017 18:31:31 +0000 (18:31 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 5 Jan 2017 18:31:31 +0000 (18:31 +0000)
badcommit-fixup

index 44c07021f44a3fbdb947be0951345ebff4fe80b5..dd404bb7ed31c5358359340186fdab60f111d42e 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 # usage:
-#   .../badcommit-fixup [-- --test
+#   .../badcommit-fixup --test
 #   .../badcommit-fixup --real
 
 use strict;
@@ -142,12 +142,82 @@ $!=0; $?=0;
 my $bare = `git rev-parse --is-bare-repository`;
 die "$? $!" if $?;
 
+our $worktree;
+
+sub runcmd {
+    system @_ and die "$! $?";
+}
+
+for my $up (@updates) {
+    my ($ref, $veryold, $old) = @$up;
+    next unless $ref =~ m{^refs/dgit/^[/]+$};
+
+    die "$bare ?" unless $bare eq 'true';
+
+    my $td = 'dgit-broken-fixup.tmp';
+    runcmd qw(rm -rf), $td;
+    mkdir $td, 0700 or die "$td $!";
+    chdir $td or die $!;
+    runcmd qw(git init -q);
+    runcmd qw(git config gc.auto 0);
+    rmdir ".git/objects";
+    symlink "../objects", ".git/objects" or die $!;
+    runcmd qw(git checkout -q), $old;
+
+    open C, "debian/changelog" or die $!;
+    undef $/;
+    my $clog = <C>;
+    C->error and die $!;
+    close C or die $!;
+    defined $clog or die $!;
+
+    $!=0; $?=0;
+    my $v = `dpkg-parsechangelog`;
+    die "$ref $veryold $old $? $!" if $?;
+    $v =~ m/^Source: (\S+)$/m or die "$ref $veryold $old ?";
+    my $pkg = $1;
+    $v =~ m/^Version: (\S+)$/m or die "$ref $veryold $old ?";
+    my $vsn = $1;
+    $vsn .= "+~dgitfix";
+
+    open C, ">", "debian/changelog" or die $!;
+    print C <<END;
+$pkg ($vsn) UNRELEASED; urgency=low
+
+ * Additional commit, with slightly incremented version number,
+   to override bad commits generated by dgit due to #849041.
+ * No changes to the package.
+ * Not uploaded anywhere.
+
+ -- Ian Jackson <ijackson\@chiark.greenend.org.uk>  Thu, 05 Jan 2017 17:58:21 +0000
+
+END
+    print C $clog or die $!;
+    close C or die $!;
+
+    runcmd qw(git commit -q), 
+       '--author=Ian Jackson <ijackson@chiark.greenend.org.uk>',
+       qw(-m), 'Dummy changelog entry to work around #849041 fallout',
+       qw(debian/changelog);
+
+    $!=0; $?=0;
+    my $new = `git rev-parse HEAD`;
+    die "$? $!" if $?;
+
+    chdir '..' or die $!;
+    runcmd qw(rm -rf), $td;
+
+    $count{dummyadded}++;
+
+    $up->[2] = $new;
+}
+
 open U, "|git update-ref -m 'dgit bad commit fixup' --stdin" or die $!;
 
 if ($real) {
     if ($bare eq 'false') {
        print "detaching your HEAD\n" or die $!;
-       system 'git checkout --detach' and die "$! $?";
+       runcmd 'git checkout --detach';
     }
 }