fix: support space in constraints file path (#738)

* tests: add space in constraints file

* fix: use uri strings in PIP_CONSTRAINTS

* WIP: try using quotes instead of uri

* Update cibuildwheel/windows.py

* Revert "Update cibuildwheel/windows.py"

This reverts commit 0951425524166677fdfd8df7e6bbbc9782ea2fb0.

* Revert "WIP: try using quotes instead of uri"

This reverts commit 5790eda4c6f231d5958f4cbd720683f787eea042.

* fix: work around pip bug with URI handling

* WIP: try biger hack

* fix: try using temporary file

* refactor: use common prefix for install dir on Windows

* Use more flexible type PathOrStr to simplify

* Rename variables to make slightly clearer

Co-authored-by: Joe Rickerby <joerick@mac.com>
This commit is contained in:
Henry Schreiner
2021-07-09 09:16:20 -04:00
committed by GitHub
co-authored by Joe Rickerby
parent 30954282fd
commit 4307b52ff2
3 changed files with 43 additions and 27 deletions
+2 -3
View File
@@ -416,9 +416,8 @@ def build(options: BuildOptions) -> None:
config_setting = " ".join(verbosity_flags)
build_env = env.copy()
if options.dependency_constraints:
build_env["PIP_CONSTRAINT"] = str(
options.dependency_constraints.get_for_python_version(config.version)
)
constr = options.dependency_constraints.get_for_python_version(config.version)
build_env["PIP_CONSTRAINT"] = constr.as_uri()
build_env["VIRTUALENV_PIP"] = get_pip_version(env)
call(
[
+40 -23
View File
@@ -23,9 +23,11 @@ from .util import (
read_python_configs,
)
CIBW_INSTALL_PATH = Path("C:\\cibw")
def call(
args: Sequence[PathOrStr], env: Optional[Dict[str, str]] = None, cwd: Optional[str] = None
args: Sequence[PathOrStr], env: Optional[Dict[str, str]] = None, cwd: Optional[PathOrStr] = None
) -> None:
print("+ " + " ".join(str(a) for a in args))
# we use shell=True here, even though we don't need a shell due to a bug
@@ -33,7 +35,9 @@ def call(
subprocess.run([str(a) for a in args], env=env, cwd=cwd, shell=True, check=True)
def shell(command: str, env: Optional[Dict[str, str]] = None, cwd: Optional[str] = None) -> None:
def shell(
command: str, env: Optional[Dict[str, str]] = None, cwd: Optional[PathOrStr] = None
) -> None:
print(f"+ {command}")
subprocess.run(command, env=env, cwd=cwd, shell=True, check=True)
@@ -49,7 +53,7 @@ def get_nuget_args(version: str, arch: str) -> List[str]:
"-FallbackSource",
"https://api.nuget.org/v3/index.json",
"-OutputDirectory",
"C:\\cibw\\python",
str(CIBW_INSTALL_PATH / "python"),
]
@@ -102,9 +106,9 @@ def install_pypy(version: str, arch: str, url: str) -> Path:
zip_filename = url.rsplit("/", 1)[-1]
extension = ".zip"
assert zip_filename.endswith(extension)
installation_path = Path("C:\\cibw") / zip_filename[: -len(extension)]
installation_path = CIBW_INSTALL_PATH / zip_filename[: -len(extension)]
if not installation_path.exists():
pypy_zip = Path("C:\\cibw") / zip_filename
pypy_zip = CIBW_INSTALL_PATH / zip_filename
download(url, pypy_zip)
# Extract to the parent directory because the zip file still contains a directory
extract_zip(pypy_zip, installation_path.parent)
@@ -119,7 +123,7 @@ def setup_python(
build_frontend: BuildFrontend,
) -> Dict[str, str]:
nuget = Path("C:\\cibw\\nuget.exe")
nuget = CIBW_INSTALL_PATH / "nuget.exe"
if not nuget.exists():
log.step("Downloading nuget...")
download("https://dist.nuget.org/win-x86-commandline/latest/nuget.exe", nuget)
@@ -184,7 +188,7 @@ def setup_python(
requires_reinstall = not (installation_path / "Scripts" / "pip.exe").exists()
if requires_reinstall:
# maybe pip isn't installed at all. ensurepip resolves that.
call(["python", "-m", "ensurepip"], env=env, cwd="C:\\cibw")
call(["python", "-m", "ensurepip"], env=env, cwd=CIBW_INSTALL_PATH)
# upgrade pip to the version matching our constraints
# if necessary, reinstall it to ensure that it's available on PATH as 'pip.exe'
@@ -199,7 +203,7 @@ def setup_python(
*dependency_constraint_flags,
],
env=env,
cwd="C:\\cibw",
cwd=CIBW_INSTALL_PATH,
)
assert (installation_path / "Scripts" / "pip.exe").exists()
@@ -313,22 +317,35 @@ def build(options: BuildOptions) -> None:
config_setting = " ".join(verbosity_flags)
build_env = env.copy()
if options.dependency_constraints:
build_env["PIP_CONSTRAINT"] = str(
options.dependency_constraints.get_for_python_version(config.version)
constraints_path = options.dependency_constraints.get_for_python_version(
config.version
)
# Bug in pip <= 21.1.3 - we can't have a space in the
# constraints file, and pip doesn't support drive letters
# in uhi. After probably pip 21.2, we can use uri. For
# now, use a temporary file.
if " " in str(constraints_path):
tmp_file = tempfile.NamedTemporaryFile(
"w", suffix="constraints.txt", delete=False, dir=CIBW_INSTALL_PATH
)
with tmp_file as new_constraints_file, open(constraints_path) as f:
new_constraints_file.write(f.read())
constraints_path = Path(new_constraints_file.name)
build_env["PIP_CONSTRAINT"] = str(constraints_path)
build_env["VIRTUALENV_PIP"] = get_pip_version(env)
call(
[
"python",
"-m",
"build",
options.package_dir,
"--wheel",
f"--outdir={built_wheel_dir}",
f"--config-setting={config_setting}",
],
env=build_env,
)
build_env["VIRTUALENV_PIP"] = get_pip_version(env)
call(
[
"python",
"-m",
"build",
options.package_dir,
"--wheel",
f"--outdir={built_wheel_dir}",
f"--config-setting={config_setting}",
],
env=build_env,
)
else:
assert_never(options.build_frontend)
+1 -1
View File
@@ -122,7 +122,7 @@ def test_dependency_constraints_file(tmp_path, build_frontend_env):
"virtualenv": "20.0.35",
}
constraints_file = tmp_path / "constraints.txt"
constraints_file = tmp_path / "constraints file.txt"
constraints_file.write_text(
textwrap.dedent(
"""