hg: explicitly check that peer lookup object has instance() if call failed

If a "thing" is callable but raises TypeError for some reason, a callable
object would be returned. Thereafter, unfriendly traceback would be displayed:

  Traceback (most recent call last):
    ...
    File "mercurial/hg.pyc", line 119, in _peerorrepo
      obj = _peerlookup(path).instance(ui, path, create)
  AttributeError: 'function' object has no attribute 'instance'

Instead, we should show the reason why "thing(path)" didn't work:

  Traceback (most recent call last):
    ...
    File "hggit/__init__.py", line 89, in _local
      p = urlcls(path).localpath()
  TypeError: 'NoneType' object is not callable

If a "thing" is not callable, it must be a module or an object that implements
instance(). If that module didn't have instance(), the error message would be
"<unloaded module 'foo'> object is not callable". It doesn't make perfect sense,
but it isn't so bad as it can blame which module went wrong.
This commit is contained in:
Yuya Nishihara 2015-05-30 12:46:30 +09:00
parent 8c4e6f9099
commit 1e094de1ee

View File

@ -92,6 +92,10 @@ def _peerlookup(path):
try:
return thing(path)
except TypeError:
# we can't test callable(thing) because 'thing' can be an unloaded
# module that implements __call__
if not util.safehasattr(thing, 'instance'):
raise
return thing
def islocal(repo):