From 999d80d3850ec7f42ec877e59c9d192fa7a14147 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 5 Jan 2017 19:00:55 +0000 Subject: [PATCH] badcommit-fixup: wip dummy commits --- badcommit-fixup | 128 ++++++++++++++++++++++++------------------------ 1 file changed, 65 insertions(+), 63 deletions(-) diff --git a/badcommit-fixup b/badcommit-fixup index dd404bb7..42dd67b0 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) { -- 2.30.2