[PATCH 4 of 5 V2] manifestmerge: handle abort on local unknown, remote created files

Mads Kiilerich mads at kiilerich.com
Sat Feb 9 06:00:21 CST 2013


On 02/08/2013 11:18 PM, Siddharth Agarwal wrote:
> # HG changeset patch
> # User Siddharth Agarwal <sid0 at fb.com>
> # Date 1360357062 0
> # Node ID a3d0334527f026f4eb338c10f225b09def43d911
> # Parent  c163fe6e519eabe8d2bff85d9b2c7c345e38d5ba
> manifestmerge: handle abort on local unknown, remote created files

Is this handling a new case and fixing a bug? Or is it duplicating 
existing functionality as an optimization or cleanup?

(Should be explained here ... and perhaps tested if it makes any visible 
changes.)

> diff --git a/mercurial/merge.py b/mercurial/merge.py
> --- a/mercurial/merge.py
> +++ b/mercurial/merge.py
> @@ -224,7 +224,7 @@ def manifestmerge(repo, p1, p2, pa, bran
>                   m1['.hgsubstate'] += "+"
>                   break
>   
> -    prompts = []
> +    aborts, prompts = [], []
>       # Compare manifests
>       for f, n in m1.iteritems():
>           if partial and not partial(f):
> @@ -285,15 +285,40 @@ def manifestmerge(repo, p1, p2, pa, bran
>                   actions.append((f2, "m", (f, f, True),
>                                   "remote moved to " + f))
>           elif f not in ma:
> -            if (not overwrite
> -                and _checkunknownfile(repo, p1, p2, f)):
> -                actions.append((f, "m", (f, f, False),
> -                                "remote differs from untracked local"))
> +            # local unknown, remote created: the logic is described by the
> +            # following table:
> +            #
> +            # force  branchmerge  different  |  action
> +            #   n         *           n      |    get
> +            #   n         *           y      |   abort
> +            #   y         n           *      |    get
> +            #   y         y           n      |    get
> +            #   y         y           y      |   merge
> +            #

Do we have test coverage for all these cases?

> +            # Checking whether the files are different is expensive, so we
> +            # don't do that when we can avoid it.
> +            if force and not branchmerge:
> +                actions.append((f, "g", (m2.flags(f),), "remote created"))
>               else:
> -                actions.append((f, "g", (m2.flags(f),), "remote created"))
> +                different = _checkunknownfile(repo, p1, p2, f)
> +                if force and branchmerge and different:
> +                    actions.append((f, "m", (f, f, False),
> +                                    "remote differs from untracked local"))
> +                elif not force and different:
> +                    aborts.append((f, "ud"))
> +                else:
> +                    actions.append((f, "g", (m2.flags(f),), "remote created"))
>           elif n != ma[f]:
>               prompts.append((f, "dc")) # prompt deleted/changed
>   
> +    for f, m in sorted(aborts):
> +        if m == "ud":
> +            repo.ui.warn(_("%s: untracked file differs\n") % f)
> +        else: assert False, m
> +    if aborts:
> +        raise util.Abort(_("untracked files in working directory differ "
> +                           "from files in requested revision"))
> +
>       for f, m in sorted(prompts):
>           if m == "cd":
>               if repo.ui.promptchoice(

/Mads


More information about the Mercurial-devel mailing list