X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=git-debrebase;h=c353111249ee99edb70d069528e94da938fe8af5;hb=b9ef2453ea950bd60ddb52e2253cdf762f34534d;hp=484fcdca01644b0fec740d51e1ddfade437591eb;hpb=849364df60ca1dfedfbd23597fdab6a98881cb19;p=dgit.git diff --git a/git-debrebase b/git-debrebase index 484fcdca..c3531112 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) { @@ -305,13 +310,16 @@ sub get_differs ($$) { my $xp = $ix && "$xd/patches"; my $yp = $iy && "$yd/patches"; - trees_diff_walk $xp, $yp, sub { + trees_diff_walk { recurse=>1 }, $xp, $yp, sub { my ($n,$ix,$iy) = @_; # analyse difference in debian/patches my $ok; - if ($n !~ m/\.series$/s && !$ix && $plain->($iy)) { + if ($n =~ m{/$}s) { + # we are recursing; directories may appear and disappear + $ok = 1; + } elsif ($n !~ m/\.series$/s && !$ix && $plain->($iy)) { $ok = 1; } elsif ($n eq 'series' && $plain->($ix) && $plain->($iy)) { my $x_s = (git_cat_file "$xp/series", 'blob'); @@ -441,7 +449,44 @@ sub record_gdrlast ($$;$) { sub fail_unprocessable ($) { my ($msg) = @_; - fail $msg; + changedir $maindir; + my ($ffqs, $ffqm, $symref, $ffq_prev, $gdrlast) = ffq_prev_branchinfo(); + + my $mangled = <