X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=git-debrebase;h=213728023f249305eb873722d305f3168a1cb0c4;hb=eec3f8c097bdb3f03499c9228f42d5cd2ce65786;hp=a6a02b113e7d3c9eb21e4a169cdee6f15e9d998e;hpb=c57fd0c0dac97a1a3c683e479cc2d4d0fdc89060;p=dgit.git diff --git a/git-debrebase b/git-debrebase index a6a02b11..21372802 100755 --- a/git-debrebase +++ b/git-debrebase @@ -55,6 +55,8 @@ our ($opt_defaultcmd_interactive); our $us = qw(git-debrebase); +our $wrecknoteprefix = 'refs/debrebase-wreckage'; + $|=1; sub badusage ($) { @@ -152,6 +154,14 @@ our $snags_summarised = 0; our @deferred_updates; our @deferred_update_messages; +sub merge_wreckage_cleaning ($) { + my ($updates) = @_; + git_for_each_ref("$wrecknoteprefix/*", sub { + my ($objid,$objtype,$fullrefname,$reftail) = @_; + push @$updates, "delete $fullrefname"; + }); +} + sub all_snags_summarised () { $snags_forced + $snags_tripped == $snags_summarised; } @@ -160,6 +170,7 @@ sub run_deferred_updates ($) { confess 'dangerous internal error' unless all_snags_summarised(); + merge_wreckage_cleaning \@deferred_updates; run_ref_updates_now $mrest, \@deferred_updates; print $_, "\n" foreach @deferred_update_messages; @@ -368,6 +379,27 @@ 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"; + + changedir $maindir; + + my @updates; + merge_wreckage_cleaning \@updates; + keys %$wrecknotes; + while (my ($k,$v) = each %$wrecknotes) { + push @updates, "create $wrecknoteprefix/$k $v"; + } + run_ref_updates_now "merge failed", \@updates; + push @m, "Wreckage left in $wrecknoteprefix/*."; + + 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; @@ -1046,7 +1078,8 @@ 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 { &mwrecknote($cl->{MergeWreckNotes}, @_); };