9 my $gcfpid = open2 \*GCFO, \*GCFI, 'git cat-file --batch' or die $!;
13 no warnings qw(recursion);
16 my ($obj, $type) = @_;
17 print GCFI $obj, "\n" or die $!;
19 my ($gtype, $gsize) = $x =~ m/^\w+ (\w+) (\d+)\n/ or die "$obj ?";
20 $gtype eq $type or die "$obj $gtype != $type ?";
22 (read GCFO, $gdata, $gsize) == $gsize or die "$obj $!";
23 #print STDERR ">$obj|$x|$gdata|$gsize<\n";
25 $x eq "\n" or die "$obj ($_) $!";
31 my ($data,$type) = @_;
32 my $gwopid = open2 \*GWO, \*GWI,
33 "git hash-object -t $type --stdin"
35 print GWI $data or die $!;
39 waitpid $gwopid,0 == $gwopid or die $!;
41 m/^(\w+)\n/ or die "$_ ?";
42 $count{"rewritten $type"}++;
48 sub rewrite_commit ($);
49 sub rewrite_commit ($) {
51 my $m = \ $memo{$obj};
52 return $$m if defined $$m;
53 my $olddata = getobj $obj, 'commit';
54 $olddata =~ m/(?<=\n)(?=\n)/ or die "$obj ?";
57 s{^(parent )(\w+)$}{ $1 . rewrite_commit($2) }gme;
58 $count{fix_overwrite} += s{^commiter }{committer }gm;
59 if (!m{^author }m && !m{^committer }m) {
60 m{^parent (\w+)}m or die "$obj ?";
61 my $parent = getobj $1, 'commit';
62 $parent =~ m/^(?:.+\n)+(author .*\ncommitter .*\n)/;
63 m/\n$/ or die "$obj ?";
67 my $newdata = $_.$msg;
69 if ($newdata eq $olddata) {
73 $newobj = hashobj $newdata, 'commit';
81 $_ = getobj $obj, 'tag';
82 m/^type (\w+)\n/m or die "$obj ?";
84 $count{"oddtags $1"}++;
87 m/^object (\w+)\n/m or die "$obj ?";
89 my $newref = rewrite_commit $oldref;
90 if ($oldref eq $newref) {
93 s/^(object )\w+$/ $1.$newref /me or die "$obj ($_) ?";
94 s/^-----BEGIN PGP SIGNATURE-----\n.*^-----END PGP SIGNATURE-----\n$//sm;
95 return hashobj $_, 'tag';
99 my $refs=`git-for-each-ref`;
106 foreach my $rline (split /\n/, $refs) {
107 my ($obj, $type, $refname) =
108 $rline =~ m/^(\w+)\s+(\w+)\s+(\S.*)/
111 if ($type eq 'commit') {
112 $rewrite = rewrite_commit($obj);
113 } elsif ($type eq 'tag') {
114 my $rewrite = rewrite_tag($obj);
116 warn "ref $refname refers to $type\n";
119 next if $rewrite = $obj;
120 push @updates, [ $refname, $rewrite ];
123 print Dumper(\@updates, \%count);