# HG changeset patch # User Gregory Szorc # Date 2019-01-31 01:22:07 # Node ID 2fe2f1ba596d9e3b4b691c99908e1e2c72a59157 # Parent d4df6897e4614ca1e97e30ccb8562279396ce488 hg: raise Abort on invalid path Currently, some os.path functions when opening repositories may raise an uncaught TypeError or ValueError if the path is invalid. Let's catch these exceptions and turn them into an Abort for convenience. Differential Revision: https://phab.mercurial-scm.org/D5772 diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -38,6 +38,7 @@ from . import ( narrowspec, node, phases, + pycompat, repository as repositorymod, scmutil, sshpeer, @@ -57,7 +58,15 @@ sharedbookmarks = 'bookmarks' def _local(path): path = util.expandpath(util.urllocalpath(path)) - return (os.path.isfile(path) and bundlerepo or localrepo) + + try: + isfile = os.path.isfile(path) + # Python 2 raises TypeError, Python 3 ValueError. + except (TypeError, ValueError) as e: + raise error.Abort(_('invalid path %s: %s') % ( + path, pycompat.bytestr(e))) + + return isfile and bundlerepo or localrepo def addbranchrevs(lrepo, other, branches, revs): peer = other.peer() # a courtesy to callers using a localrepo for other diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -2051,7 +2051,11 @@ class path(object): This is its own function so that extensions can change the definition of 'valid' in this case (like when pulling from a git repo into a hg one).""" - return os.path.isdir(os.path.join(path, '.hg')) + try: + return os.path.isdir(os.path.join(path, '.hg')) + # Python 2 may return TypeError. Python 3, ValueError. + except (TypeError, ValueError): + return False @property def suboptions(self): diff --git a/tests/test-remotefilelog-gc.t b/tests/test-remotefilelog-gc.t --- a/tests/test-remotefilelog-gc.t +++ b/tests/test-remotefilelog-gc.t @@ -107,6 +107,6 @@ # Test that warning is displayed when the repo path is malformed $ printf "asdas\0das" >> $CACHEDIR/repos - $ hg gc 2>&1 | head -n2 - warning: malformed path: * (glob) - Traceback (most recent call last): + $ hg gc + abort: invalid path asdas\x00da: stat() argument 1 must be encoded string without null bytes, not str (esc) + [255]