X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=git-debrebase;h=5808cf33f7f1b702f29c5e57b1ef01e707a0428f;hb=747c6f2eaf1929665a4c19ad4654bba0790b9e01;hp=ee98f09f9b121a5affb978c83314c4255a8859c0;hpb=6e88f791b68d7ee8ddb97433aae6649d7b61d14d;p=dgit.git diff --git a/git-debrebase b/git-debrebase index ee98f09f..5808cf33 100755 --- a/git-debrebase +++ b/git-debrebase @@ -154,7 +154,8 @@ sub in_workarea ($) { my ($sub) = @_; changedir $workarea; my $r = eval { $sub->(); }; - changedir $maindir; + { local $@; changedir $maindir; } + die $@ if $@; } sub fresh_workarea () { @@ -282,7 +283,7 @@ sub calculate_committer_authline () { # # BreakwaterUpstreamMerge # has additional entry in classification result -# OrigParents = [ subset of Parents ] +# OrigParents = [ subset of Parents ] # singleton list sub classify ($) { my ($objid) = @_; @@ -305,7 +306,7 @@ sub classify ($) { push @p, { Ix => $#p, CommitId => $ph, - Differs => (get_differs $t, $ph), + Differs => (get_differs $ph, $t), }; } @@ -475,7 +476,9 @@ sub walk ($;$$) { if ($nogenerate) { return (undef,undef); } - die "commit $cur: Cannot cope with this commit"; + die "commit $cur: Cannot cope with this commit (d.". + (join ' ', map { sprintf "%#x", $_->{Differs} } + @{ $cl->{Parents} }). ")"; }; my $build; @@ -513,7 +516,7 @@ sub walk ($;$$) { } elsif ($ty eq 'Mixed') { my $queue = sub { my ($q, $wh) = @_; - my $cls = { $cl, $xmsg->("split mixed commit: $wh part") }; + my $cls = { %$cl, $xmsg->("split mixed commit: $wh part") }; push @$q, $cls; }; $queue->(\@brw_cl, "debian"); @@ -625,9 +628,14 @@ sub walk ($;$$) { my $committer_authline = calculate_committer_authline(); + printdebug "WALK REBUILD $build ".(scalar @processed)."\n"; + + confess "internal error" unless $build eq (pop @processed)->{CommitId}; + in_workarea sub { mkdir $rd or $!==EEXIST or die $!; my $current_method; + runcmd @git, qw(read-tree), $build; foreach my $cl (qw(Debian), (reverse @brw_cl), { SpecialMethod => 'RecordBreakwaterTip' }, qw(Upstream), (reverse @upp_cl)) { @@ -638,6 +646,8 @@ sub walk ($;$$) { my $method = $cl->{SpecialMethod} // $current_method; my @parents = ($build); my $cltree = $cl->{CommitId}; + printdebug "WALK BUILD ".($cltree//'undef'). + " $method (rewriting=$rewriting)\n"; if ($method eq 'Debian') { $read_tree_debian->($cltree); } elsif ($method eq 'Upstream') { @@ -657,13 +667,19 @@ sub walk ($;$$) { } else { confess "$method ?"; } - $rewriting ||= $cl ne pop @processed; + if (!$rewriting) { + my $procd = (pop @processed) // 'UNDEF'; + if ($cl ne $procd) { + $rewriting = 1; + printdebug "WALK REWRITING NOW cl=$cl procd=$procd\n"; + } + } my $newtree = cmdoutput @git, qw(write-tree); my $ch = $cl->{Hdr}; $ch =~ s{^tree .*}{tree $newtree}m or confess "$ch ?"; $ch =~ s{^parent .*\n}{}m; $ch =~ s{(?=^author)}{ - map { "parent $_\n" } @parents + join '', map { "parent $_\n" } @parents }me or confess "$ch ?"; if ($rewriting) { $ch =~ s{^committer .*$}{$committer_authline}m @@ -682,7 +698,9 @@ sub walk ($;$$) { } }; - runcmd @git, qw(diff-tree --quiet), $input, $build; + my $final_check = get_differs $build, $input; + die sprintf "internal error %#x %s %s", $final_check, $build, $input + if $final_check & ~D_PAT_ADD; return ($build, $breakwater); } @@ -707,8 +725,9 @@ sub cmd_launder () { my ($tip,$breakwater) = walk $old; update_head $old, $tip, 'launder'; # no tree changes except debian/patches - runcmd @git, qw(rm --quiet -rf debian/patches); + runcmd @git, qw(rm --quiet --ignore-unmatch -rf debian/patches); printf "# breakwater tip\n%s\n", $breakwater; + printf "# working tip\n%s\n", $tip; } sub cmd_analyse () {