--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -177,10 +177,16 @@ def manifestmerge(repo, p1, p2, pa, over
Merge manifest m1 with m2 using ancestor ma and generate merge action list
"""
+ repo.ui.note(_("resolving manifests\n"))
+ repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial)))
+ repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2))
+
m1 = p1.manifest()
m2 = p2.manifest()
ma = pa.manifest()
backwards = (pa == p2)
+ action = []
+ copy = {}
def fmerge(f, f2=None, fa=None):
"""merge executable flags"""
@@ -190,13 +196,10 @@ def manifestmerge(repo, p1, p2, pa, over
a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2)
return ((a^b) | (a^c)) ^ a
- action = []
-
def act(msg, m, f, *args):
repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
action.append((f, m) + args)
- copy = {}
if not (backwards or overwrite):
copy = findcopies(repo, m1, m2, pa.rev())
@@ -355,70 +358,47 @@ def recordupdates(repo, action, branchme
def update(repo, node, branchmerge=False, force=False, partial=None,
wlock=None, show_stats=True, remind=True):
- overwrite = force and not branchmerge
- forcemerge = force and branchmerge
-
if not wlock:
wlock = repo.wlock()
- ### check phase
-
+ overwrite = force and not branchmerge
+ forcemerge = force and branchmerge
wc = repo.workingctx()
pl = wc.parents()
+ p1, p2 = pl[0], repo.changectx(node)
+ pa = p1.ancestor(p2)
+ fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
+
+ ### check phase
if not overwrite and len(pl) > 1:
raise util.Abort(_("outstanding uncommitted merges"))
-
- p1, p2 = pl[0], repo.changectx(node)
- pa = p1.ancestor(p2)
-
- # is there a linear path from p1 to p2?
- if pa == p1 or pa == p2:
+ if pa == p1 or pa == p2: # is there a linear path from p1 to p2?
if branchmerge:
raise util.Abort(_("there is nothing to merge, just use "
"'hg update' or look at 'hg heads'"))
elif not (overwrite or branchmerge):
raise util.Abort(_("update spans branches, use 'hg merge' "
"or 'hg update -C' to lose changes"))
-
if branchmerge and not forcemerge:
if wc.modified() or wc.added() or wc.removed():
raise util.Abort(_("outstanding uncommitted changes"))
- # resolve the manifest to determine which files
- # we care about merging
- repo.ui.note(_("resolving manifests\n"))
- repo.ui.debug(_(" overwrite %s branchmerge %s partial %s\n") %
- (overwrite, branchmerge, bool(partial)))
- repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa))
-
+ ### calculate phase
action = []
-
if not force:
checkunknown(wc, p2)
if not branchmerge:
action += forgetremoved(wc, p2)
-
action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
### apply phase
-
- if not branchmerge:
- # just jump to the new rev
- fp1, fp2, xp1, xp2 = p2.node(), nullid, str(p2), ''
- else:
- fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
-
+ if not branchmerge: # just jump to the new rev
+ fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
if not partial:
repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
updated, merged, removed, unresolved = applyupdates(repo, action, wc, p2)
- # update dirstate
- if not partial:
- recordupdates(repo, action, branchmerge, p2)
- repo.dirstate.setparents(fp1, fp2)
- repo.hook('update', parent1=xp1, parent2=xp2, error=unresolved)
-
if show_stats:
stats = ((updated, _("updated")),
(merged - unresolved, _("merged")),
@@ -427,6 +407,10 @@ def update(repo, node, branchmerge=False
note = ", ".join([_("%d files %s") % s for s in stats])
repo.ui.status("%s\n" % note)
if not partial:
+ recordupdates(repo, action, branchmerge, p2)
+ repo.dirstate.setparents(fp1, fp2)
+ repo.hook('update', parent1=xp1, parent2=xp2, error=unresolved)
+
if branchmerge:
if unresolved:
repo.ui.status(_("There are unresolved merges,"