# HG changeset patch # User Pierre-Yves David # Date 1416973254 28800 # Node ID edf29f9c15f0f171847f4c7a8184cca4e95c8b31 # Parent 2963d5c9d90ba0060ee7d552c3b56b95aca5fcd3 revert: look for copy information for all local modifications Renaming a file over an existing one marks the file as modified. So we track rename source in modified file too. diff -r 2963d5c9d90b -r edf29f9c15f0 mercurial/cmdutil.py --- a/mercurial/cmdutil.py Mon Nov 24 18:42:56 2014 -0800 +++ b/mercurial/cmdutil.py Tue Nov 25 19:40:54 2014 -0800 @@ -2531,12 +2531,16 @@ dsmodified = modified dsadded = added dsremoved = removed + # store all local modifications, useful later for rename detection + localchanges = dsmodified | dsadded modified, added, removed = set(), set(), set() else: changes = repo.status(node1=parent, match=m) dsmodified = set(changes[0]) dsadded = set(changes[1]) dsremoved = set(changes[2]) + # store all local modifications, useful later for rename detection + localchanges = dsmodified | dsadded # only take into account for removes between wc and target clean |= dsremoved - removed @@ -2570,7 +2574,7 @@ # if f is a rename, update `names` to also revert the source cwd = repo.getcwd() - for f in dsadded: + for f in localchanges: src = repo.dirstate.copied(f) # XXX should we check for rename down to target node? if src and src not in names and repo.dirstate[src] == 'r': diff -r 2963d5c9d90b -r edf29f9c15f0 tests/test-revert.t --- a/tests/test-revert.t Mon Nov 24 18:42:56 2014 -0800 +++ b/tests/test-revert.t Tue Nov 25 19:40:54 2014 -0800 @@ -234,6 +234,12 @@ $ hg st a newa ? newa +Also true for move overwriting an existing file + + $ hg mv --force a b/b + $ hg revert b/b + $ hg status a b/b + $ cd .. $ hg init ignored