[PATCH 2 of 9 mergedriver] filemerge: turn filemerge.filemerge into a class

Siddharth Agarwal sid0 at fb.com
Wed Oct 7 02:33:37 CDT 2015


# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1444181292 25200
#      Tue Oct 06 18:28:12 2015 -0700
# Node ID 3225fccf647a4c45e86b84746a1768ef408e96c7
# Parent  c9e8d74f140234d28d5af30927731223d7496431
filemerge: turn filemerge.filemerge into a class

We're going to store a bunch of state in between function calls on objects of
this class.

diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
--- a/hgext/largefiles/overrides.py
+++ b/hgext/largefiles/overrides.py
@@ -536,9 +536,15 @@ def mergerecordupdates(orig, repo, actio
 
 # Override filemerge to prompt the user about how they wish to merge
 # largefiles. This will handle identical edits without prompting the user.
-def overridefilemerge(origfn, repo, mynode, orig, fcd, fco, fca, labels=None):
+def overridefilemerge(origfn, mergectx):
+    orig = mergectx._orig
     if not lfutil.isstandin(orig):
-        return origfn(repo, mynode, orig, fcd, fco, fca, labels=labels)
+        return origfn(mergectx)
+
+    fca = mergectx._fca
+    fcd = mergectx._fcd
+    fco = mergectx._fco
+    repo = mergectx._repo
 
     ahash = fca.data().strip().lower()
     dhash = fcd.data().strip().lower()
diff --git a/hgext/largefiles/uisetup.py b/hgext/largefiles/uisetup.py
--- a/hgext/largefiles/uisetup.py
+++ b/hgext/largefiles/uisetup.py
@@ -102,7 +102,7 @@ def uisetup(ui):
                                     overrides.mergerecordupdates)
     entry = extensions.wrapfunction(merge, 'update',
                                     overrides.mergeupdate)
-    entry = extensions.wrapfunction(filemerge, 'filemerge',
+    entry = extensions.wrapfunction(filemerge.mergectx, 'merge',
                                     overrides.overridefilemerge)
     entry = extensions.wrapfunction(cmdutil, 'copy',
                                     overrides.overridecopy)
diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py
--- a/mercurial/filemerge.py
+++ b/mercurial/filemerge.py
@@ -431,17 +431,25 @@ def _formatlabels(repo, fcd, fco, fca, l
         newlabels.append(_formatconflictmarker(repo, ca, tmpl, labels[2], pad))
     return newlabels
 
-def filemerge(repo, mynode, orig, fcd, fco, fca, labels=None):
-    """perform a 3-way merge in the working directory
+class mergectx(object):
+    """perform a 3-way merge in the working directory"""
 
-    mynode = parent node before merge
-    orig = original local filename before merge
-    fco = other file context
-    fca = ancestor file context
-    fcd = local file context for current/destination file
-    """
+    def __init__(self, repo, mynode, orig, fcd, fco, fca, labels=None):
+        """
+        mynode = parent node before merge
+        orig = original local filename before merge
+        fco = other file context
+        fca = ancestor file context
+        fcd = local file context for current/destination file"""
+        self._repo = repo
+        self._mynode = mynode
+        self._orig = orig
+        self._fcd = fcd
+        self._fco = fco
+        self._fca = fca
+        self._labels = labels
 
-    if True:
+    def merge(self):
         def temp(prefix, ctx):
             pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
             (fd, name) = tempfile.mkstemp(prefix=pre)
@@ -451,6 +459,14 @@ def filemerge(repo, mynode, orig, fcd, f
             f.close()
             return name
 
+        repo = self._repo
+        mynode = self._mynode
+        orig = self._orig
+        fcd = self._fcd
+        fco = self._fco
+        fca = self._fca
+        labels = self._labels
+
         if not fco.cmp(fcd): # files identical?
             return None
 
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -308,8 +308,9 @@ class mergestate(object):
         f = self._repo.vfs('merge/' + hash)
         self._repo.wwrite(dfile, f.read(), flags)
         f.close()
-        r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca,
-                                labels=labels)
+        ctx = filemerge.mergectx(self._repo, self._local, lfile, fcd, fco, fca,
+                                 labels=labels)
+        r = ctx.merge()
         if r is None:
             # no real conflict
             del self._state[dfile]


More information about the Mercurial-devel mailing list