our $us = qw(git-debrebase);
-our $wrecknoteprefix = 'refs/debrebase-wreckage';
+our $wrecknoteprefix = 'refs/debrebase/wreckage';
+our $merge_cache_ref = 'refs/debrebase/merge-resolutions';
$|=1;
# 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?
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:
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 ($) {
sub cmd_record_resolved_merge () {
badusage "record-resolved-merge takes no further arguments" if @ARGV;
+ # xxx needs documentation
my $new = get_head();
my $method;
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;
};