Patchwork D1616: rebase: disable `inmemory` if the rebaseset contains the working copy

login
register
mail settings
Submitter phabricator
Date Dec. 8, 2017, 11:32 p.m.
Message ID <8f48852768d58e2b5bdd2ccf7cee6617@localhost.localdomain>
Download mbox | patch
Permalink /patch/26129/
State Not Applicable
Headers show

Comments

phabricator - Dec. 8, 2017, 11:32 p.m.
phillco updated this revision to Diff 4276.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D1616?vs=4247&id=4276

REVISION DETAIL
  https://phab.mercurial-scm.org/D1616

AFFECTED FILES
  hgext/rebase.py

CHANGE DETAILS




To: phillco, #hg-reviewers, dlax
Cc: durin42, mercurial-devel

Patch

diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -830,7 +830,8 @@ 
         else:
             destmap = _definedestmap(ui, repo, destf, srcf, basef, revf,
                                      destspace=destspace,
-                                     inmemory=opts['inmemory'])
+                                     opts=opts)
+            rbsrt.inmemory = opts['inmemory']
             retcode = rbsrt._preparenewrebase(destmap)
             if retcode is not None:
                 return retcode
@@ -850,7 +851,7 @@ 
         rbsrt._finishrebase()
 
 def _definedestmap(ui, repo, destf=None, srcf=None, basef=None, revf=None,
-                   destspace=None, inmemory=False):
+                   destspace=None, opts=None):
     """use revisions argument to define destmap {srcrev: destrev}"""
     if revf is None:
         revf = []
@@ -864,7 +865,7 @@ 
     if revf and srcf:
         raise error.Abort(_('cannot specify both a revision and a source'))
 
-    if not inmemory:
+    if not opts['inmemory']:
         cmdutil.checkunfinished(repo)
         cmdutil.bailifchanged(repo)
 
@@ -939,6 +940,22 @@ 
                 ui.status(_('nothing to rebase from %s to %s\n') %
                           ('+'.join(str(repo[r]) for r in base), dest))
             return None
+    # If rebasing the working copy parent, force in-memory merge to be off.
+    #
+    # This is because the extra work of checking out the newly rebased commit
+    # outweights the benefits of rebasing in-memory, and executing an extra
+    # update command adds a bit of overhead, so better to just do it on disk. In
+    # all other cases leave it on.
+    #
+    # Note that there are cases where this isn't true -- e.g., rebasing large
+    # stacks that include the WCP. However, I'm not yet sure where the cutoff
+    # is.
+    rebasingwcp = repo['.'].rev() in rebaseset
+    if opts['inmemory'] and rebasingwcp:
+        opts['inmemory'] = False
+        # Check these since we did not before.
+        cmdutil.checkunfinished(repo)
+        cmdutil.bailifchanged(repo)
 
     if not destf:
         dest = repo[_destrebase(repo, rebaseset, destspace=destspace)]