X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=git-debrebase;h=58d3a4abf3e3bf4a0acd2a2c5d2fcfaab1b6fdfd;hb=fc0f0a517d86fc5e4b1d9089c9960778435651cf;hp=9d0bda0b41b4cc6ccce0c1f6bd87144bb36dd77d;hpb=625ef9cc461653073175be47c4b6a2a9e25c13d1;p=dgit.git diff --git a/git-debrebase b/git-debrebase index 9d0bda0b..58d3a4ab 100755 --- a/git-debrebase +++ b/git-debrebase @@ -196,10 +196,12 @@ sub get_tree ($;$$) { return () if $type eq 'missing'; } + $recurse = !!$recurse; + confess "get_tree needs object not $x ?" unless $x =~ m{^[0-9a-f]+\:}; our (@get_tree_memo, %get_tree_memo); - my $memo = $get_tree_memo{$x}; + my $memo = $get_tree_memo{$recurse,$x}; return @$memo if $memo; local $Debian::Dgit::debugcmd_when_debuglevel = 3; @@ -216,7 +218,7 @@ sub get_tree ($;$$) { push @l, [ $n, $i ]; confess "$x need $last < $n ?" unless $last lt $n; } - $get_tree_memo{$x} = \@l; + $get_tree_memo{$recurse,$x} = \@l; push @get_tree_memo, $x; if (@get_tree_memo > 10) { delete $get_tree_memo{ shift @get_tree_memo }; @@ -225,15 +227,18 @@ sub get_tree ($;$$) { } sub trees_diff_walk ($$$;$) { - # trees_diff_walk [$all,] $x, $y, sub {... } - # calls sub->($name, $ix, $iy) for each difference (with $all, each name) + # trees_diff_walk [{..opts...},] $x, $y, sub {... } + # calls sub->($name, $ix, $iy) for each difference # $x and $y are as for get_tree # where $name, $ix, $iy are $name and $info from get_tree - my $all = shift @_ if @_>=4; + # opts are all call even for names same in both + # recurse call even for names same in both + my $opts = shift @_ if @_>=4; my ($x,$y,$call) = @_; + my $all = $opts->{all}; return if !$all and $x eq $y; - my @x = get_tree $x; - my @y = get_tree $y; + my @x = get_tree $x, 0, $opts->{recurse}; + my @y = get_tree $y, 0, $opts->{recurse}; printdebug "trees_diff_walk(..$x,$y..) ".Dumper(\@x,\@y) if $debuglevel >= 3; while (@x || @y) { @@ -439,6 +444,48 @@ sub record_gdrlast ($$;$) { push @deferred_updates, "update $gdrlast $newvalue $oldvalue"; } +sub fail_unprocessable ($) { + my ($msg) = @_; + changedir $maindir; + my ($ffqs, $ffqm, $symref, $ffq_prev, $gdrlast) = ffq_prev_branchinfo(); + + my $mangled = <{Why} ? "; $cl->{Why}:": ':'). " (commit $cur) (d.". (join ' ', map { sprintf "%#x", $_->{Differs} }