X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=git-debrebase;h=a5329b6b117ffe27211282038edcc40aefd4e32d;hb=638d0a7a2a714d58d831e51d759533770a4fbfab;hp=bc98756f514a4e0b786329d20ef00e4d38a774d1;hpb=9157ed980b82c0664685e1cf8941c360fb2b11e1;p=dgit.git diff --git a/git-debrebase b/git-debrebase index bc98756f..a5329b6b 100755 --- a/git-debrebase +++ b/git-debrebase @@ -29,8 +29,8 @@ # git-debrebase [ --] [] # git-debrebase [] analyse # git-debrebase [] breakwater # prints breakwater tip only -# git-debrebase [] launder # prints breakwater tip etc. # git-debrebase [] stitch [--prose=] +# git-debrebase [] launder-v0 # prints breakwater tip etc. # git-debrebase [] downstream-rebase-launder-v0 # experimental # # git-debrebase [] convert-from-gbp [] @@ -572,8 +572,9 @@ sub walk ($;$$) { return (Msg => $ms); }; my $rewrite_from_here = sub { + my ($cl) = @_; my $sp_cl = { SpecialMethod => 'StartRewrite' }; - push @brw_cl, $sp_cl; + push @$cl, $sp_cl; push @processed, $sp_cl; }; my $cur = $input; @@ -623,7 +624,7 @@ sub walk ($;$$) { my $p0 = @{ $cl->{Parents} }==1 ? $cl->{Parents}[0]{CommitId} : undef; if ($ty eq 'AddPatches') { $cur = $p0; - $rewrite_from_here->(); + $rewrite_from_here->(\@upp_cl); next; } elsif ($ty eq 'Packaging' or $ty eq 'Changelog') { push @brw_cl, $cl; @@ -644,14 +645,14 @@ sub walk ($;$$) { }; $queue->(\@brw_cl, "debian"); $queue->(\@upp_cl, "upstream"); - $rewrite_from_here->(); + $rewrite_from_here->(\@brw_cl); $cur = $p0; next; } elsif ($ty eq 'Pseudomerge') { my $contrib = $cl->{Contributor}{CommitId}; print $report " Contributor=$contrib" if $report; push @pseudomerges, $cl; - $rewrite_from_here->(); + $rewrite_from_here->(\@upp_cl); $cur = $contrib; next; } elsif ($ty eq 'Anchor') { @@ -700,7 +701,7 @@ sub walk ($;$$) { " anchor") }; $prline->(" Import"); - $rewrite_from_here->(); + $rewrite_from_here->(\@brw_cl); $upp_limit //= $#upp_cl; # further, deeper, patches discarded $cur = $ovwr; next; @@ -857,8 +858,8 @@ sub update_head_postlaunder ($$$) { runcmd @git, qw(rm --quiet --ignore-unmatch -rf debian/patches); } -sub cmd_launder () { - badusage "no arguments to launder allowed" if @ARGV; +sub cmd_launder_v0 () { + badusage "no arguments to launder-v0 allowed" if @ARGV; my $old = get_head(); my ($tip,$breakwater,$last_anchor) = walk $old; update_head_postlaunder $old, $tip, 'launder'; @@ -1198,13 +1199,25 @@ sub cmd_stitch () { if (!$prev) { fail "No ffq-prev to stitch." unless $opt_noop_ok; } - fresh_workarea(); my $old_head = get_head(); + if (is_fast_fwd $old_head, $prev) { + my $differs = get_differs $old_head, $prev; + unless ($differs & ~D_PAT_ADD) { + # ffq-prev is ahead of us, and the only tree changes it has + # are possibly addition of things in debian/patches/. + # Just wind forwards rather than making a pointless pseudomerge. + update_head_checkout $old_head, $prev, + "debrebase: stitch (fast forward)"; + runcmd @git, qw(update-ref -d), $ffq_prev; # should be atomic + return; + } + } + fresh_workarea(); my $new_head = make_commit [ $old_head, $ffq_prev ], [ 'Declare fast forward / record previous work', "[git-debrebase pseudomerge: stitch$prose]", ]; - my @upd_cmd = (@git, qw(update-ref --stdin)); + my @upd_cmd = (@git, qw(update-ref --stdin -m), "debrebase: stitch"); debugcmd '>|', @upd_cmd; open U, "|-", @upd_cmd or die $!; my $u = <