Skip to content

Commit d7fbc9f

Browse files
authored
Merge pull request #8282 from uranusjr/pre-existing-build-directory-reprod
Add reprod for pre-existing build dir failure
2 parents 1ebeab5 + a7b6430 commit d7fbc9f

File tree

1 file changed

+52
-6
lines changed

1 file changed

+52
-6
lines changed

tests/functional/test_new_resolver.py

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import sys
44

55
import pytest
6+
from pip._vendor.packaging.utils import canonicalize_name
67

78
from tests.lib import (
89
create_basic_sdist_for_package,
@@ -14,20 +15,25 @@
1415
def assert_installed(script, **kwargs):
1516
ret = script.pip('list', '--format=json')
1617
installed = set(
17-
(val['name'], val['version'])
18+
(canonicalize_name(val['name']), val['version'])
1819
for val in json.loads(ret.stdout)
1920
)
20-
assert set(kwargs.items()) <= installed, \
21-
"{!r} not all in {!r}".format(kwargs, installed)
21+
expected = set((canonicalize_name(k), v) for k, v in kwargs.items())
22+
assert expected <= installed, \
23+
"{!r} not all in {!r}".format(expected, installed)
2224

2325

2426
def assert_not_installed(script, *args):
2527
ret = script.pip("list", "--format=json")
26-
installed = set(val["name"] for val in json.loads(ret.stdout))
28+
installed = set(
29+
canonicalize_name(val["name"])
30+
for val in json.loads(ret.stdout)
31+
)
2732
# None of the given names should be listed as installed, i.e. their
2833
# intersection should be empty.
29-
assert not (set(args) & installed), \
30-
"{!r} contained in {!r}".format(args, installed)
34+
expected = set(canonicalize_name(k) for k in args)
35+
assert not (expected & installed), \
36+
"{!r} contained in {!r}".format(expected, installed)
3137

3238

3339
def assert_editable(script, *args):
@@ -855,3 +861,43 @@ def test_new_resolver_extra_merge_in_package(
855861
requirement + "[dev]",
856862
)
857863
assert_installed(script, pkg="1.0.0", dep="1.0.0", depdev="1.0.0")
864+
865+
866+
@pytest.mark.xfail(reason="pre-existing build directory")
867+
def test_new_resolver_build_directory_error_zazo_19(script):
868+
"""https://github.com/pradyunsg/zazo/issues/19#issuecomment-631615674
869+
870+
This will first resolve like this:
871+
872+
1. Pin pkg-b==2.0.0 (since pkg-b has fewer choices)
873+
2. Pin pkg-a==3.0.0 -> Conflict due to dependency pkg-b<2
874+
3. Pin pkg-b==1.0.0
875+
876+
Since pkg-b is only available as sdist, both the first and third steps
877+
would trigger building from source. This ensures the preparer can build
878+
different versions of a package for the resolver.
879+
880+
The preparer would fail with the following message if the different
881+
versions end up using the same build directory::
882+
883+
ERROR: pip can't proceed with requirements 'pkg-b ...' due to a
884+
pre-existing build directory (...). This is likely due to a previous
885+
installation that failed. pip is being responsible and not assuming it
886+
can delete this. Please delete it and try again.
887+
"""
888+
create_basic_wheel_for_package(
889+
script, "pkg_a", "3.0.0", depends=["pkg-b<2"],
890+
)
891+
create_basic_wheel_for_package(script, "pkg_a", "2.0.0")
892+
create_basic_wheel_for_package(script, "pkg_a", "1.0.0")
893+
894+
create_basic_sdist_for_package(script, "pkg_b", "2.0.0")
895+
create_basic_sdist_for_package(script, "pkg_b", "1.0.0")
896+
897+
script.pip(
898+
"install", "--unstable-feature=resolver",
899+
"--no-cache-dir", "--no-index",
900+
"--find-links", script.scratch_path,
901+
"pkg-a", "pkg-b",
902+
)
903+
assert_installed(script, pkg_a="3.0.0", pkg_b="1.0.0")

0 commit comments

Comments
 (0)