diff --git a/crates/pixi_core/src/lock_file/satisfiability/mod.rs b/crates/pixi_core/src/lock_file/satisfiability/mod.rs index d7ea42f319..82be451cf0 100644 --- a/crates/pixi_core/src/lock_file/satisfiability/mod.rs +++ b/crates/pixi_core/src/lock_file/satisfiability/mod.rs @@ -1005,6 +1005,24 @@ pub(crate) async fn verify_package_platform_satisfiability( return Err(Box::new(PlatformUnsat::TooManyCondaPackages(Vec::new()))); } + // retrieve dependency-overrides + // map it to (name => requirement) for later matching + let dependency_overrides = environment + .pypi_options() + .dependency_overrides + .unwrap_or_default() + .into_iter() + .map(|(name, req)| -> Result<_, Box> { + let uv_req = as_uv_req(&req, name.as_source(), project_root).map_err(|e| { + Box::new(PlatformUnsat::AsPep508Error( + name.as_normalized().clone(), + e, + )) + })?; + Ok((uv_req.name.clone(), uv_req)) + }) + .collect::, _>>()?; + // Transform from PyPiPackage name into UV Requirement type let pypi_requirements = environment .pypi_dependencies(Some(platform)) @@ -1217,6 +1235,13 @@ pub(crate) async fn verify_package_platform_satisfiability( { Ok(Some(idx)) => { let record = &locked_pypi_environment.records[idx]; + + // use the overridden requirements if specified + let requirement = dependency_overrides + .get(&requirement.name) + .cloned() + .unwrap_or(requirement); + if requirement.is_editable() { if let Err(err) = pypi_satifisfies_editable(&requirement, &record.0, project_root) diff --git a/tests/data/satisfiability/dependency_overides/pixi.lock b/tests/data/satisfiability/dependency_overides/pixi.lock new file mode 100644 index 0000000000..aec58b4d39 --- /dev/null +++ b/tests/data/satisfiability/dependency_overides/pixi.lock @@ -0,0 +1,150 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.0-h47c9636_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/86/9d/60f92bff1bbc8f3912e001b4116bb4810c74d3c9a8a4e5226eec094035a1/dummy_test-0.1.2.tar.gz + - pypi: ./projects/foo +packages: +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + sha256: bfa84296a638bea78a8bb29abc493ee95f2a0218775642474a840411b950fe5f + md5: 1bbc659ca658bfd49a481b5ef7a0f40f + license: bzip2-1.0.6 + license_family: BSD + size: 122325 + timestamp: 1699280294368 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + sha256: 49bc3439816ac72d0c0e0f144b8cc870fdcc4adec2e861407ec818d8116b2204 + md5: fb416a1795f18dcc5a038bc2dc54edf9 + license: ISC + size: 155725 + timestamp: 1706844034242 +- pypi: https://files.pythonhosted.org/packages/86/9d/60f92bff1bbc8f3912e001b4116bb4810c74d3c9a8a4e5226eec094035a1/dummy_test-0.1.2.tar.gz + name: dummy-test + version: 0.1.2 + sha256: 8903d884f5be70521e4da650ced8b5f5d4d542e41e92310e822b4a810a786a98 +- pypi: ./projects/foo + name: foo + version: 0.1.0 + sha256: fc902a9e46771169f2ce5d04b55d766bac66e1a951d287649225768dfa5df455 + requires_dist: + - dummy-test==0.1.3 + requires_python: '>=3.11' + editable: true +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + sha256: ba7173ac30064ea901a4c9fb5a51846dcc25512ceb565759be7d18cbf3e5415e + md5: e3cde7cfa87f82f7cb13d482d5e0ad09 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + size: 63655 + timestamp: 1710362424980 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + sha256: 4337f466eb55bbdc74e168b52ec8c38f598e3664244ec7a2536009036e2066cc + md5: c8c1186c7f3351f6ffddb97b1f54fc58 + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: Unlicense + size: 824794 + timestamp: 1713367748819 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + sha256: ab1c8aefa2d54322a63aaeeefe9cf877411851738616c4068e0dccc66b9c758a + md5: 1a47f5236db2e06a320ffa0392f81bd8 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 48102 + timestamp: 1686575426584 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda + sha256: 06f0905791575e2cd3aa961493c56e490b3d82ad9eb49f1c332bd338b0216911 + md5: 616ae8691e6608527d0071e6766dcb81 + license: X11 AND BSD-3-Clause + size: 820249 + timestamp: 1710866874348 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda + sha256: 519dc941d7ab0ebf31a2878d85c2f444450e7c5f6f41c4d07252c6bb3417b78b + md5: eb580fb888d93d5d550c557323ac5cee + depends: + - ca-certificates + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 2855250 + timestamp: 1710793435903 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.0-h47c9636_0_cpython.conda + sha256: eb66f8f249caa9d5a956c3a407f079e4779d652ebfc2a4b4f50dcea078e84fa8 + md5: ed8ae98b1b510de68392971b9367d18c + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.5.0,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.43.0,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ncurses >=6.4,<7.0a0 + - openssl >=3.1.3,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 13306758 + timestamp: 1696322682581 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 250351 + timestamp: 1679532511311 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + size: 119815 + timestamp: 1706886945727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec + md5: 39c6b54e94014701dd157f4f576ed211 + license: LGPL-2.1 and GPL-2.0 + size: 235693 + timestamp: 1660346961024 diff --git a/tests/data/satisfiability/dependency_overides/pixi.toml b/tests/data/satisfiability/dependency_overides/pixi.toml new file mode 100644 index 0000000000..714d9b6068 --- /dev/null +++ b/tests/data/satisfiability/dependency_overides/pixi.toml @@ -0,0 +1,14 @@ +[project] +channels = ["conda-forge"] +name = "absolute-paths" +platforms = ["osx-arm64"] +version = "0.1.0" + +[dependencies] +python = "3.12" + +[pypi-dependencies] +foo = { path = "./projects/foo", editable = true } + +[pypi-options.dependency-overrides] +dummy_test = "==0.1.2" diff --git a/tests/data/satisfiability/dependency_overides/projects/foo/pyproject.toml b/tests/data/satisfiability/dependency_overides/projects/foo/pyproject.toml new file mode 100644 index 0000000000..28e342abb4 --- /dev/null +++ b/tests/data/satisfiability/dependency_overides/projects/foo/pyproject.toml @@ -0,0 +1,15 @@ +[project] +authors = [{ name = "Tim de Jager", email = "tim@prefix.dev" }] +dependencies = ["dummy_test==0.1.3"] +description = "Add a short description here" +name = "foo" +requires-python = ">= 3.11" +version = "0.1.0" + +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling"] + +[tool.pixi.project] +channels = ["conda-forge"] +platforms = ["osx-arm64"]