[PATCH 4 of 5 V2] manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal
sid0 at fb.com
Fri Feb 8 16:18:07 CST 2013
# 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
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
+ #
+ # 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(
More information about the Mercurial-devel
mailing list