Patchwork [4,of,6] merge: separate worker functions for batch remove and batch get

login
register
mail settings
Submitter Mads Kiilerich
Date May 15, 2014, 12:22 a.m.
Message ID <afddf3cad901110f483f.1400113335@localhost.localdomain>
Download mbox | patch
Permalink /patch/4746/
State Accepted
Headers show

Comments

Mads Kiilerich - May 15, 2014, 12:22 a.m.
# HG changeset patch
# User Mads Kiilerich <madski@unity3d.com>
# Date 1399629716 -7200
#      Fri May 09 12:01:56 2014 +0200
# Node ID afddf3cad901110f483f5d7bfa4349714b226779
# Parent  2740781d704fe2b90b35e363b627babf316a19fc
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.

Patch

diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -577,23 +577,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)
@@ -602,7 +598,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])
@@ -674,15 +690,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)