# dgit-badcommit-fixup --test
# dgit-badcommit-fixup --real
+# Update procedure, from server operator's point of view:
+#
+# 1. Test in an offline tree that this DTRT
+#
+# 2. Announce a transition time. Tell everyone that between
+# the transition time and their next upload, they must
+# run this script.
+#
+# 3. At the transition time, run this script in every repo.
+#
+# 4. Run the mirror script to push changes, if necessary.
+
+
use strict;
use POSIX;
my $m = \ $memo{$obj};
return $$m if defined $$m;
my $olddata = getobj $obj, 'commit';
-#print STDERR ">$obj|$olddata<\n";
$olddata =~ m/(?<=\n)(?=\n)/ or die "$obj ?";
my $msg = $';
local $_ = $`;
if ($newdata eq $olddata) {
$newobj = $obj;
$count{unchanged}++;
+#print STDERR "UNCHANGED $obj\n";
} else {
$newobj = hashobj $newdata, 'commit';
+#print STDERR "REWRITTEN $obj $newobj\n";
}
$$m= $newobj;
return $newobj;
close M or die $!;
}
- foreach my $up (@updates) {
+ foreach my $oldc (keys %memo) {
+ my $newc = $memo{$oldc};
+ next if $oldc eq $newc;
+ $map{$oldc} = $newc;
+ }
+ foreach my $up (@updates) { # catches tags
$map{ $up->[1] } = $up->[2];
}
$org_rewrite_map = $obj;
continue;
}
+ next if $refname =~ m{^refs/dgit-(?:badcommit|badfixuptest)/};
my $rewrite;
if ($type eq 'commit') {
$rewrite = rewrite_commit($obj);
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) {
my ($ref, $old, $new, $nobackup) = @$up;
my $otherref = $ref;