Fix memory leak when using hg commands over http repositories
When using hg commands over an http repository in a long running process, a
httphandler instance is leaked for each command, because of a loop
handler.parent -> OpenerDirector and OpenerDirector.handlers -> handler which
is not handled by Python's gc. Discussion on #mercurial concluded that removing
the __del__ method solved the problem.
#!/bin/sh
"$TESTDIR/hghave" svn || exit 80
fix_path()
{
tr '\\' /
}
escapedwd=`pwd | fix_path`
# SVN wants all paths to start with a slash. Unfortunately,
# Windows ones don't. Handle that.
expr "$escapedwd" : "\/" > /dev/null
if [ $? -ne 0 ]; then
escapedwd="/$escapedwd"
fi
escapedwd=`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$escapedwd"`
filterpath="s|$escapedwd|/root|"
filteroutofdate='s/ in transaction.*/ is out of date/;s/Out of date: /File /'
filterexternal="s|Fetching external item into '.*/s/externals'|Fetching external item into 's/externals'|g"
echo % create subversion repo
SVNREPO="file://$escapedwd/svn-repo"
WCROOT="`pwd`/svn-wc"
svnadmin create svn-repo
svn co "$SVNREPO" svn-wc
cd svn-wc
mkdir src
echo alpha > src/alpha
svn add src
mkdir externals
echo other > externals/other
svn add externals
svn ci -m 'Add alpha'
svn up
cat > extdef <<EOF
externals -r1 $SVNREPO/externals
EOF
svn propset -F extdef svn:externals src
svn ci -m 'Setting externals'
cd ..
echo % create hg repo
mkdir sub
cd sub
hg init t
cd t
echo % first revision, no sub
echo a > a
hg ci -Am0
echo % add first svn sub with leading whitespaces
echo "s = [svn] $SVNREPO/src" >> .hgsub
svn co --quiet "$SVNREPO"/src s
hg add .hgsub
hg ci -m1
echo % debugsub
hg debugsub | sed "$filterpath"
echo
echo % change file in svn and hg, commit
echo a >> a
echo alpha >> s/alpha
hg commit -m 'Message!' | sed "$filterexternal" \
| sed 's:Sending.*s/alpha:Sending s/alpha:g'
hg debugsub | sed "$filterpath"
echo
echo a > s/a
echo % should be empty despite change to s/a
hg st
echo
echo % add a commit from svn
cd "$WCROOT"/src
svn up
echo xyz >> alpha
svn propset svn:mime-type 'text/xml' alpha
svn ci -m 'amend a from svn'
cd ../../sub/t
echo % this commit from hg will fail
echo zzz >> s/alpha
hg ci -m 'amend alpha from hg' 2>&1 | sed "$filteroutofdate"
svn revert -q s/alpha
echo % this commit fails because of meta changes
svn propset svn:mime-type 'text/html' s/alpha
hg ci -m 'amend alpha from hg' 2>&1 | sed "$filteroutofdate"
svn revert -q s/alpha
echo % this commit fails because of externals changes
echo zzz > s/externals/other
hg ci -m 'amend externals from hg'
svn revert -q s/externals/other
echo % this commit fails because of externals meta changes
svn propset svn:mime-type 'text/html' s/externals/other
hg ci -m 'amend externals from hg'
svn revert -q s/externals/other
echo
echo % clone
cd ..
hg clone t tc | fix_path
cd tc
echo % debugsub in clone
hg debugsub | sed "$filterpath"
echo % verify subrepo is contained within the repo directory
python -c "import os.path; print os.path.exists('s')"