obsolete: introduce caches for all meaningful sets
This changeset introduces caches on the `obsstore` that keeps track of sets of
revisions meaningful for obsolescence related logics. For now they are:
- obsolete: changesets used as precursors (and not public),
- extinct: obsolete changesets with osbolete descendants only,
- unstable: non obsolete changesets with obsolete ancestors.
The cache is accessed using the `getobscache(repo, '<set-name>')` function which
builds the cache on demand. The `clearobscaches(repo)` function takes care of
clearing the caches if any.
Caches are cleared when one of these events happens:
- a new marker is added,
- a new changeset is added,
- some changesets are made public,
- some public changesets are demoted to draft or secret.
Declaration of more sets is made easy because we will have to handle at least
two other "troubles" (latecomer and conflicting).
Caches are now used by revset and changectx. It is usually not much more
expensive to compute the whole set than to check the property of a few elements.
The performance boost is welcome in case we apply obsolescence logic on a lot of
revisions. This makes the feature usable!
$ "$TESTDIR/hghave" inotify || exit 80
$ hg init
$ touch a b c d e f
$ echo "[extensions]" >> $HGRCPATH
$ echo "inotify=" >> $HGRCPATH
inserve
$ hg inserve -d --pid-file=hg.pid 2>&1
$ cat hg.pid >> "$DAEMON_PIDS"
$ hg ci -Am m
adding a
adding b
adding c
adding d
adding e
adding f
adding hg.pid
let the daemon finish its stuff
$ sleep 1
eed to test all file opperations
$ hg rm a
$ rm b
$ echo c >> c
$ touch g
$ hg add g
$ hg mv e h
$ hg status
M c
A g
A h
R a
R e
! b
$ sleep 1
Are we able to kill the service? if not, the service died on some error
$ kill `cat hg.pid`