# 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;
use IPC::Open2;
use Data::Dumper;
+our $our_version = 'UNRELEASED'; ###substituted###
+
my $real;
foreach my $a (@ARGV) {
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];
}
runcmd qw(git add map);
}
- runcmd qw(git commit -q),
- qw(-m), 'dgit-badcommit-fixup',
- qw(map);
+ runcmd qw(git commit -q), qw(-m), <<END, qw(map);
+dgit-badcommit-fixup
+
+[dgit-badcommit-fixup $our_version]
+END
$!=0; $?=0;
my $new = `git rev-parse HEAD`;
$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;