annotate tests/test-gpg.t @ 14007:d764463b433e
atomictempfile: avoid infinite recursion in __del__().
The problem is that a programmer using atomictempfile directly can
make an innocent everyday mistake -- not enough args to the
constructor -- which escalates badly. You would expect a simple
TypeError crash in that case, but you actually get an infinite
recursion that is surprisingly difficult to kill: it happens between
__del__() and __getattr__(), and Python does not handle infinite
recursion from __del__() well.
The fix is to not implement __getattr__(), but instead assign instance
attributes for the methods we wish to delegate to the builtin file
type: write() and fileno(). I've audited mercurial.* and hgext.* and
found no users of atomictempfile using methods other than write() and
rename(). I audited third-party extensions and found one (snap)
passing an atomictempfile to util.fstat(), so I also threw in
fileno().
The last time I submitted a similar patch, Matt proposed that we make
atomictempfile a subclass of file instead of wrapping it. Rejected on
grounds of unnecessary complexity: for one thing, it would make the
Windows implementation of posixfile quite a bit more complex. It would
have to become a subclass of file rather than a simple function -- but
since it's written in C, this is non-obvious and non-trivial.
Furthermore, there's nothing wrong with wrapping objects and
delegating methods: it's a well-established pattern that works just
fine in many cases. Subclassing is not the answer to all of life's
problems.
author |
Greg Ward <greg@gerg.ca> |
date |
Sun, 24 Apr 2011 19:25:10 -0400 |
parents |
3aa7b6445aad |
children |
aae219a99a6e |
rev |
line source |
12428
|
1 Test the GPG extension
|
8809
|
2
|
12428
|
3 $ "$TESTDIR/hghave" gpg || exit 80
|
|
4 $ cat <<EOF >> $HGRCPATH
|
|
5 > [extensions]
|
|
6 > gpg=
|
|
7 >
|
|
8 > [gpg]
|
|
9 > cmd=gpg --no-permission-warning --no-secmem-warning --homedir $TESTDIR/gpg
|
|
10 > EOF
|
|
11 $ hg init r
|
|
12 $ cd r
|
|
13 $ echo foo > foo
|
|
14 $ hg ci -Amfoo
|
|
15 adding foo
|
8809
|
16
|
12428
|
17 $ hg sigs
|
|
18
|
|
19 $ hg sign 0
|
|
20 Signing 0:e63c23eaa88a
|
8809
|
21
|
12428
|
22 $ hg sigs
|
|
23 hgtest 0:e63c23eaa88ae77967edcf4ea194d31167c478b0
|
8809
|
24
|
12428
|
25 $ hg sigcheck 0
|
|
26 e63c23eaa88a is signed by:
|
|
27 hgtest
|