Mercurial > hg
changeset 44571:6a8738dc4a01
hg: make _local() behave consistently on Python 3.8 (issue6287)
Python 3.8 makes os.path.isfile quietly eat "path invalid" errors and
return False instead of allowing the exception to propagate. Given
that this is a change from 2018 (sigh) and it's mentioned in the
release notes (double sigh) we're definitely too late to complain to
Python about the behavior change, so open-code part of
os.path.isfile() in this method so we can catch invalid-path errors
and handle them appropriately. I confirmed that posixpath and ntpath
both delegate to genericpath, which uses os.stat() under the covers.
Differential Revision: https://phab.mercurial-scm.org/D8302
author | Augie Fackler <augie@google.com> |
---|---|
date | Wed, 18 Mar 2020 15:08:14 -0400 |
parents | 9e63108123a4 |
children | 245aec57d76a |
files | mercurial/hg.py |
diffstat | 1 files changed, 8 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/hg.py Tue Mar 17 17:26:05 2020 -0400 +++ b/mercurial/hg.py Wed Mar 18 15:08:14 2020 -0400 @@ -60,12 +60,19 @@ path = util.expandpath(util.urllocalpath(path)) try: - isfile = os.path.isfile(path) + # we use os.stat() directly here instead of os.path.isfile() + # because the latter started returning `False` on invalid path + # exceptions starting in 3.8 and we care about handling + # invalid paths specially here. + st = os.stat(path) + isfile = stat.S_ISREG(st.st_mode) # Python 2 raises TypeError, Python 3 ValueError. except (TypeError, ValueError) as e: raise error.Abort( _(b'invalid path %s: %s') % (path, pycompat.bytestr(e)) ) + except OSError: + isfile = False return isfile and bundlerepo or localrepo