X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=git-debrebase;h=74e50768deaac7d7d43b487254a6aade0dcc1a5e;hp=484fcdca01644b0fec740d51e1ddfade437591eb;hb=d94ac406e0f237759420caf6eca996c4ffee1ca9;hpb=849364df60ca1dfedfbd23597fdab6a98881cb19 diff --git a/git-debrebase b/git-debrebase index 484fcdca..74e50768 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 = <{Msg}; chomp $ms; - $info //= ''; - $ms .= "\n\n[git-debrebase$info: $prose]\n"; + confess unless defined $info; + $ms .= "\n\n[git-debrebase $info: $prose]\n"; return (Msg => $ms); }; my $rewrite_from_here = sub { @@ -1238,7 +1286,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->("mixed commit: $wh part",'split') }; push @$q, $cls; }; $queue->(\@brw_cl, "debian"); @@ -1291,12 +1339,12 @@ sub walk ($;$$$) { push @brw_cl, { %$cl, SpecialMethod => 'DgitImportDebianUpdate', - $xmsg->("convert dgit import: debian changes") + $xmsg->("debian changes", 'convert dgit import') }, { %$cl, SpecialMethod => 'DgitImportUpstreamUpdate', $xmsg->("convert dgit import: upstream update", - " anchor") + "anchor") }; $prline->(" Import"); $rewrite_from_here->(\@brw_cl); @@ -1489,7 +1537,7 @@ sub walk ($;$$$) { %$cl, SpecialMethod => 'MergeCreateMergedBreakwaters', $xmsg->('constructed from vanilla merge', - ' merged-breakwater'), + 'merged-breakwater'), }; push @upp_cl, { %$cl, @@ -2153,7 +2201,7 @@ END # Now we have the final new breakwater branch in the index $new_bw = make_commit [ $new_bw ], [ "Update changelog for new upstream $new_upstream_version", - "[git-debrebase: new upstream $new_upstream_version, changelog]", + "[git-debrebase changelog: new upstream $new_upstream_version]", ]; }; @@ -2350,9 +2398,11 @@ sub make_patches_staged ($) { # laundered. my ($secret_head, $secret_bw, $last_anchor) = walk $head; fresh_workarea(); + my $any; in_workarea sub { - gbp_pq_export 'bw', $secret_bw, $secret_head; + $any = gbp_pq_export 'bw', $secret_bw, $secret_head; }; + return $any; } sub make_patches ($) { @@ -2366,7 +2416,7 @@ sub make_patches ($) { read_tree_subdir 'debian/patches', $ptree; $out = make_commit [$head], [ 'Commit patch queue (exported by git-debrebase)', - '[git-debrebase: export and commit patches]', + '[git-debrebase make-patches: export and commit patches]', ]; }; return $out; @@ -2404,7 +2454,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) { @@ -2698,7 +2755,7 @@ Import effective orig tree for upstream version $version END This includes the contents of the .orig(s), minus any debian/ directory. -[git-debrebase import-from-dgit-view upstream-import-convert: $version] +[git-debrebase convert-from-dgit-view upstream-import-convert: $version] END ]; push @upstreams, { Commit => $ups_synth, @@ -2732,7 +2789,7 @@ END 'git-debrebase convert-from-dgit-view: drop upstream changes from breakwater', "Drop upstream changes, and delete debian/patches, as part of converting\n". "to git-debrebase format. Upstream changes will appear as commits.", - '[git-debrebase convert-from-dgit-view: drop patches from tree]' + '[git-debrebase convert-from-dgit-view drop-patches]' ]; } $work = make_commit [ $work, $u->{Commit} ], [ @@ -2786,6 +2843,18 @@ END 'convert-from-dgit-view'; } +sub cmd_forget_was_ever_debrebase () { + badusage "forget-was-ever-debrebase takes no further arguments" if @ARGV; + my ($ffqstatus, $ffq_msg, $current, $ffq_prev, $gdrlast) = + ffq_prev_branchinfo(); + fail "Not suitable for recording git-debrebaseness anyway: $ffq_msg" + if defined $ffq_msg; + push @deferred_updates, "delete $ffq_prev"; + push @deferred_updates, "delete $gdrlast"; + snags_maybe_bail(); + run_deferred_updates "forget-was-ever-debrebase"; +} + sub cmd_record_resolved_merge () { badusage "record-resolved-merge takes no further arguments" if @ARGV; # MERGE-TODO needs documentation