From patchwork Mon Oct 2 21:16:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D777: merge: add merge action 'pr' to rename files during update From: phabricator X-Patchwork-Id: 24417 Message-Id: <45ade7f098fc1894b74d079d406198e1@localhost.localdomain> To: mercurial-devel@mercurial-scm.org Date: Mon, 2 Oct 2017 21:16:01 +0000 mbthomas updated this revision to Diff 2354. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D777?vs=2213&id=2354 REVISION DETAIL https://phab.mercurial-scm.org/D777 AFFECTED FILES mercurial/merge.py mercurial/sparse.py CHANGE DETAILS To: mbthomas, #hg-reviewers Cc: ryanmce, mercurial-devel diff --git a/mercurial/sparse.py b/mercurial/sparse.py --- a/mercurial/sparse.py +++ b/mercurial/sparse.py @@ -487,7 +487,7 @@ # Apply changes to disk typeactions = dict((m, []) - for m in 'a f g am cd dc r dm dg m e k p'.split()) + for m in 'a f g am cd dc r dm dg m e k p pr'.split()) for f, (m, args, msg) in actions.iteritems(): if m not in typeactions: typeactions[m] = [] diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -1263,14 +1263,26 @@ z += 1 progress(_updating, z, item=f, total=numupdates, unit=_files) - # remove in parallel (must come before getting) + # remove in parallel (must come before resolving path conflicts and getting) prog = worker.worker(repo.ui, 0.001, batchremove, (repo, wctx), actions['r']) for i, item in prog: z += i progress(_updating, z, item=item, total=numupdates, unit=_files) removed = len(actions['r']) + # resolve path conflicts (must come before getting) + for f, args, msg in actions['pr']: + repo.ui.debug(" %s: %s -> pr\n" % (f, msg)) + f0, = args + if wctx[f0].lexists(): + repo.ui.note(_("moving %s to %s\n") % (f0, f)) + wctx[f].audit() + wctx[f].write(wctx.filectx(f0).data(), wctx.filectx(f0).flags()) + wctx[f0].remove() + z += 1 + progress(_updating, z, item=f, total=numupdates, unit=_files) + # We should flush before forking into worker processes, since those workers # flush when they complete, and we don't want to duplicate work. wctx.flushall() @@ -1443,6 +1455,17 @@ for f, args, msg in actions.get('f', []): repo.dirstate.drop(f) + # resolve path conflicts + for f, args, msg in actions.get('pr', []): + f0, = args + origf0 = repo.dirstate.copied(f0) or f0 + repo.dirstate.add(f) + repo.dirstate.copy(origf0, f) + if f0 == origf0: + repo.dirstate.remove(f0) + else: + repo.dirstate.drop(f0) + # re-add for f, args, msg in actions.get('a', []): repo.dirstate.add(f) @@ -1678,7 +1701,7 @@ if updatecheck == 'noconflict': for f, (m, args, msg) in actionbyfile.iteritems(): - if m not in ('g', 'k', 'e', 'r'): + if m not in ('g', 'k', 'e', 'r', 'pr'): msg = _("conflicting changes") hint = _("commit or update --clean to discard changes") raise error.Abort(msg, hint=hint) @@ -1714,7 +1737,7 @@ # Convert to dictionary-of-lists format actions = dict((m, []) - for m in 'a am f g cd dc r dm dg m e k p'.split()) + for m in 'a am f g cd dc r dm dg m e k p pr'.split()) for f, (m, args, msg) in actionbyfile.iteritems(): if m not in actions: actions[m] = []