summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2017-01-05 19:00:55 +0000
committerIan Jackson <ijackson@chiark.greenend.org.uk>2017-01-05 19:00:55 +0000
commit999d80d3850ec7f42ec877e59c9d192fa7a14147 (patch)
tree28fd298de50de3fdd6e58e178f2b6fece6626c31
parentba917f95c6a2c8df35667ed01cce085f26094a44 (diff)
badcommit-fixup: wip dummy commits
-rwxr-xr-xbadcommit-fixup128
1 files changed, 65 insertions, 63 deletions
diff --git a/badcommit-fixup b/badcommit-fixup
index dd404bb..42dd67b 100755
--- a/badcommit-fixup
+++ b/badcommit-fixup
@@ -30,6 +30,14 @@ our %count;
no warnings qw(recursion);
+sub runcmd {
+ system @_ and die "$! $?";
+}
+
+$!=0; $?=0;
+my $bare = `git rev-parse --is-bare-repository`;
+die "$? $!" if $?;
+
sub getobj ($$) {
my ($obj, $type) = @_;
print GCFI $obj, "\n" or die $!;
@@ -94,63 +102,8 @@ sub rewrite_commit ($) {
return $newobj;
}
-sub rewrite_tag ($) {
- my ($obj) = @_;
- $_ = getobj $obj, 'tag';
- m/^type (\w+)\n/m or die "$obj ?";
- if ($1 ne 'commit') {
- $count{"oddtags $1"}++;
- return $obj;
- }
- m/^object (\w+)\n/m or die "$obj ?";
- my $oldref = $1;
- my $newref = rewrite_commit $oldref;
- if ($oldref eq $newref) {
- return $obj;
- }
- s/^(object )\w+$/ $1.$newref /me or die "$obj ($_) ?";
- s/^-----BEGIN PGP SIGNATURE-----\n.*^-----END PGP SIGNATURE-----\n$//sm;
- return hashobj $_, 'tag';
-}
-
-$!=0; $?=0;
-my $refs=`git for-each-ref`;
-die "$? $!" if $?;
-
-chomp $refs;
-
-our @updates;
-
-foreach my $rline (split /\n/, $refs) {
- my ($obj, $type, $refname) =
- $rline =~ m/^(\w+)\s+(\w+)\s+(\S.*)/
- or die "$_ ?";
- my $rewrite;
- if ($type eq 'commit') {
- $rewrite = rewrite_commit($obj);
- } elsif ($type eq 'tag') {
- $rewrite = rewrite_tag($obj);
- } else {
- warn "ref $refname refers to $type\n";
- next;
- }
- next if $rewrite eq $obj;
- push @updates, [ $refname, $obj, $rewrite ];
-}
-
-$!=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/^[/]+$};
+sub rewrite_commit_adddummy ($$$) {
+ my ($ref, $veryold, $old) = @_;
die "$bare ?" unless $bare eq 'true';
@@ -209,16 +162,65 @@ END
$count{dummyadded}++;
- $up->[2] = $new;
+ return $new;
}
-open U, "|git update-ref -m 'dgit bad commit fixup' --stdin" or die $!;
+sub rewrite_tag ($) {
+ my ($obj) = @_;
+ $_ = getobj $obj, 'tag';
+ m/^type (\w+)\n/m or die "$obj ?";
+ if ($1 ne 'commit') {
+ $count{"oddtags $1"}++;
+ return $obj;
+ }
+ m/^object (\w+)\n/m or die "$obj ?";
+ my $oldref = $1;
+ my $newref = rewrite_commit $oldref;
+ if ($oldref eq $newref) {
+ return $obj;
+ }
+ s/^(object )\w+$/ $1.$newref /me or die "$obj ($_) ?";
+ s/^-----BEGIN PGP SIGNATURE-----\n.*^-----END PGP SIGNATURE-----\n$//sm;
+ return hashobj $_, 'tag';
+}
-if ($real) {
- if ($bare eq 'false') {
- print "detaching your HEAD\n" or die $!;
- runcmd 'git checkout --detach';
+$!=0; $?=0;
+my $refs=`git for-each-ref`;
+die "$? $!" if $?;
+
+chomp $refs;
+
+our @updates;
+
+foreach my $rline (split /\n/, $refs) {
+ my ($obj, $type, $refname) =
+ $rline =~ m/^(\w+)\s+(\w+)\s+(\S.*)/
+ or die "$_ ?";
+ my $rewrite;
+ if ($type eq 'commit') {
+ $rewrite = rewrite_commit($obj);
+ if ($refname =~ m{^refs/dgit/^[/]+$}) {
+ $rewrite = rewrite_commit_adddummy $refname, $obj, $rewrite;
+ }
+ } elsif ($type eq 'tag') {
+ $rewrite = rewrite_tag($obj);
+ } else {
+ warn "ref $refname refers to $type\n";
+ next;
}
+ next if $rewrite eq $obj;
+ push @updates, [ $refname, $obj, $rewrite ];
+}
+
+our $worktree;
+
+print Dumper(\@updates);
+
+open U, "|git update-ref -m 'dgit bad commit fixup' --stdin" or die $!;
+
+if ($real && $bare eq 'false') {
+ print "detaching your HEAD\n" or die $!;
+ runcmd 'git checkout --detach';
}
for my $up (@updates) {