X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=git-debrebase;h=ad2672f1cd3e4f7633af0ee3b05874b6f06e80b5;hp=19beef8c3ffc422eba8e7468e43ac2ccb29ecb6b;hb=da894f5bc73ad2a5cbf6d74533818ca359f141b0;hpb=0943c19e7dcccf0ac05fb266b232a9c36781264e diff --git a/git-debrebase b/git-debrebase index 19beef8c..ad2672f1 100755 --- a/git-debrebase +++ b/git-debrebase @@ -29,6 +29,7 @@ # git-debrebase [ --] [] # git-debrebase [] analyse # git-debrebase [] launder # prints breakwater tip etc. +# git-debrebase [] stitch [--prose=] # git-debrebase [] downstream-rebase-launder-v0 # experimental # # git-debrebase [] gbp2debrebase-v0 \ @@ -441,7 +442,7 @@ sub classify ($) { my @overwritten = grep { $_->{Differs} } @p; confess "internal error $objid ?" unless @overwritten==1; return $classify->(qw(Pseudomerge), - Overwritten => $overwritten[0], + Overwritten => [ $overwritten[0] ], Contributor => $identical[0]); } if (@p == 2 && @identical == 2) { @@ -452,7 +453,7 @@ sub classify ($) { } @p; return $classify->(qw(Pseudomerge), SubType => qw(Ambiguous), - Overwritten => $bytime[0], + Overwritten => [ $bytime[0] ], Contributor => $bytime[1]); } foreach my $p (@p) { @@ -626,7 +627,8 @@ sub walk ($;$$) { # suite intended by the non-dgit NMUer, and later # pseudomerges may represent in-archive copies. my $ovwrs = $pm->{Overwritten}; - printf $report " PM=%s \@Overwr:%d", $pm, (scalar @$ovwrs) + printf $report " PM=%s \@Overwr:%d", + $pm->{CommitId}, (scalar @$ovwrs) if $report; if (@$ovwrs != 1) { printdebug "*** WALK BOMB DgitImportUnpatched\n"; @@ -649,22 +651,12 @@ sub walk ($;$$) { %$cl, SpecialMethod => 'DgitImportDebianUpdate', $xmsg->("convert dgit import: debian changes") + }, { + %$cl, + SpecialMethod => 'DgitImportUpstreamUpdate', + $xmsg->("convert dgit import: upstream update", + " breakwater") }; - my $differs = (get_differs $ovwr, $cl->{Tree}); - printf $report " Differs=%#x", $differs if $report; - if ($differs & D_UPS) { - printf $report " D_UPS" if $report; - # This will also trigger if a non-dgit git-based NMU - # deleted .gitignore (which is a thing that some of - # the existing git tools do if the user doesn't - # somehow tell them not to). Ah well. - push @brw_cl, { - %$cl, - SpecialMethod => 'DgitImportUpstreamUpdate', - $xmsg->("convert dgit import: upstream changes", - " breakwater") - }; - } $prline->(" Import"); $rewrite_from_here->(); $upp_limit //= $#upp_cl; # further, deeper, patches discarded @@ -747,6 +739,9 @@ sub walk ($;$$) { $read_tree_debian->($cltree); rm_subdir_cached qw(debian/patches); } elsif ($method eq 'DgitImportUpstreamUpdate') { + confess unless $rewriting; + my $differs = (get_differs $build, $cltree); + next unless $differs & D_UPS; $read_tree_upstream->($cltree); push @parents, map { $_->{CommitId} } @{ $cl->{OrigParents} }; } else { @@ -1136,6 +1131,38 @@ sub cmd_record_ffq_prev () { } } +sub cmd_stitch () { + my $prose = ''; + GetOptions('prose=s', \$prose) or die badusage("bad options to stitch"); + badusage "no arguments allowed" if @ARGV; + my ($status, $message, $current, $ffq_prev) = ffq_prev_branchinfo(); + if ($status ne 'branch') { + fproblem $status, "could not check ffq-prev: $message"; + fproblems_maybe_bail(); + } + my $prev = $ffq_prev && git_get_ref $ffq_prev; + if (!$prev) { + fail "No ffq-prev to stitch." unless $opt_noop_ok; + } + fresh_workarea(); + my $old_head = get_head(); + 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)); + debugcmd '>|', @upd_cmd; + open U, "|-", @upd_cmd or die $!; + my $u = <= ", $_, "\n" foreach split /\n/, $u; + print U $u; + printdebug ">\$\n"; + close U or failedcmd @upd_cmd; +} + sub cmd_gbp2debrebase () { badusage "needs 1 optional argument, the upstream" unless @ARGV<=1; my ($upstream_spec) = @ARGV;