Mercurial > hg
annotate tests/test-subrepo-relative-path.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 | ce05c8130296 |
children | 9bbaafddfa90 |
rev | line source |
---|---|
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
1 Preparing the subrepository 'sub' |
11109
a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
Edouard Gomez <ed.gomez@free.fr>
parents:
diff
changeset
|
2 |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
3 $ hg init sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
4 $ echo sub > sub/sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
5 $ hg add -R sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
6 adding sub/sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
7 $ hg commit -R sub -m "sub import" |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
8 |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
9 Preparing the 'main' repo which depends on the subrepo 'sub' |
11109
a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
Edouard Gomez <ed.gomez@free.fr>
parents:
diff
changeset
|
10 |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
11 $ hg init main |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
12 $ echo main > main/main |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
13 $ echo "sub = ../sub" > main/.hgsub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
14 $ hg clone sub main/sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
15 updating to branch default |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
16 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
17 $ hg add -R main |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
18 adding main/.hgsub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
19 adding main/main |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
20 $ hg commit -R main -m "main import" |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
21 committing subrepository sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
22 |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
23 Cleaning both repositories, just as a clone -U |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
24 |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
25 $ hg up -C -R sub null |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
26 0 files updated, 0 files merged, 1 files removed, 0 files unresolved |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
27 $ hg up -C -R main null |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
28 0 files updated, 0 files merged, 3 files removed, 0 files unresolved |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
29 $ rm -rf main/sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
30 |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
31 Serving them both using hgweb |
11109
a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
Edouard Gomez <ed.gomez@free.fr>
parents:
diff
changeset
|
32 |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
33 $ printf '[paths]\n/main = main\nsub = sub\n' > webdir.conf |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
34 $ hg serve --webdir-conf webdir.conf -a localhost -p $HGPORT \ |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
35 > -A /dev/null -E /dev/null --pid-file hg.pid -d |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
36 $ cat hg.pid >> $DAEMON_PIDS |
11109
a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
Edouard Gomez <ed.gomez@free.fr>
parents:
diff
changeset
|
37 |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
38 Clone main from hgweb |
11109
a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
Edouard Gomez <ed.gomez@free.fr>
parents:
diff
changeset
|
39 |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
40 $ hg clone "http://localhost:$HGPORT/main" cloned |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
41 requesting all changes |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
42 adding changesets |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
43 adding manifests |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
44 adding file changes |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
45 added 1 changesets with 3 changes to 3 files |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
46 updating to branch default |
12643
d08bb64888bc
tests: reintroduce ":$HGPORT" in test output
Mads Kiilerich <mads@kiilerich.com>
parents:
12375
diff
changeset
|
47 pulling subrepo sub from http://localhost:$HGPORT/sub |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
48 requesting all changes |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
49 adding changesets |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
50 adding manifests |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
51 adding file changes |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
52 added 1 changesets with 1 changes to 1 files |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
53 3 files updated, 0 files merged, 0 files removed, 0 files unresolved |
11109
a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
Edouard Gomez <ed.gomez@free.fr>
parents:
diff
changeset
|
54 |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
55 Checking cloned repo ids |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
56 |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
57 $ hg id -R cloned |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
58 fdfeeb3e979e tip |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
59 $ hg id -R cloned/sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
60 863c1745b441 tip |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
61 |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
62 subrepo debug for 'main' clone |
11109
a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
Edouard Gomez <ed.gomez@free.fr>
parents:
diff
changeset
|
63 |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
64 $ hg debugsub -R cloned |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
65 path sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
66 source ../sub |
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
67 revision 863c1745b441bd97a8c4a096e87793073f4fb215 |
11109
a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
Edouard Gomez <ed.gomez@free.fr>
parents:
diff
changeset
|
68 |
11915
d521e72314f9
tests: unify test-subrepo-relative-path
Martin Geisler <mg@lazybytes.net>
parents:
11109
diff
changeset
|
69 $ "$TESTDIR/killdaemons.py" |