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

Augie Fackler raf at durin42.com
Wed Oct 7 13:04:02 CDT 2015


On Wed, Oct 07, 2015 at 12:33:37AM -0700, Siddharth Agarwal wrote:
> # 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"""

it looks like this docstring lost its way and wants to live on
mergectx.merge()? and then this type wants to be documented as a state
container for merges or something like that

>
> -    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]
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list