Rename info lost after repeated amends
Greg Ward
greg at gerg.ca
Thu Apr 17 14:50:30 UTC 2014
On 17 April 2014, To evolve-testers at selenic.com said:
> I just got bitten by a bug that I think I have seen before: I'm
> working on a single changeset that reorganizes a project, so there are
> a lot of plain renames and a lot of renames that include small changes
> (update imports, etc.).
A bit more detail: it appears that pure renames are not mangled by
evolve. But a rename with a diff is mangled: it simply becomes
add/remove of unrelated files. Or at least that's what I now suspect
from manually inspecting the predecessor/successor graph.
> I believe I can
> workaround the problem with "hg rename --after" and another "hg
> amend", but yuck.
Actually, that didn't work. "hg rename --after OLD NEW" requires
that OLD still be present in the working dir.
What I ended up doing is creating a brand-new reorg changeset that had
no relationship with the mangled one. Here's the idea:
hg update $oldrev
where $oldrev is the parent of my bad amended changeset, i.e. my
project without any of my reorganization changes. Then I want to apply
all the reorg changes, ignoring copy information:
hg revert -a -r $badrev
where $badrev is the latest amended changeset, i.e. the desired end
state of the project. It's "bad" because the rename information has
been mangled by evolve.
At this point my working dir looks like
$ hg status -C
A newname
R oldname
(many times over). I need to make newname a rename of oldname. But "hg
rename --after" won't work, because oldname does not exist. Hmmmmm.
The trick was to make the dirstate look like it did after "hg up
$oldrev", but keep the working dir looking like $badrev:
removed=`hg status -rn`
hg revert $removed
rm $removed
added=`hg status -an`
hg forget $added
Now my working dir looks like
$ hg status -C
? newname
! oldname
Perfect! This is exactly the use case for
$ hg addremove -s 80
and now things look right:
$ hg status -C
A newname
oldname
R oldname
So now I can commit a brand-new changeset with my reorg as it should
have looked from the start.
I would not expect this workaround to occur to anyone who has not
spent a lot of time hacking on Mercurial. ;-)
Greg
More information about the Evolve-testers
mailing list