X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=git-debrebase;h=abf9157e0554fbf7e9496c030af64c9c919fe3cc;hp=830cfd5ea978586b68a6e995936bcf68e9dac7f7;hb=49e8f18bc896d9a9dd8aedb3495854c39439c86c;hpb=27b7f56727ea182349a38136977553fc5a256394 diff --git a/git-debrebase b/git-debrebase index 830cfd5e..abf9157e 100755 --- a/git-debrebase +++ b/git-debrebase @@ -131,6 +131,21 @@ sub fresh_workarea () { in_workarea sub { playtree_setup }; } +sub run_ref_updates_now ($$) { + my ($mrest, $updates) = @_; + # @$updates is a list of lines for git-update-ref, without \ns + + my @upd_cmd = (git_update_ref_cmd "debrebase: $mrest", qw(--stdin)); + debugcmd '>|', @upd_cmd; + open U, "|-", @upd_cmd or die $!; + foreach (@$updates) { + printdebug ">= ", $_, "\n"; + print U $_, "\n" or die $!; + } + printdebug ">\$\n"; + close U or failedcmd @upd_cmd; +} + our $snags_forced = 0; our $snags_tripped = 0; our $snags_summarised = 0; @@ -145,16 +160,7 @@ sub run_deferred_updates ($) { confess 'dangerous internal error' unless all_snags_summarised(); - my @upd_cmd = (git_update_ref_cmd "debrebase: $mrest", qw(--stdin)); - debugcmd '>|', @upd_cmd; - open U, "|-", @upd_cmd or die $!; - foreach (@deferred_updates) { - printdebug ">= ", $_, "\n"; - print U $_, "\n" or die $!; - } - printdebug ">\$\n"; - close U or failedcmd @upd_cmd; - + run_ref_updates_now $mrest, \@deferred_updates; print $_, "\n" foreach @deferred_update_messages; @deferred_updates = (); @@ -344,7 +350,7 @@ sub gbp_pq_export ($$$) { { local ($!,$?); copy('../gbp-pq-err', \*STDERR); } failedcmd @gbp_cmd; } - runcmd @git, qw(add -f debian/patches); + runcmd @git, qw(add -f debian/patches) if stat_exists 'debian/patches'; } @@ -362,6 +368,23 @@ sub gbp_pq_export ($$$) { # our own patch identification algorithm? # this is an alternative strategy +sub merge_failed ($$) { + my ($wrecknotes, $emsg) = @_; + my @m; + push @m, "Merge resolution failed: $emsg"; + + push @m, "See git-debrebase(1) section FAILED MERGES for suggestions."; + # ^ xxx this section does not yet exist + fail join '', map { "$_\n" } @m; +} + +sub mwrecknote ($$$) { + my ($wrecknotes, $reftail, $commitish) = @_; + confess unless defined $commitish; + printdebug "mwrecknote $reftail $commitish\n"; + $wrecknotes->{$reftail} = $commitish; +} + sub merge_series ($$$;@) { my ($newbase, $wrecknotes, $base_q, @input_qs) = @_; # $base_q{SeriesBase} $input_qs[]{SeriesBase} @@ -388,6 +411,8 @@ sub merge_series ($$$;@) { my $result; + my $mwrecknote = sub { &mwrecknote($wrecknotes, @_); }; + local $workarea = fresh_playground "$playprefix/merge"; my $seriesfile = "debian/patches/series"; in_workarea sub { @@ -418,7 +443,7 @@ sub merge_series ($$$;@) { " $q->{SeriesTip}]" ]; printdebug "merge_series pec $pec "; - runcmd @git, qw(rm -q --cached), $seriesfile; + runcmd @git, qw(rm -q --ignore-unmatch --cached), $seriesfile; $pec = make_commit [ $pec ], [ "Drop series file from $s to avoid merge trouble", "[git-debrebase merge-innards patch-queue prep:". @@ -441,6 +466,7 @@ sub merge_series ($$$;@) { printdebug "pec' $pec\n"; runcmd @git, qw(reset -q --hard), $pec; $q->{MR}{PEC} = $pec; + $mwrecknote->("$q->{LeftRight}-patchqueue", $pec); } # now, because of reverse, we are on $input_q->{MR}{OQC} runcmd @git, qw(checkout -q -b merge); @@ -522,7 +548,8 @@ sub merge_series ($$$;@) { } runcmd @git, qw(add), $seriesfile; - runcmd @git, qw(commit --quiet -m), 'Merged series'; + runcmd @git, qw(commit --quiet -m), 'Merged patch queue form'; + $mwrecknote->('merged-patchqueue', git_rev_parse 'HEAD'); printdebug "merge_series series gbp pq import\n"; runcmd qw(gbp pq import); @@ -546,14 +573,17 @@ sub merge_series ($$$;@) { $build = cmdoutput @git, qw(hash-object -w -t commit ../mcommit); } $result = $build; + $mwrecknote->('merged-result', $result); + runcmd @git, qw(update-ref refs/heads/result), $result; runcmd @git, qw(checkout -q -b debug); runcmd @git, qw(commit --allow-empty -q -m M-INDEX); runcmd @git, qw(add .); runcmd @git, qw(commit --allow-empty -q -m M-WORKTREE); - printdebug sprintf "merge_series done debug=%s\n", - git_rev_parse 'HEAD'; + my $mdebug = git_rev_parse 'HEAD'; + printdebug sprintf "merge_series done debug=%s\n", $mdebug; + $mwrecknote->('merged-debug', $mdebug); }; printdebug "merge_series returns $result\n"; return $result; @@ -1026,18 +1056,17 @@ sub walk ($;$$$) { }; my $nomerge = sub { - fail "something useful about failed merge attempt @_ xxx".Dumper($cl); + my ($emsg) = @_; + merge_failed $cl->{MergeWreckNotes}, $emsg; }; - my $mwrecknote = sub { - my ($reftail, $commitish) = @_; - $cl->{MergeWreckNotes}{$reftail} = $commitish; - }; + my $mwrecknote = sub { &mwrecknote($cl->{MergeWreckNotes}, @_); }; my $last_anchor; for (;;) { $cl = classify $cur; + $cl->{MergeWreckNotes} //= {}; my $ty = $cl->{Type}; my $st = $cl->{SubType}; $prline->("$cl->{CommitId} $cl->{Type}"); @@ -1291,7 +1320,9 @@ sub walk ($;$$$) { my $ibinfo = { SeriesTip => $btip, SeriesBase => $bbw, - Anchor => $banchor }; + Anchor => $banchor, + LeftRight => 'mergebase' }; + $bbw eq $bwb or $nomerge->("interchange merge-base ($ib)'s". " breakwater ($bbw)".