File: test-bad-extension.t

package info (click to toggle)
mercurial 5.6.1-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 38,792 kB
  • sloc: python: 196,559; ansic: 45,504; tcl: 3,715; lisp: 1,483; sh: 1,475; cpp: 864; javascript: 649; makefile: 581; xml: 36; sql: 30
file content (166 lines) | stat: -rw-r--r-- 7,449 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#require no-chg
  $ filterlog () {
  >   sed -e 's!^[0-9/]* [0-9:]* ([0-9]*)>!YYYY/MM/DD HH:MM:SS (PID)>!'
  > }

ensure that failing ui.atexit handlers report sensibly

  $ cat > $TESTTMP/bailatexit.py <<EOF
  > from mercurial import util
  > def bail():
  >     raise RuntimeError('ui.atexit handler exception')
  > 
  > def extsetup(ui):
  >     ui.atexit(bail)
  > EOF
  $ hg -q --config extensions.bailatexit=$TESTTMP/bailatexit.py \
  >  help help
  hg help [-eck] [-s PLATFORM] [TOPIC]
  
  show help for a given topic or a help overview
  error in exit handlers:
  Traceback (most recent call last):
    File "*/mercurial/dispatch.py", line *, in _runexithandlers (glob)
      func(*args, **kwargs)
    File "$TESTTMP/bailatexit.py", line *, in bail (glob)
      raise RuntimeError('ui.atexit handler exception')
  RuntimeError: ui.atexit handler exception
  [255]

  $ rm $TESTTMP/bailatexit.py

another bad extension

  $ echo 'raise Exception("bit bucket overflow")' > badext.py
  $ abspathexc=`pwd`/badext.py

  $ cat >baddocext.py <<EOF
  > """
  > baddocext is bad
  > """
  > EOF
  $ abspathdoc=`pwd`/baddocext.py

  $ cat <<EOF >> $HGRCPATH
  > [extensions]
  > gpg =
  > hgext.gpg =
  > badext = $abspathexc
  > baddocext = $abspathdoc
  > badext2 =
  > EOF

  $ hg -q help help 2>&1 |grep extension
  *** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
  *** failed to import extension badext2: No module named *badext2* (glob)

show traceback

  $ hg -q help help --traceback 2>&1 | egrep ' extension|^Exception|Traceback|ImportError|ModuleNotFound'
  *** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
  Traceback (most recent call last):
  Exception: bit bucket overflow
  *** failed to import extension badext2: No module named *badext2* (glob)
  Traceback (most recent call last):
  ImportError: No module named badext2 (no-py3 !)
  ImportError: No module named 'hgext.badext2' (py3 no-py36 !)
  ModuleNotFoundError: No module named 'hgext.badext2' (py36 !)
  Traceback (most recent call last): (py3 !)
  ImportError: No module named 'hgext3rd.badext2' (py3 no-py36 !)
  ModuleNotFoundError: No module named 'hgext3rd.badext2' (py36 !)
  Traceback (most recent call last): (py3 !)
  ImportError: No module named 'badext2' (py3 no-py36 !)
  ModuleNotFoundError: No module named 'badext2' (py36 !)

names of extensions failed to load can be accessed via extensions.notloaded()

  $ cat <<EOF > showbadexts.py
  > from mercurial import commands, extensions, registrar
  > cmdtable = {}
  > command = registrar.command(cmdtable)
  > @command(b'showbadexts', norepo=True)
  > def showbadexts(ui, *pats, **opts):
  >     ui.write(b'BADEXTS: %s\n' % b' '.join(sorted(extensions.notloaded())))
  > EOF
  $ hg --config extensions.badexts=showbadexts.py showbadexts 2>&1 | grep '^BADEXTS'
  BADEXTS: badext badext2

