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

login
register
mail settings
Submitter phabricator
Date Dec. 8, 2017, 7:27 a.m.
Message ID <71dc0cb973f6502331ab3d7c24ce2493@localhost.localdomain>
Download mbox | patch
Permalink /patch/26083/
State Not Applicable
Headers show

Comments

phabricator - Dec. 8, 2017, 7:27 a.m.
phillco updated this revision to Diff 4247.

REPOSITORY
  rHG Mercurial

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

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

AFFECTED FILES
  hgext/rebase.py

CHANGE DETAILS




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

Patch

diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -179,7 +179,6 @@ 
         self.keepopen = opts.get('keepopen', False)
         self.obsoletenotrebased = {}
         self.obsoletewithoutsuccessorindestination = set()
-        self.inmemory = opts.get('inmemory', False)
 
     @property
     def repo(self):
@@ -830,7 +829,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 +850,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 +864,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 +939,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)]