[PATCH 5 of 6 V2] merge: make calculateupdates() return file->action dict

Martin von Zweigbergk martinvonz at google.com
Mon Dec 22 15:36:21 CST 2014


# HG changeset patch
# User Martin von Zweigbergk <martinvonz at google.com>
# Date 1418364461 28800
#      Thu Dec 11 22:07:41 2014 -0800
# Node ID 787b47dc08bb4bfb86d4cc8d9cff6ceddbb26b94
# Parent  fa09171d55b46538a3f6c0cba139a0b328cbd97e
merge: make calculateupdates() return file->action dict

This simplifies largefiles' overridecalculateupdates(), which no
longer has to do the conversion it started doing in 38e55e55ae4d
(largefiles: rewrite merge code using dictionary with entry per file,
2014-12-09).

To keep this patch small, we'll leave the name 'actionbyfile' in
overrides.py. It will be renamed in the next patch.

diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
--- a/hgext/largefiles/overrides.py
+++ b/hgext/largefiles/overrides.py
@@ -435,15 +435,13 @@
 
     # Convert to dictionary with filename as key and action as value.
     lfiles = set()
-    actionbyfile = {}
-    for m, l in actions.iteritems():
-        for f, args, msg in l:
-            actionbyfile[f] = m, args, msg
-            splitstandin = f and lfutil.splitstandin(f)
-            if splitstandin in p1:
-                lfiles.add(splitstandin)
-            elif lfutil.standin(f) in p1:
-                lfiles.add(f)
+    actionbyfile = actions
+    for f in actionbyfile:
+        splitstandin = f and lfutil.splitstandin(f)
+        if splitstandin in p1:
+            lfiles.add(splitstandin)
+        elif lfutil.standin(f) in p1:
+            lfiles.add(f)
 
     for lfile in lfiles:
         standin = lfutil.standin(lfile)
@@ -489,14 +487,7 @@
                 actionbyfile[lfile] = ('g', largs, 'replaces standin')
                 actionbyfile[standin] = ('r', None, 'replaced by non-standin')
 
-    # Convert back to dictionary-of-lists format
-    for l in actions.itervalues():
-        l[:] = []
-    actions['lfmr'] = []
-    for f, (m, args, msg) in actionbyfile.iteritems():
-        actions[m].append((f, args, msg))
-
-    return actions, diverge, renamedelete
+    return actionbyfile, diverge, renamedelete
 
 def mergerecordupdates(orig, repo, actions, branchmerge):
     if 'lfmr' in actions:
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -621,12 +621,6 @@
         fractions = _forgetremoved(wctx, mctx, branchmerge)
         actions.update(fractions)
 
-    # Convert to dictionary-of-lists format
-    actionbyfile = actions
-    actions = dict((m, []) for m in 'a f g cd dc r dm dg m e k'.split())
-    for f, (m, args, msg) in actionbyfile.iteritems():
-        actions[m].append((f, args, msg))
-
     return actions, diverge, renamedelete
 
 def batchremove(repo, actions):
@@ -1069,9 +1063,15 @@
             followcopies = True
 
         ### calculate phase
-        actions, diverge, renamedelete = calculateupdates(
+        actionbyfile, diverge, renamedelete = calculateupdates(
             repo, wc, p2, pas, branchmerge, force, partial, mergeancestor,
             followcopies)
+        # Convert to dictionary-of-lists format
+        actions = dict((m, []) for m in 'a f g cd dc r dm dg m e k'.split())
+        for f, (m, args, msg) in actionbyfile.iteritems():
+            if m not in actions:
+                actions[m] = []
+            actions[m].append((f, args, msg))
 
         if not util.checkcase(repo.path):
             # check collision between files only in p2 for clean update


More information about the Mercurial-devel mailing list