phases: introduce phasecache
The original motivation was changectx.phase() had special logic to
correctly lookup in repo._phaserev, including invalidating it when
necessary. And at other places, repo._phaserev was accessed directly.
This led to the discovery that phases state including _phaseroots,
_phaserev and _dirtyphase was manipulated in localrepository.py,
phases.py, repair.py, etc. phasecache helps encapsulating that.
This patch replaces all phase state in localrepo with phasecache and
adjust related code except for advance/retractboundary() in phases.
These still access to phasecache internals directly. This will be
addressed in a followup.
test that 'hg commit' does not crash if the user removes a newly added file
$ hg init
$ echo This is file a1 > a
$ hg add a
$ hg commit -m "commit #0"
$ touch b
$ hg add b
$ rm b
$ hg commit -A -m"comment #1"
removing b
nothing changed
[1]