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;
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 };
}
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) {