D1782: rebase: don't run IMM if running rebase in a transaction
phillco (Phil Cohen)
phabricator at mercurial-scm.org
Wed Dec 27 23:34:34 UTC 2017
phillco created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
Some callers to rebase.rebase(), like `_moverelative` in `fbamend/movement.py`,
wrap the entire rebase call in a transaction. This raises havoc when IMM tries
to retry the rebase when it hits merge conflicts, because the abort will fail
the whole transaction, not the subset. It also fails at the end, losing any
conflict resolution, as @sid0 noticed.
The right long-term fix that @quark and I have discussed is to change the
restarting logic such that it doesn't abort at all, but simply switches between
IMM and non-IMM fluidly for each commit, which has other nice properties. In
the meantime this will do for now.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D1782
AFFECTED FILES
hgext/rebase.py
CHANGE DETAILS
diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -779,8 +779,11 @@
"""
inmemory = ui.configbool('rebase', 'experimental.inmemory')
- if opts.get('continue') or opts.get('abort'):
+ if (opts.get('continue') or opts.get('abort') or
+ repo.currenttransaction() is None):
# in-memory rebase is not compatible with resuming rebases.
+ # (Or if it is run within a transaction, since the restart logic can
+ # fail the entire transaction.)
inmemory = False
if inmemory:
To: phillco, #hg-reviewers
Cc: quark, mercurial-devel, sid0
More information about the Mercurial-devel
mailing list