chiark / gitweb /
git-debrebase: Drop a redundant call to $read_tree_upstream
[dgit.git] / git-debrebase
index 09e0907d0b4bb6a4d12435e9a053175ceccd1ecd..482c432de9d0f6af2d3603b0965a45b27c422035 100755 (executable)
@@ -56,6 +56,7 @@ our ($opt_defaultcmd_interactive);
 our $us = qw(git-debrebase);
 
 our $wrecknoteprefix = 'refs/debrebase/wreckage';
+our $merge_cache_ref = 'refs/debrebase/merge-resolutions';
 
 $|=1;
 
@@ -372,9 +373,6 @@ sub gbp_pq_export ($$$) {
 # xxx general gdr docs highlight forbidden things
 # xxx general gdr docs list allowable things ?
 # xxx general gdr docs explicitly forbid some rebase
-#
-# xxx provide a way for the user to help
-# xxx (eg, provide wreckage provide way to continue)
 
 # later/rework?
 #  use git-format-patch?
@@ -1476,16 +1474,23 @@ sub walk ($;$$$) {
                print "Found a general merge, will try to tidy it up.\n";
                $rewriting = 1;
                $read_tree_upstream->($cl->{MergeBestAnchor});
-               $read_tree_upstream->($cl->{MergeBestAnchor});
                read_tree_debian($cltree);
                @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},
-                   @{ $cl->{Parents} };
+               my $cachehit = reflog_cache_lookup
+                   $merge_cache_ref, "vanilla-merge $cl->{CommitId}";
+               if ($cachehit) {
+                   print "Using supplied resolution for $cl->{CommitId}...\n";
+                   $build = $cachehit;
+                   $mwrecknote->('cached-resolution', $build);
+               } else {
+                   print "Running merge resolution for $cl->{CommitId}...\n";
+                   $mwrecknote->('new-base', $build);
+                   $build = merge_series
+                       $build, $cl->{MergeWreckNotes},
+                       $cl->{MergeInterchangeBaseInfo},
+                       @{ $cl->{Parents} };
+               }
                $last_anchor = $cl->{MergeBestAnchor};
 
                # Check for mismerges:
@@ -2216,6 +2221,10 @@ sub cmd_scrap () {
            "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;
@@ -2622,6 +2631,7 @@ END
 
 sub cmd_record_resolved_merge () {
     badusage "record-resolved-merge takes no further arguments" if @ARGV;
+    # xxx needs documentation
     my $new = get_head();
     my $method;
 
@@ -2631,8 +2641,8 @@ sub cmd_record_resolved_merge () {
     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";
-       confess "todo $ref"; # xxx
        1;
     };