# HG changeset patch # User Yuya Nishihara # Date 1432957590 -32400 # Node ID 4cc3fb23881d9abc7745501ef0d777e5976ddb52 # Parent de23a552fc23e241b4c510200bc913012c123708 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 " object is not callable". It doesn't make perfect sense, but it isn't so bad as it can blame which module went wrong. diff -r de23a552fc23 -r 4cc3fb23881d mercurial/hg.py --- a/mercurial/hg.py Mon Mar 30 16:23:35 2015 +0900 +++ b/mercurial/hg.py Sat May 30 12:46:30 2015 +0900 @@ -92,6 +92,10 @@ 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):