chiark / gitweb /
git-debrebase: merge: Change wreckage to refs/debrebase/wreckage/*
[dgit.git] / git-debrebase
index 18bc21f0dbb965b48f4aebc4c8a07d7e67e4ba3e..a4cafb64db92b993a0819029b848785d006f8e96 100755 (executable)
@@ -55,7 +55,7 @@ our ($opt_defaultcmd_interactive);
 
 our $us = qw(git-debrebase);
 
 
 our $us = qw(git-debrebase);
 
-our $wrecknoteprefix = 'refs/debrebase-wreckage';
+our $wrecknoteprefix = 'refs/debrebase/wreckage';
 
 $|=1;
 
 
 $|=1;
 
@@ -428,6 +428,8 @@ sub merge_attempt_cmd {
     }
 }
 
     }
 }
 
+sub merge_series_patchqueue_convert ($$$);
+
 sub merge_series ($$$;@) {
     my ($newbase, $wrecknotes, $base_q, @input_qs) = @_;
     # $base_q{SeriesBase}  $input_qs[]{SeriesBase}
 sub merge_series ($$$;@) {
     my ($newbase, $wrecknotes, $base_q, @input_qs) = @_;
     # $base_q{SeriesBase}  $input_qs[]{SeriesBase}
@@ -452,7 +454,6 @@ sub merge_series ($$$;@) {
     # $prereq{<patch filename>}{<possible prereq}  exists or not (later)
     # $prereq{<patch filename>}               exists or not (even later)
 
     # $prereq{<patch filename>}{<possible prereq}  exists or not (later)
     # $prereq{<patch filename>}               exists or not (even later)
 
-    my $result;
     my $merged_pq;
 
     my $mwrecknote = sub { &mwrecknote($wrecknotes, @_); };
     my $merged_pq;
 
     my $mwrecknote = sub { &mwrecknote($wrecknotes, @_); };
@@ -595,7 +596,17 @@ sub merge_series ($$$;@) {
        runcmd @git, qw(commit --quiet -m), 'Merged patch queue form';
        $merged_pq = git_rev_parse 'HEAD';
        $mwrecknote->('merged-patchqueue', $merged_pq);
        runcmd @git, qw(commit --quiet -m), 'Merged patch queue form';
        $merged_pq = git_rev_parse 'HEAD';
        $mwrecknote->('merged-patchqueue', $merged_pq);
+    };
+    return merge_series_patchqueue_convert
+           $wrecknotes, $newbase, $merged_pq;
+}
 
 
+sub merge_series_patchqueue_convert ($$$) {
+    my ($wrecknotes, $newbase, $merged_pq) = @_;
+
+    my $result;
+    in_workarea sub {
+       playtree_setup();
        printdebug "merge_series series gbp pq import\n";
        runcmd @git, qw(checkout -q -b mergec), $merged_pq;
 
        printdebug "merge_series series gbp pq import\n";
        runcmd @git, qw(checkout -q -b mergec), $merged_pq;
 
@@ -1470,6 +1481,7 @@ sub walk ($;$$$) {
                @parents = map { $_->{Breakwater} } @{ $cl->{Parents} };
            } elsif ($method eq 'MergeMergeSeries') {
                print "Running merge resolution for $cl->{CommitId}...\n";
                @parents = map { $_->{Breakwater} } @{ $cl->{Parents} };
            } elsif ($method eq 'MergeMergeSeries') {
                print "Running merge resolution for $cl->{CommitId}...\n";
+               $mwrecknote->('new-base', $build);
                $build = merge_series
                    $build, $cl->{MergeWreckNotes},
                    $cl->{MergeInterchangeBaseInfo},
                $build = merge_series
                    $build, $cl->{MergeWreckNotes},
                    $cl->{MergeInterchangeBaseInfo},
@@ -2599,6 +2611,45 @@ END
        'convert-from-dgit-view';
 }
 
        'convert-from-dgit-view';
 }
 
+sub cmd_record_resolved_merge () {
+    badusage "record-resolved-merge takes no further arguments" if @ARGV;
+    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) = @_;
+       print "OK.  You can switch branches and try git-debrebase again.\n";
+       confess "todo $ref"; # xxx
+       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;
 sub cmd_downstream_rebase_launder_v0 () {
     badusage "needs 1 argument, the baseline" unless @ARGV==1;
     my ($base) = @ARGV;