+sub merge_failed ($$;@) {
+ my ($wrecknotes, $emsg, @xmsgs) = @_;
+ my @m;
+ push @m, "Merge resolution failed: $emsg";
+ push @m, @xmsgs;
+
+ changedir $maindir;
+
+ my @updates;
+ merge_wreckage_cleaning \@updates;
+ run_ref_updates_now "merge failed", \@updates;
+
+ @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.";
+
+ # use finish rather than fail, in case we are within an eval
+ # (that can happen inside walk!)
+ print STDERR "\n";
+ print STDERR "$us: $_\n" foreach @m;
+ finish 15;
+}
+