bpo-38883: Don't use POSIX `$HOME` in `pathlib.Path.home/expanduser` on Windows (GH-17961)

In bpo-36264 os.path.expanduser was changed to ignore HOME on Windows.

Path.expanduser/home still honored HOME despite being documented as behaving the same
as os.path.expanduser. This makes them also ignore HOME so that both implementations
behave the same way again.
(cherry picked from commit c45a2aa9e2)

Co-authored-by: Christoph Reiter <reiter.christoph@gmail.com>
This commit is contained in:
Miss Islington (bot) 2020-01-28 01:59:43 -08:00 committed by GitHub
parent 41f4dc3bcf
commit 595b516965
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 11 deletions

View File

@ -253,9 +253,7 @@ class _WindowsFlavour(_Flavour):
return 'file:' + urlquote_from_bytes(path.as_posix().encode('utf-8')) return 'file:' + urlquote_from_bytes(path.as_posix().encode('utf-8'))
def gethomedir(self, username): def gethomedir(self, username):
if 'HOME' in os.environ: if 'USERPROFILE' in os.environ:
userhome = os.environ['HOME']
elif 'USERPROFILE' in os.environ:
userhome = os.environ['USERPROFILE'] userhome = os.environ['USERPROFILE']
elif 'HOMEPATH' in os.environ: elif 'HOMEPATH' in os.environ:
try: try:

View File

@ -1296,8 +1296,16 @@ class _BasePathTest(object):
self.assertTrue(p.is_absolute()) self.assertTrue(p.is_absolute())
def test_home(self): def test_home(self):
p = self.cls.home() with support.EnvironmentVarGuard() as env:
self._test_home(p) self._test_home(self.cls.home())
env.clear()
env['USERPROFILE'] = os.path.join(BASE, 'userprofile')
self._test_home(self.cls.home())
# bpo-38883: ignore `HOME` when set on windows
env['HOME'] = os.path.join(BASE, 'home')
self._test_home(self.cls.home())
def test_samefile(self): def test_samefile(self):
fileA_path = os.path.join(BASE, 'fileA') fileA_path = os.path.join(BASE, 'fileA')
@ -2348,12 +2356,6 @@ class WindowsPathTest(_BasePathTest, unittest.TestCase):
self.assertEqual(p5.expanduser(), p5) self.assertEqual(p5.expanduser(), p5)
self.assertEqual(p6.expanduser(), p6) self.assertEqual(p6.expanduser(), p6)
# Test the first lookup key in the env vars.
env['HOME'] = 'C:\\Users\\alice'
check()
# Test that HOMEPATH is available instead.
env.pop('HOME', None)
env['HOMEPATH'] = 'C:\\Users\\alice' env['HOMEPATH'] = 'C:\\Users\\alice'
check() check()
@ -2366,6 +2368,10 @@ class WindowsPathTest(_BasePathTest, unittest.TestCase):
env['USERPROFILE'] = 'C:\\Users\\alice' env['USERPROFILE'] = 'C:\\Users\\alice'
check() check()
# bpo-38883: ignore `HOME` when set on windows
env['HOME'] = 'C:\\Users\\eve'
check()
class CompatiblePathTest(unittest.TestCase): class CompatiblePathTest(unittest.TestCase):
""" """

View File

@ -0,0 +1,5 @@
:meth:`~pathlib.Path.home()` and :meth:`~pathlib.Path.expanduser()` on Windows
now prefer :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, which is not
normally set for regular user accounts. This makes them again behave like
:func:`os.path.expanduser`, which was changed to ignore :envvar:`HOME` in 3.8,
see :issue:`36264`.