diff -r 26b84128c54d -r cb15835456cb mercurial/merge.py --- a/mercurial/merge.py Thu May 15 02:14:59 2014 +0200 +++ b/mercurial/merge.py Tue Apr 22 02:10:25 2014 +0200 @@ -591,9 +591,9 @@ wwrite = repo.wwrite audit = repo.wopener.audit i = 0 - for arg in args: - f = arg[0] - if arg[1] == 'r': + for f, m, args, msg in args: + repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) + if m == 'r': if verbose: repo.ui.note(_("removing %s\n") % f) audit(f) @@ -605,7 +605,7 @@ else: if verbose: repo.ui.note(_("getting %s\n") % f) - wwrite(f, fctx(f).data(), arg[2][0]) + wwrite(f, fctx(f).data(), args[0]) if i == 100: yield i, f i = 0 @@ -632,12 +632,11 @@ # prescan for merges for a in actions: f, m, args, msg = a - repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) if m == "m": # merge f1, f2, fa, move, anc = args if f == '.hgsubstate': # merged internally continue - repo.ui.debug(" preserving %s for resolve of %s\n" % (f1, f)) + repo.ui.debug(" preserving %s for resolve of %s\n" % (f1, f)) fcl = wctx[f1] fco = mctx[f2] actx = repo[anc] @@ -667,7 +666,7 @@ updated = len(updateactions) removeactions = [a for a in workeractions if a[1] == 'r'] removed = len(removeactions) - actions = [a for a in actions if a[1] not in 'grk'] + actions = [a for a in actions if a[1] not in 'gr'] hgsub = [a[1] for a in workeractions if a[0] == '.hgsubstate'] if hgsub and hgsub[0] == 'r': @@ -691,10 +690,30 @@ if hgsub and hgsub[0] == 'g': subrepo.submerge(repo, wctx, mctx, wctx, overwrite) - for i, a in enumerate(actions): - f, m, args, msg = a - progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files) - if m == "m": # merge + for f, m, args, msg in actions: + + # forget (manifest only, just log it) (must come first) + if m == "f": + repo.ui.debug(" %s: %s -> f\n" % (f, msg)) + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) + + # re-add (manifest only, just log it) + elif m == "a": + repo.ui.debug(" %s: %s -> a\n" % (f, msg)) + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) + + # keep (noop, just log it) + elif m == "k": + repo.ui.debug(" %s: %s -> k\n" % (f, msg)) + # no progress + + # merge + elif m == "m": + repo.ui.debug(" %s: %s -> m\n" % (f, msg)) + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) f1, f2, fa, move, anc = args if f == '.hgsubstate': # subrepo states need updating subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), @@ -709,35 +728,61 @@ updated += 1 else: merged += 1 - elif m == "dm": # directory rename, move local + + # directory rename, move local + elif m == "dm": + repo.ui.debug(" %s: %s -> dm\n" % (f, msg)) + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) f0, flags = args repo.ui.note(_("moving %s to %s\n") % (f0, f)) audit(f) repo.wwrite(f, wctx.filectx(f0).data(), flags) util.unlinkpath(repo.wjoin(f0)) updated += 1 - elif m == "dg": # local directory rename, get + + # local directory rename, get + elif m == "dg": + repo.ui.debug(" %s: %s -> dg\n" % (f, msg)) + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) f0, flags = args repo.ui.note(_("getting %s to %s\n") % (f0, f)) repo.wwrite(f, mctx.filectx(f0).data(), flags) updated += 1 - elif m == "dr": # divergent renames + + # divergent renames + elif m == "dr": + repo.ui.debug(" %s: %s -> dr\n" % (f, msg)) + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) fl, = args repo.ui.warn(_("note: possible conflict - %s was renamed " "multiple times to:\n") % f) for nf in fl: repo.ui.warn(" %s\n" % nf) - elif m == "rd": # rename and delete + + # rename and delete + elif m == "rd": + repo.ui.debug(" %s: %s -> rd\n" % (f, msg)) + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) fl, = args repo.ui.warn(_("note: possible conflict - %s was deleted " "and renamed to:\n") % f) for nf in fl: repo.ui.warn(" %s\n" % nf) - elif m == "e": # exec + + # exec + elif m == "e": + repo.ui.debug(" %s: %s -> e\n" % (f, msg)) + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) flags, = args audit(f) util.setflags(repo.wjoin(f), 'l' in flags, 'x' in flags) updated += 1 + ms.commit() progress(_updating, None, total=numupdates, unit=_files) @@ -764,7 +809,7 @@ actions = manifestmerge(repo, wctx, mctx, ancestor, branchmerge, force, partial, acceptremote, followcopies) - for a in sorted(actions): + for a in sorted(actions, key=lambda a: (a[1], a)): f, m, args, msg = a repo.ui.debug(' %s: %s -> %s\n' % (f, msg, m)) if f in fbids: @@ -849,28 +894,41 @@ def recordupdates(repo, actions, branchmerge): "record merge actions to the dirstate" - for a in actions: - f, m, args, msg = a - if m == "r": # remove (must come first) + for f, m, args, msg in actions: + + # remove (must come first) + if m == "r": # remove if branchmerge: repo.dirstate.remove(f) else: repo.dirstate.drop(f) - elif m == "f": # forget (must come first) + + # forget (must come first) + elif m == "f": repo.dirstate.drop(f) - elif m == "a": # re-add + + # re-add + elif m == "a": if not branchmerge: repo.dirstate.add(f) - elif m == "e": # exec change + + # exec change + elif m == "e": repo.dirstate.normallookup(f) - elif m == "k": # keep + + # keep + elif m == "k": pass - elif m == "g": # get + + # get + elif m == "g": if branchmerge: repo.dirstate.otherparent(f) else: repo.dirstate.normal(f) - elif m == "m": # merge + + # merge + elif m == "m": f1, f2, fa, move, anc = args if branchmerge: # We've done a branch merge, mark this file as merged @@ -893,7 +951,9 @@ repo.dirstate.normallookup(f) if move: repo.dirstate.drop(f1) - elif m == "dm": # directory rename, move local + + # directory rename, move local + elif m == "dm": f0, flag = args if f0 not in repo.dirstate: # untracked file moved @@ -905,7 +965,9 @@ else: repo.dirstate.normal(f) repo.dirstate.drop(f0) - elif m == "dg": # directory rename, get + + # directory rename, get + elif m == "dg": f0, flag = args if branchmerge: repo.dirstate.add(f)