chiark / gitweb /
git-debrebase: convert-from-*: snag on discarding comments in series
[dgit.git] / git-debrebase
index 4bfe0952518214203c5e3ac397b27c53ceb93354..5fabfd6762e7a3d407521cafe17047ad5bb242e0 100755 (executable)
@@ -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');
@@ -2441,7 +2449,14 @@ sub check_series_has_all_patches ($) {
        [qw(blob missing)];
     $series //= '';
     my %series;
+    our $comments_snagged;
     foreach my $f (grep /\S/, grep {!m/^\s\#/} split /\n/, $series) {
+       if ($f =~ m/^\s*\#/) {
+           snag 'series-comments',
+               "$seriesfn contains comments, which will be discarded"
+               unless $comments_snagged++;
+           next;
+       }
        fail "patch $f repeated in $seriesfn !" if $series{$f}++;
     }
     foreach my $patchfile (get_tree "$head:debian/patches", 1,1) {