index: embed nodetree in index object to avoid reference cycle
Since the index has a reference to a nodetree and the nodetree has a
reference back to the index, there is a reference cycle, so the index
(and its nodetree) can never be freed. This patch fixes that by making
"nodetree" a plan C struct that the index can embed, and also
introduces a new "nodetreeObject" that is a Python type wrapping the
nodetree struct.
Thanks to Yuya for noticing this and for suggesting the solution.
All tests passed on the first attempt once it compiled (I guess C is
like Haskell in this regard?).
Differential Revision: https://phab.mercurial-scm.org/D4372
#require symlink
$ origdir=`pwd`
$ hg init repo
$ cd repo
$ ln -s nothing dangling
avoid tar warnings about old timestamp
$ hg ci -d '2000-01-01 00:00:00 +0000' -qAm 'add symlink'
$ hg archive -t files ../archive
$ hg archive -t tar -p tar ../archive.tar
$ hg archive -t zip -p zip ../archive.zip
files
$ cd "$origdir"
$ cd archive
$ readlink.py dangling
dangling -> nothing
tar
$ cd "$origdir"
$ tar xf archive.tar
$ cd tar
$ readlink.py dangling
dangling -> nothing
#if unziplinks
zip
$ cd "$origdir"
$ unzip archive.zip > /dev/null 2>&1
$ cd zip
$ readlink.py dangling
dangling -> nothing
#endif
$ cd ..