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" pygments || exit 80
cat <<EOF >> $HGRCPATH
[extensions]
highlight =
[web]
pygments_style = friendly
EOF
hg init test
cd test
# create random Python file to exercise Pygments
cat <<EOF > primes.py
#!/usr/bin/env python
"""Fun with generators. Corresponding Haskell implementation:
primes = 2 : sieve [3, 5..]
where sieve (p:ns) = p : sieve [n | n <- ns, mod n p /= 0]
"""
from itertools import dropwhile, ifilter, islice, count, chain
def primes():
"""Generate all primes."""
def sieve(ns):
p = ns.next()
# It is important to yield *here* in order to stop the
# infinite recursion.
yield p
ns = ifilter(lambda n: n % p != 0, ns)
for n in sieve(ns):
yield n
odds = ifilter(lambda i: i % 2 == 1, count())
return chain([2], sieve(dropwhile(lambda n: n < 3, odds)))
if __name__ == "__main__":
import sys
try:
n = int(sys.argv[1])
except (ValueError, IndexError):
n = 10
p = primes()
print "The first %d primes: %s" % (n, list(islice(p, n)))
EOF
hg ci -Ama
echo % hg serve
hg serve -p $HGPORT -d -n test --pid-file=hg.pid -A access.log -E errors.log
cat hg.pid >> $DAEMON_PIDS
echo % hgweb filerevision, html
("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/primes.py') \
| sed "s/class=\"k\"/class=\"kn\"/g" | sed "s/class=\"mf\"/class=\"mi\"/g"
echo % hgweb fileannotate, html
("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/annotate/tip/primes.py') \
| sed "s/class=\"k\"/class=\"kn\"/g" | sed "s/class=\"mi\"/class=\"mf\"/g"
echo % hgweb fileannotate, raw
("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/annotate/tip/primes.py?style=raw') \
| sed "s/test@//" > a
echo "200 Script output follows" > b
echo "" >> b
echo "" >> b
hg annotate "primes.py" >> b
echo "" >> b
echo "" >> b
echo "" >> b
echo "" >> b
diff -u b a
echo
echo % hgweb filerevision, raw
("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/primes.py?style=raw') \
> a
echo "200 Script output follows" > b
echo "" >> b
hg cat primes.py >> b
diff -u b a
echo
echo % hgweb highlightcss friendly
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/highlightcss' > out
head -n 4 out
rm out
echo % errors encountered
cat errors.log
"$TESTDIR/killdaemons.py"
# Change the pygments style
cat > .hg/hgrc <<EOF
[web]
pygments_style = fruity
EOF
echo % hg serve again
hg serve -p $HGPORT -d -n test --pid-file=hg.pid -A access.log -E errors.log
cat hg.pid >> $DAEMON_PIDS
echo % hgweb highlightcss fruity
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/highlightcss' > out
head -n 4 out
rm out
echo % errors encountered
cat errors.log
cd ..
hg init eucjp
cd eucjp
python -c 'print("\265\376")' >> eucjp.txt # Japanese kanji "Kyo"
hg ci -Ama
hgserveget () {
"$TESTDIR/killdaemons.py"
echo % HGENCODING="$1" hg serve
HGENCODING="$1" hg serve -p $HGPORT -d -n test --pid-file=hg.pid -E errors.log
cat hg.pid >> $DAEMON_PIDS
echo % hgweb filerevision, html
"$TESTDIR/get-with-headers.py" localhost:$HGPORT "/file/tip/$2" \
| grep '<div class="parity0 source">' | $TESTDIR/printrepr.py
echo % errors encountered
cat errors.log
}
hgserveget euc-jp eucjp.txt
hgserveget utf-8 eucjp.txt
hgserveget us-ascii eucjp.txt