Skip to content

Commit ae324d1

Browse files
authored
Merge pull request #11194 from pradyunsg/distutils-change-root
Replace usage of `distutils.utils.change_root` with copied-over logic
2 parents 6c2013c + c520ccf commit ae324d1

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

src/pip/_internal/locations/_sysconfig.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import distutils.util # FIXME: For change_root.
21
import logging
32
import os
43
import sys
@@ -9,7 +8,7 @@
98
from pip._internal.models.scheme import SCHEME_KEYS, Scheme
109
from pip._internal.utils.virtualenv import running_under_virtualenv
1110

12-
from .base import get_major_minor_version, is_osx_framework
11+
from .base import change_root, get_major_minor_version, is_osx_framework
1312

1413
logger = logging.getLogger(__name__)
1514

@@ -194,7 +193,7 @@ def get_scheme(
194193
)
195194
if root is not None:
196195
for key in SCHEME_KEYS:
197-
value = distutils.util.change_root(root, getattr(scheme, key))
196+
value = change_root(root, getattr(scheme, key))
198197
setattr(scheme, key, value)
199198
return scheme
200199

src/pip/_internal/locations/base.py

+29
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import sysconfig
66
import typing
77

8+
from pip._internal.exceptions import InstallationError
89
from pip._internal.utils import appdirs
910
from pip._internal.utils.virtualenv import running_under_virtualenv
1011

@@ -23,6 +24,34 @@ def get_major_minor_version() -> str:
2324
return "{}.{}".format(*sys.version_info)
2425

2526

27+
def change_root(new_root: str, pathname: str) -> str:
28+
"""Return 'pathname' with 'new_root' prepended.
29+
30+
If 'pathname' is relative, this is equivalent to os.path.join(new_root, pathname).
31+
Otherwise, it requires making 'pathname' relative and then joining the
32+
two, which is tricky on DOS/Windows and Mac OS.
33+
34+
This is borrowed from Python's standard library's distutils module.
35+
"""
36+
if os.name == "posix":
37+
if not os.path.isabs(pathname):
38+
return os.path.join(new_root, pathname)
39+
else:
40+
return os.path.join(new_root, pathname[1:])
41+
42+
elif os.name == "nt":
43+
(drive, path) = os.path.splitdrive(pathname)
44+
if path[0] == "\\":
45+
path = path[1:]
46+
return os.path.join(new_root, path)
47+
48+
else:
49+
raise InstallationError(
50+
f"Unknown platform: {os.name}\n"
51+
"Can not change root path prefix on unknown platform."
52+
)
53+
54+
2655
def get_src_prefix() -> str:
2756
if running_under_virtualenv():
2857
src_prefix = os.path.join(sys.prefix, "src")

src/pip/_internal/operations/install/legacy.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
import logging
55
import os
6-
from distutils.util import change_root
76
from typing import List, Optional, Sequence
87

98
from pip._internal.build_env import BuildEnvironment
109
from pip._internal.exceptions import InstallationError, LegacyInstallFailure
10+
from pip._internal.locations.base import change_root
1111
from pip._internal.models.scheme import Scheme
1212
from pip._internal.utils.misc import ensure_dir
1313
from pip._internal.utils.setuptools_build import make_setuptools_install_args

0 commit comments

Comments
 (0)