our $us = qw(git-debrebase);
-our $wrecknoteprefix = 'refs/debrebase-wreckage';
+our $wrecknoteprefix = 'refs/debrebase/wreckage';
+our $merge_cache_ref = 'refs/debrebase/merge-resolutions';
$|=1;
sub cmd_scrap () {
if (currently_rebasing()) {
runcmd @git, qw(rebase --abort);
+ push @deferred_updates, 'verify HEAD HEAD';
+ # noop, but stops us complaining that scrap was a noop
}
+ badusage "no arguments allowed" if @ARGV;
my ($ffq_prev, $gdrlast, $ffq_prev_commitish) = ffq_prev_info();
- if (!$ffq_prev_commitish) {
+ my $scrapping_head;
+ if ($ffq_prev_commitish) {
+ $scrapping_head = get_head();
+ push @deferred_updates,
+ "update $gdrlast $ffq_prev_commitish $git_null_obj",
+ "update $ffq_prev $git_null_obj $ffq_prev_commitish";
+ }
+ if (git_get_ref $merge_cache_ref) {
+ push @deferred_updates,
+ "delete $merge_cache_ref";
+ }
+ if (!@deferred_updates) {
fail "No ongoing git-debrebase session." unless $opt_noop_ok;
finish 0;
}
- my $scrapping_head = get_head();
- badusage "no arguments allowed" if @ARGV;
- push @deferred_updates,
- "update $gdrlast $ffq_prev_commitish $git_null_obj",
- "update $ffq_prev $git_null_obj $ffq_prev_commitish";
snags_maybe_bail();
- update_head_checkout $scrapping_head, $ffq_prev_commitish, "scrap";
+ if ($scrapping_head) {
+ update_head_checkout $scrapping_head, $ffq_prev_commitish, "scrap";
+ } else {
+ run_deferred_updates "scrap";
+ }
}
sub make_patches_staged ($) {
'convert-from-dgit-view';
}
+sub cmd_record_resolved_merge () {
+ badusage "record-resolved-merge takes no further arguments" if @ARGV;
+ # xxx needs documentation
+ my $new = get_head();
+ my $method;
+
+ print "Checking how you have resolved the merge problem\n";
+ my $nope = sub { print "Not $method: @_"; 0; };
+
+ my $maybe = sub { print "Seems to be $method.\n"; };
+ my $yes = sub {
+ my ($key, $ref) = @_;
+ reflog_cache_insert $merge_cache_ref, $key, $ref;
+ print "OK. You can switch branches and try git-debrebase again.\n";
+ 1;
+ };
+
+ fresh_workarea 'merge';
+ sub {
+ $method = 'vanilla-merge patchqueue';
+ my $vanilla = git_get_ref "$wrecknoteprefix/vanilla-merge";
+ $vanilla or return $nope->("wreckage was not of vanilla-merge");
+ foreach my $lr (qw(left right)) {
+ my $n = "$wrecknoteprefix/$lr-patchqueue";
+ my $lrpq = git_get_ref $n;
+ $lrpq or return $nope->("wreckage did not contain patchqueues");
+ is_fast_fwd $lrpq, $new or return $nope->("HEAD not ff of $n");
+ }
+ $maybe->();
+ my $newbase = git_get_ref "$wrecknoteprefix/new-base"
+ or die "wreckage element $wrecknoteprefix/new-base missing";
+ my $result = merge_series_patchqueue_convert
+ {}, $newbase, $new;
+ $yes->("vanilla-merge $vanilla", $result);
+ 1;
+ }->() or sub {
+ fail "No resolved merge method seems applicable.\n";
+ }->();
+}
+
sub cmd_downstream_rebase_launder_v0 () {
badusage "needs 1 argument, the baseline" unless @ARGV==1;
my ($base) = @ARGV;