#if no-extraextensions
show traceback for ImportError of hgext.name if devel.debug.extensions is set

  $ (hg help help --traceback --debug --config devel.debug.extensions=yes 2>&1) \
  > | grep -v '^ ' \
  > | filterlog \
  > | egrep 'extension..[^p]|^Exception|Traceback|ImportError|^YYYY|not import|ModuleNotFound'
  YYYY/MM/DD HH:MM:SS (PID)> loading extensions
  YYYY/MM/DD HH:MM:SS (PID)> - processing 5 entries
  YYYY/MM/DD HH:MM:SS (PID)>   - loading extension: gpg
  YYYY/MM/DD HH:MM:SS (PID)>   > gpg extension loaded in * (glob)
  YYYY/MM/DD HH:MM:SS (PID)>     - validating extension tables: gpg
  YYYY/MM/DD HH:MM:SS (PID)>     - invoking registered callbacks: gpg
  YYYY/MM/DD HH:MM:SS (PID)>     > callbacks completed in * (glob)
  YYYY/MM/DD HH:MM:SS (PID)>   - loading extension: badext
  *** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
  Traceback (most recent call last):
  Exception: bit bucket overflow
  YYYY/MM/DD HH:MM:SS (PID)>   - loading extension: baddocext
  YYYY/MM/DD HH:MM:SS (PID)>   > baddocext extension loaded in * (glob)
  YYYY/MM/DD HH:MM:SS (PID)>     - validating extension tables: baddocext
  YYYY/MM/DD HH:MM:SS (PID)>     - invoking registered callbacks: baddocext
  YYYY/MM/DD HH:MM:SS (PID)>     > callbacks completed in * (glob)
  YYYY/MM/DD HH:MM:SS (PID)>   - loading extension: badext2
  YYYY/MM/DD HH:MM:SS (PID)>     - could not import hgext.badext2 (No module named *badext2*): trying hgext3rd.badext2 (glob)
  Traceback (most recent call last):
  ImportError: No module named badext2 (no-py3 !)
  ImportError: No module named 'hgext.badext2' (py3 no-py36 !)
  ModuleNotFoundError: No module named 'hgext.badext2' (py36 !)
  YYYY/MM/DD HH:MM:SS (PID)>     - could not import hgext3rd.badext2 (No module named *badext2*): trying badext2 (glob)
  Traceback (most recent call last):
  ImportError: No module named badext2 (no-py3 !)
  ImportError: No module named 'hgext.badext2' (py3 no-py36 !)
  ModuleNotFoundError: No module named 'hgext.badext2' (py36 !)
  Traceback (most recent call last): (py3 !)
  ImportError: No module named 'hgext3rd.badext2' (py3 no-py36 !)
  ModuleNotFoundError: No module named 'hgext3rd.badext2' (py36 !)
  *** failed to import extension badext2: No module named *badext2* (glob)
  Traceback (most recent call last):
  ImportError: No module named 'hgext.badext2' (py3 no-py36 !)
  ModuleNotFoundError: No module named 'hgext.badext2' (py36 !)
  Traceback (most recent call last): (py3 !)
  ImportError: No module named 'hgext3rd.badext2' (py3 no-py36 !)
  ModuleNotFoundError: No module named 'hgext3rd.badext2' (py36 !)
  Traceback (most recent call last): (py3 !)
  ModuleNotFoundError: No module named 'badext2' (py36 !)
  ImportError: No module named 'badext2' (py3 no-py36 !)
  ImportError: No module named badext2 (no-py3 !)
  YYYY/MM/DD HH:MM:SS (PID)> > loaded 2 extensions, total time * (glob)
  YYYY/MM/DD HH:MM:SS (PID)> - loading configtable attributes
  YYYY/MM/DD HH:MM:SS (PID)> - executing uisetup hooks
  YYYY/MM/DD HH:MM:SS (PID)>   - running uisetup for gpg
  YYYY/MM/DD HH:MM:SS (PID)>   > uisetup for gpg took * (glob)
  YYYY/MM/DD HH:MM:SS (PID)>   - running uisetup for baddocext
  YYYY/MM/DD HH:MM:SS (PID)>   > uisetup for baddocext took * (glob)
  YYYY/MM/DD HH:MM:SS (PID)> > all uisetup took * (glob)
  YYYY/MM/DD HH:MM:SS (PID)> - executing extsetup hooks
  YYYY/MM/DD HH:MM:SS (PID)>   - running extsetup for gpg
  YYYY/MM/DD HH:MM:SS (PID)>   > extsetup for gpg took * (glob)
  YYYY/MM/DD HH:MM:SS (PID)>   - running extsetup for baddocext
  YYYY/MM/DD HH:MM:SS (PID)>   > extsetup for baddocext took * (glob)
  YYYY/MM/DD HH:MM:SS (PID)> > all extsetup took * (glob)
  YYYY/MM/DD HH:MM:SS (PID)> - executing remaining aftercallbacks
  YYYY/MM/DD HH:MM:SS (PID)> > remaining aftercallbacks completed in * (glob)
  YYYY/MM/DD HH:MM:SS (PID)> - loading extension registration objects
  YYYY/MM/DD HH:MM:SS (PID)> > extension registration object loading took * (glob)
  YYYY/MM/DD HH:MM:SS (PID)> > extension baddocext take a total of * to load (glob)
  YYYY/MM/DD HH:MM:SS (PID)> > extension gpg take a total of * to load (glob)
  YYYY/MM/DD HH:MM:SS (PID)> extension loading complete
#endif

confirm that there's no crash when an extension's documentation is bad

  $ hg help --keyword baddocext
  *** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
  *** failed to import extension badext2: No module named *badext2* (glob)
  Topics:
  
   extensions Using Additional Features