[PATCH 5 of 7 v2] merge: separate worker functions for batch remove and batch get

Mads Kiilerich mads at kiilerich.com
Thu May 8 19:06:09 CDT 2014


# HG changeset patch
# User Mads Kiilerich <madski at unity3d.com>
# Date 1399593303 -7200
#      Fri May 09 01:55:03 2014 +0200
# Node ID 4a8185700324491349446f7c90d023488bdc8b7a
# Parent  0543f63b9b432338037c5133b12c06bbae4cb024
merge: separate worker functions for batch remove and batch get

The old code had one function that could do 2 different things. First,
is was called a bunch of times to do one thing. Next, it was called a
bunch of times to do the other thing. That gave unnecessary complexity
and a dispatch overhead. Having separate functions is "obviously" better
than having a function that can do two things, depending on its parameters.
It also prepares the code for the next refactorings.

diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -557,23 +557,19 @@ actionpriority = dict((m, p) for p, m in
 def actionkey(a):
     return actionpriority[a[1]], a
 
-def getremove(repo, mctx, overwrite, args):
-    """apply usually-non-interactive updates to the working directory
-
-    mctx is the context to be merged into the working copy
+def batchremove(repo, actions):
+    """apply removes to the working directory
 
     yields tuples for progress updates
     """
     verbose = repo.ui.verbose
     unlink = util.unlinkpath
     wjoin = repo.wjoin
-    fctx = mctx.filectx
-    wwrite = repo.wwrite
     audit = repo.wopener.audit
     i = 0
-    for f, m, args, msg in args:
-        repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
-        if m == 'r':
+    for f, m, args, msg in actions:
+        repo.ui.debug(" %s: %s -> r\n" % (f, msg))
+        if True:
             if verbose:
                 repo.ui.note(_("removing %s\n") % f)
             audit(f)
@@ -582,7 +578,27 @@ def getremove(repo, mctx, overwrite, arg
             except OSError, inst:
                 repo.ui.warn(_("update failed to remove %s: %s!\n") %
                              (f, inst.strerror))
-        else:
+        if i == 100:
+            yield i, f
+            i = 0
+        i += 1
+    if i > 0:
+        yield i, f
+
+def batchget(repo, mctx, actions):
+    """apply gets to the working directory
+
+    mctx is the context to get from
+
+    yields tuples for progress updates
+    """
+    verbose = repo.ui.verbose
+    fctx = mctx.filectx
+    wwrite = repo.wwrite
+    i = 0
+    for f, m, args, msg in actions:
+        repo.ui.debug(" %s: %s -> g\n" % (f, msg))
+        if True:
             if verbose:
                 repo.ui.note(_("getting %s\n") % f)
             wwrite(f, fctx(f).data(), args[0])
@@ -654,15 +670,13 @@ def applyupdates(repo, actions, wctx, mc
 
     # remove in parallel (must come first)
     z = 0
-    prog = worker.worker(repo.ui, 0.001, getremove, (repo, mctx, overwrite),
-                         removeactions)
+    prog = worker.worker(repo.ui, 0.001, batchremove, (repo,), removeactions)
     for i, item in prog:
         z += i
         progress(_updating, z, item=item, total=numupdates, unit=_files)
 
     # get in parallel
-    prog = worker.worker(repo.ui, 0.001, getremove, (repo, mctx, overwrite),
-                         updateactions)
+    prog = worker.worker(repo.ui, 0.001, batchget, (repo, mctx), updateactions)
     for i, item in prog:
         z += i
         progress(_updating, z, item=item, total=numupdates, unit=_files)


More information about the Mercurial-devel mailing list