X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=git-debrebase;h=482c432de9d0f6af2d3603b0965a45b27c422035;hp=09e0907d0b4bb6a4d12435e9a053175ceccd1ecd;hb=d62795ff059d1c5854f49d6ea84e2bfebf94e621;hpb=97b08388e773fb6c89817f583ea75dd0098f988a diff --git a/git-debrebase b/git-debrebase index 09e0907d..482c432d 100755 --- a/git-debrebase +++ b/git-debrebase @@ -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; };