##// END OF EJS Templates
extensions: catch uisetup and extsetup failures and don't let them break hg...
Augie Fackler -
r32724:ea1c2eb7 default
parent child Browse files
Show More
@@ -167,17 +167,31 b' def load(ui, name, path):'
167 def _runuisetup(name, ui):
167 def _runuisetup(name, ui):
168 uisetup = getattr(_extensions[name], 'uisetup', None)
168 uisetup = getattr(_extensions[name], 'uisetup', None)
169 if uisetup:
169 if uisetup:
170 uisetup(ui)
170 try:
171 uisetup(ui)
172 except Exception as inst:
173 ui.traceback()
174 msg = _forbytes(inst)
175 ui.warn(_("*** failed to set up extension %s: %s\n") % (name, msg))
176 return False
177 return True
171
178
172 def _runextsetup(name, ui):
179 def _runextsetup(name, ui):
173 extsetup = getattr(_extensions[name], 'extsetup', None)
180 extsetup = getattr(_extensions[name], 'extsetup', None)
174 if extsetup:
181 if extsetup:
175 try:
182 try:
176 extsetup(ui)
183 try:
177 except TypeError:
184 extsetup(ui)
178 if inspect.getargspec(extsetup).args:
185 except TypeError:
179 raise
186 if inspect.getargspec(extsetup).args:
180 extsetup() # old extsetup with no ui argument
187 raise
188 extsetup() # old extsetup with no ui argument
189 except Exception as inst:
190 ui.traceback()
191 msg = _forbytes(inst)
192 ui.warn(_("*** failed to set up extension %s: %s\n") % (name, msg))
193 return False
194 return True
181
195
182 def loadall(ui, whitelist=None):
196 def loadall(ui, whitelist=None):
183 result = ui.configitems("extensions")
197 result = ui.configitems("extensions")
@@ -203,11 +217,19 b' def loadall(ui, whitelist=None):'
203 ui.warn(_("*** (%s)\n") % inst.hint)
217 ui.warn(_("*** (%s)\n") % inst.hint)
204 ui.traceback()
218 ui.traceback()
205
219
220 broken = set()
206 for name in _order[newindex:]:
221 for name in _order[newindex:]:
207 _runuisetup(name, ui)
222 if not _runuisetup(name, ui):
223 broken.add(name)
208
224
209 for name in _order[newindex:]:
225 for name in _order[newindex:]:
210 _runextsetup(name, ui)
226 if name in broken:
227 continue
228 if not _runextsetup(name, ui):
229 broken.add(name)
230
231 for name in broken:
232 _extensions[name] = None
211
233
212 # Call aftercallbacks that were never met.
234 # Call aftercallbacks that were never met.
213 for shortname in _aftercallbacks:
235 for shortname in _aftercallbacks:
@@ -1625,9 +1625,35 b" Make sure a broken uisetup doesn't globa"
1625 > baduisetup = $PWD/baduisetup.py
1625 > baduisetup = $PWD/baduisetup.py
1626 > EOF
1626 > EOF
1627
1627
1628 Broken: an extension that triggers the import of bdiff during uisetup
1628 Even though the extension fails during uisetup, hg is still basically usable:
1629 can't be easily debugged:
1630 $ hg version
1629 $ hg version
1631 abort: No module named bdiff!
1630 *** failed to set up extension baduisetup: No module named bdiff
1632 (did you forget to compile extensions?)
1631 Mercurial Distributed SCM (version *) (glob)
1633 [255]
1632 (see https://mercurial-scm.org for more information)
1633
1634 Copyright (C) 2005-2017 Matt Mackall and others
1635 This is free software; see the source for copying conditions. There is NO
1636 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1637
1638 $ hg version --traceback
1639 Traceback (most recent call last):
1640 File "*/mercurial/extensions.py", line *, in _runuisetup (glob)
1641 uisetup(ui)
1642 File "$TESTTMP/baduisetup.py", line 10, in uisetup
1643 extensions.wrapfunction(bdiff, 'blocks', blockswrapper)
1644 File "*/mercurial/extensions.py", line *, in wrapfunction (glob)
1645 origfn = getattr(container, funcname)
1646 File "*/hgdemandimport/demandimportpy2.py", line *, in __getattr__ (glob)
1647 self._load()
1648 File "*/hgdemandimport/demandimportpy2.py", line *, in _load (glob)
1649 mod = _hgextimport(_import, head, globals, locals, None, level)
1650 File "*/hgdemandimport/demandimportpy2.py", line *, in _hgextimport (glob)
1651 return importfunc(name, globals, *args, **kwargs)
1652 ImportError: No module named bdiff
1653 *** failed to set up extension baduisetup: No module named bdiff
1654 Mercurial Distributed SCM (version *) (glob)
1655 (see https://mercurial-scm.org for more information)
1656
1657 Copyright (C) 2005-2017 Matt Mackall and others
1658 This is free software; see the source for copying conditions. There is NO
1659 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -161,7 +161,8 b''
161 > EOF
161 > EOF
162 $ echo 'this should fail' > file
162 $ echo 'this should fail' > file
163 $ hg commit -Aqm 'add file'
163 $ hg commit -Aqm 'add file'
164 abort: cannot register multiple processors on flag '0x8'.
164 *** failed to set up extension duplicate: cannot register multiple processors on flag '0x8'.
165 abort: missing processor for flag '0x1'!
165 [255]
166 [255]
166
167
167 $ cd ..
168 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now