hg: raise Abort on invalid path
authorGregory Szorc <gregory.szorc@gmail.com>
Wed, 30 Jan 2019 17:22:07 -0800
changeset 41484 7f366dd3df1f
parent 41483 46ab0c6b28dc
child 41485 8f6f5dcd46ce
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
mercurial/hg.py
mercurial/ui.py
tests/test-remotefilelog-gc.t
--- a/mercurial/hg.py	Wed Jan 30 19:29:32 2019 -0500
+++ b/mercurial/hg.py	Wed Jan 30 17:22:07 2019 -0800
@@ -38,6 +38,7 @@
     narrowspec,
     node,
     phases,
+    pycompat,
     repository as repositorymod,
     scmutil,
     sshpeer,
@@ -57,7 +58,15 @@
 
 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
--- a/mercurial/ui.py	Wed Jan 30 19:29:32 2019 -0500
+++ b/mercurial/ui.py	Wed Jan 30 17:22:07 2019 -0800
@@ -2051,7 +2051,11 @@
         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):
--- a/tests/test-remotefilelog-gc.t	Wed Jan 30 19:29:32 2019 -0500
+++ b/tests/test-remotefilelog-gc.t	Wed Jan 30 17:22:07 2019 -0800
@@ -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]