sparse: refactor update actions filtering and call from core
authorGregory Szorc <gregory.szorc@gmail.com>
Thu, 06 Jul 2017 16:29:31 -0700
changeset 33323 252500520d60
parent 33322 fa6c2c3064fd
child 33324 33d0859c37bd
sparse: refactor update actions filtering and call from core merge.calculateupdates() now filters the update actions through sparse by default. The filtering no-ops if sparse isn't enabled or no sparse config is defined. The function has been refactored to behave more like a filter instead of a wrapper of merge.calculateupdates(). We should arguably take sparse into account earlier in merge.calculateupdates(). This patch preserves the old behavior of applying sparse at the end of update calculation, which is the simplest and safest approach.
hgext/sparse.py
mercurial/merge.py
mercurial/sparse.py
--- a/hgext/sparse.py	Thu Jul 06 16:17:35 2017 -0700
+++ b/hgext/sparse.py	Thu Jul 06 16:29:31 2017 -0700
@@ -102,7 +102,6 @@
 command = registrar.command(cmdtable)
 
 def uisetup(ui):
-    _setupupdates(ui)
     _setupcommit(ui)
 
 def extsetup(ui):
@@ -136,10 +135,6 @@
         raise AttributeError(_("type '%s' has no property '%s'") % (origcls,
                              propname))
 
-def _setupupdates(ui):
-    extensions.wrapfunction(mergemod, 'calculateupdates',
-                            sparse.calculateupdates)
-
 def _setupcommit(ui):
     def _refreshoncommit(orig, self, node):
         """Refresh the checkout when commits touch .hgsparse
--- a/mercurial/merge.py	Thu Jul 06 16:17:35 2017 -0700
+++ b/mercurial/merge.py	Thu Jul 06 16:29:31 2017 -0700
@@ -975,7 +975,10 @@
 def calculateupdates(repo, wctx, mctx, ancestors, branchmerge, force,
                      acceptremote, followcopies, matcher=None,
                      mergeforce=False):
-    "Calculate the actions needed to merge mctx into wctx using ancestors"
+    """Calculate the actions needed to merge mctx into wctx using ancestors"""
+    # Avoid cycle.
+    from . import sparse
+
     if len(ancestors) == 1: # default
         actions, diverge, renamedelete = manifestmerge(
             repo, wctx, mctx, ancestors[0], branchmerge, force, matcher,
@@ -1074,7 +1077,10 @@
         fractions = _forgetremoved(wctx, mctx, branchmerge)
         actions.update(fractions)
 
-    return actions, diverge, renamedelete
+    prunedactions = sparse.filterupdatesactions(repo, wctx, mctx, branchmerge,
+                                                actions)
+
+    return prunedactions, diverge, renamedelete
 
 def batchremove(repo, wctx, actions):
     """apply removes to the working directory
--- a/mercurial/sparse.py	Thu Jul 06 16:17:35 2017 -0700
+++ b/mercurial/sparse.py	Thu Jul 06 16:29:31 2017 -0700
@@ -301,18 +301,16 @@
 
     return result
 
-def calculateupdates(orig, repo, wctx, mctx, ancestors, branchmerge, *arg,
-                      **kwargs):
-    """Filter updates to only lay out files that match the sparse rules.
-    """
-    actions, diverge, renamedelete = orig(repo, wctx, mctx, ancestors,
-                                          branchmerge, *arg, **kwargs)
+def filterupdatesactions(repo, wctx, mctx, branchmerge, actions):
+    """Filter updates to only lay out files that match the sparse rules."""
+    if not enabled:
+        return actions
 
     oldrevs = [pctx.rev() for pctx in wctx.parents()]
     oldsparsematch = matcher(repo, oldrevs)
 
     if oldsparsematch.always():
-        return actions, diverge, renamedelete
+        return actions
 
     files = set()
     prunedactions = {}
@@ -383,4 +381,4 @@
             elif old and not new:
                 prunedactions[file] = ('r', [], '')
 
-    return prunedactions, diverge, renamedelete
+    return prunedactions