diff --git a/mercurial/extensions.py b/mercurial/extensions.py index 01c1ee4bd1dd1eb60307575b4c603fe9511ce50c_bWVyY3VyaWFsL2V4dGVuc2lvbnMucHk=..1b2b727a885f0fc71f36afe6a0b15e8c6bd823f3_bWVyY3VyaWFsL2V4dGVuc2lvbnMucHk= 100644 --- a/mercurial/extensions.py +++ b/mercurial/extensions.py @@ -42,7 +42,12 @@ fd, fpath, desc = imp.find_module(f, [d]) return imp.load_module(module_name, fd, fpath, desc) else: - return imp.load_source(module_name, path) + try: + return imp.load_source(module_name, path) + except IOError, exc: + if not exc.filename: + exc.filename = path # python does not fill this + raise def load(ui, name, path): # unused ui argument kept for backwards compatibility diff --git a/mercurial/hook.py b/mercurial/hook.py index 01c1ee4bd1dd1eb60307575b4c603fe9511ce50c_bWVyY3VyaWFsL2hvb2sucHk=..1b2b727a885f0fc71f36afe6a0b15e8c6bd823f3_bWVyY3VyaWFsL2hvb2sucHk= 100644 --- a/mercurial/hook.py +++ b/mercurial/hook.py @@ -169,7 +169,11 @@ path = util.expandpath(path) if repo: path = os.path.join(repo.root, path) - mod = extensions.loadpath(path, 'hghook.%s' % hname) + try: + mod = extensions.loadpath(path, 'hghook.%s' % hname) + except Exception: + ui.write(_("loading %s hook failed:\n") % hname) + raise hookfn = getattr(mod, cmd) else: hookfn = cmd[7:].strip() diff --git a/tests/test-hook.t b/tests/test-hook.t index 01c1ee4bd1dd1eb60307575b4c603fe9511ce50c_dGVzdHMvdGVzdC1ob29rLnQ=..1b2b727a885f0fc71f36afe6a0b15e8c6bd823f3_dGVzdHMvdGVzdC1ob29rLnQ= 100644 --- a/tests/test-hook.t +++ b/tests/test-hook.t @@ -530,6 +530,20 @@ nothing changed [1] + $ echo '[hooks]' > .hg/hgrc + $ echo "update.ne = python:`pwd`/nonexisting.py:testhook" >> .hg/hgrc + $ echo "pre-identify.npmd = python:`pwd`/:no_python_module_dir" >> .hg/hgrc + + $ hg up null + loading update.ne hook failed: + abort: No such file or directory: $TESTTMP/d/repo/nonexisting.py + [255] + + $ hg id + loading pre-identify.npmd hook failed: + abort: No module named repo! + [255] + $ cd ../../b make sure --traceback works on hook import failure