Skip to content

fix: don't misclassify missing python as pypi-only during upgrade#6095

Merged
ruben-arts merged 2 commits into
prefix-dev:mainfrom
baszalmstra:claude/investigate-issue-6093-xplON
May 18, 2026
Merged

fix: don't misclassify missing python as pypi-only during upgrade#6095
ruben-arts merged 2 commits into
prefix-dev:mainfrom
baszalmstra:claude/investigate-issue-6093-xplON

Conversation

@baszalmstra

Copy link
Copy Markdown
Contributor

Description

pixi upgrade on a workspace with a local editable PyPI dep (e.g. pkg = { path = ".", editable = true }) failed on the second run with No Python interpreter found in the dependencies.

Root cause: update_dependencies unlocks python from the conda lock before re-solving. Satisfiability then calls read_local_package_metadata for the path source, which looks up python in locked_pixi_records first and on miss returned FailedToReadLocalMetadata. FailedToReadLocalMetadata marked the satisfiability as "is_pypi_only" variant. Because the conda dep walk runs after the pypi metadata read inside the try_join! in verify_package_platform_satisfiability, that pypi-only error short-circuited the join, the env was marked only outdated_pypi, conda was never re-solved, and the subsequent pypi resolve aborted on the missing python record.

Fix: return the existing non-pypi-only PlatformUnsat::MissingPythonInterpreter in that branch, and stop re-wrapping read_local_package_metadata errors at the call site (the wrap was discarding variant info). The conda walk now correctly schedules a re-solve, python lands back in the records, and the pypi resolve proceeds normally.

Fixes #6093

How Has This Been Tested?

cargo check -p pixi_core passes.

Manual repro from the issue:

[workspace]
channels = ["conda-forge"]
name = "hello_world"
platforms = ["linux-64"]

[dependencies]
python = ">=3.14.4,<3.15"

[pypi-dependencies]
hello_world = { path = ".", editable = true }

Run pixi upgrade twice, before this change, the second run errors, after it succeeds.

AI Disclosure

  • This PR contains AI-generated content.
    • I have tested any AI-generated content in my PR.
    • I take responsibility for any AI-generated content in my PR.

Tools: Claude (Opus 4.7)

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added sufficient tests to cover my changes.

When `pixi upgrade` rewrites a workspace that has a local editable
PyPI dependency (e.g. `pkg = { path = ".", editable = true }`), it
unlocks `python` from the conda lock before re-solving. Satisfiability
then calls `read_local_package_metadata` for the path source, which
looked up the python interpreter in `locked_pixi_records` first and,
on miss, returned `FailedToReadLocalMetadata` -- a `is_pypi_only`
variant. Because the conda dep walk runs *after* the pypi metadata
read inside `try_join!`, that pypi-only error short-circuited the
join, the env was marked only `outdated_pypi`, conda was never
re-solved, and the subsequent pypi resolve aborted with the confusing
"No Python interpreter found in the dependencies".

Return the existing non-pypi-only `MissingPythonInterpreter` variant
in that branch and stop re-wrapping `read_local_package_metadata`
errors at the call site (which was discarding variant info). The
conda walk now correctly schedules a re-solve, python lands back in
the records, and the pypi resolve proceeds normally.

Fixes prefix-dev#6093.

https://claude.ai/code/session_01SDUHtuTGjorKWr7cGWxBTY
@baszalmstra baszalmstra requested a review from ruben-arts May 12, 2026 14:31

@ruben-arts ruben-arts left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you

@ruben-arts ruben-arts enabled auto-merge (squash) May 18, 2026 08:19
@ruben-arts ruben-arts disabled auto-merge May 18, 2026 08:19
@ruben-arts ruben-arts enabled auto-merge (squash) May 18, 2026 08:19
@ruben-arts ruben-arts merged commit c49695e into prefix-dev:main May 18, 2026
37 checks passed
TenzinPlatter added a commit to greenroom-robotics/pixi that referenced this pull request Jun 26, 2026
* fix: don't misclassify missing python as pypi-only during upgrade (prefix-dev#6095)

* chore(docs): Update the pixi publish docs (prefix-dev#6129)

* fix: drop bare self-references in expand_self_extras (prefix-dev#6142)

* chore(ci): Update Pixi (prefix-dev#6149)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update GitHub Actions (prefix-dev#6148)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix: use gnu target for riscv64 in install.sh (prefix-dev#6143)

* feat(publish): honor workspace.s3-options when uploading to s3 (prefix-dev#6069)

* feat: add oauth default login (prefix-dev#6140)

* fix: propagate run-exports from host/build  (prefix-dev#6151)

* chore(deps): bump uv to 0.11.15 (prefix-dev#6132)

* perf: install build and host environments concurrently (prefix-dev#6152)

* feat(publish): add `--variant` and `--variant-config` flags (prefix-dev#6109)

* chore(deps): bump rattler crates (prefix-dev#6153)

* docs: Fix typo (prefix-dev#6157)

* feat: add `--package-format` to `pixi publish` for tar.bz2 output (prefix-dev#6156)

* fix: hook up repodata fetch reporter to gateway queries (prefix-dev#6112)

* fix: invalidate build-backend metadata cache when backend spec changes (prefix-dev#6111)

* chore(deps): bump rattler-build crates to latest main (prefix-dev#6163)

Co-authored-by: Claude <noreply@anthropic.com>

* fix: normalize extras order in lockfile metadata comparison (prefix-dev#6165)

* fix: trust path-based pypi overrides for transitive registry specs (prefix-dev#6169)

* fix: build backends nightly build - pass through more vars to fix sccache (prefix-dev#6168)

* fix: build backends build by disabling env isolation (prefix-dev#6170)

* chore: version to 0.69.0 (prefix-dev#6164)

* fix: conda package build for windows and osx (prefix-dev#6171)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: bump backend versions (prefix-dev#6173)

* docs: Update `github_actions` docs for `setup-pixi` version 0.9.6 (prefix-dev#6174)

Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>

* feat: implement v3 repodata/matchspec support in pixi spec (prefix-dev#6015)

* fix: bump mimalloc to 0.1.51 to fix win-arm64 process-exit crash (prefix-dev#6176)

Co-authored-by: Claude <noreply@anthropic.com>

* feat: support `[workspace.dependencies]` (prefix-dev#6162)

* fix(pypi-mapping): fetch parselmouth compressed mapping from conda-mapping.prefix.dev (prefix-dev#6172)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: clamp .pixi/ mtimes to SOURCE_DATE_EPOCH for reproducibility (prefix-dev#6056)

* chore(ci): Update azure/trusted-signing-action action to v2 (prefix-dev#6200)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update Rust crate shlex to v2 (prefix-dev#6201)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update GitHub Actions (prefix-dev#6195)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update Pixi (prefix-dev#6196)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(reinstall): wire up progress reporter and batch environments (prefix-dev#6205)

Co-authored-by: Lucas Colley <lucas.colley8@gmail.com>

* fix: forward termination signal (prefix-dev#6204)

* fix(global): clear conda stack env for prefix-ignore trampolines (prefix-dev#6210)

Co-authored-by: jinhyuk9714 <jinhyuk9714@gmail.com>
Co-authored-by: GitHub Actions <actions@github.com>

* chore(ci): Update taiki-e/install-action action to v2.79.2 (prefix-dev#6209)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* docs: clarify per-environment activation variables (prefix-dev#6214)

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com>

* fix: git url normalization (prefix-dev#6203)

* feat: adopt deno_task_shell native multiline support (prefix-dev#6211)

* fix: installer, use per user scope instead of system (prefix-dev#5568)

* fix: disable gpg signing in git fixture repos (prefix-dev#6216)

Co-authored-by: Claude <noreply@anthropic.com>

* fix(pixi-build-r): resolve license file to absolute path (prefix-dev#6215)

* chore: use lzma-rust2 instead of xz2 (prefix-dev#5087)

* feat: add skip_pyc_compilation configuration option (prefix-dev#5737)

* chore: use "lock file" consistently (prefix-dev#6208)

* feat(pixi-build): plumb workspace scratch directory and cache ROS distro fetches (prefix-dev#6181)

* docs(cli): mention `pixi self-update` in `requires-pixi` help msg (prefix-dev#6207)

* feat: git lfs support in `pixi-git` (prefix-dev#6183)

* feat: parallel global update (prefix-dev#5970)

* feat(pixi-build-ros): discover sibling ROS packages + marker-driven workspace globbing (prefix-dev#6182)

* docs: Update link to Code of Conduct in CONTRIBUTING.md (prefix-dev#6224)

* fix: tests on main did not update assertion for `.git` suffix (prefix-dev#6227)

* perf: compute engine and dispatcher speedups + backend-metadata cache fix (prefix-dev#6180)

* chore: use rust backend for building ros backend (prefix-dev#6228)

* fix: reject build backends defined as source dependencies (prefix-dev#6230)

* fix: reinstall when registry install collides with non-registry lock entry (prefix-dev#6213)

Co-authored-by: Claude <noreply@anthropic.com>

* fix: clear error on remove with suggestions for missing dependency (prefix-dev#6218)

Co-authored-by: Claude <noreply@anthropic.com>

* fix: seed pypi-options from global config in `--import` and existing pyproject paths (prefix-dev#6212)

Co-authored-by: Claude <noreply@anthropic.com>

* fix: keep OS trust store for native-tls System mode (prefix-dev#6235)

Co-authored-by: Claude <noreply@anthropic.com>

* feat: support --no-config / --config-file (prefix-dev#6222)

* fix: upgrade dependency-group dependencies (prefix-dev#6241)

* chore: reuse build cache by passing `--workspace` (prefix-dev#6242)

* feat: extend pixi publish to support cloudsmith as a target (prefix-dev#6219)

* chore: version to 0.70.0 (prefix-dev#6244)

* chore(ci): Update cargo patches (prefix-dev#6247)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update Pixi (prefix-dev#6248)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update GitHub Actions (prefix-dev#6250)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat: add --index option to specify PyPI index URL (prefix-dev#5575)

* chore: bump backend versions (prefix-dev#6254)

* fix: scope PyPI source-build cache by conda environment (prefix-dev#6240)

This change scopes the source-build cache to the conda environment, so a wheel built against one set of conda dependencies is no longer reused in an environment that resolves different ones

* fix: limit concurrent global update (prefix-dev#6253)

* fix: global share command dispatcher (prefix-dev#6255)

* docs: link to parselmouth mapping browser in conda/PyPI page (prefix-dev#6256)

* fix(pixi-build-python): reinstall to avoid duplicate dist-info (prefix-dev#6257)

Co-authored-by: Claude <noreply@anthropic.com>

* feat: implement extras and flags support for pixi and pixi-build (prefix-dev#5998)

Co-authored-by: Bas Zalmstra <4995967+baszalmstra@users.noreply.github.com>

* feat: serialize concurrent environment installs and recover from interrupted ones (prefix-dev#6233)

Co-authored-by: Claude <noreply@anthropic.com>

* chore(ci): Update Rust crate jiff to v0.2.27 (prefix-dev#6258)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix: support conda extras for satisfiabily and solve groups (prefix-dev#6260)

* chore(ci): Update GitHub Actions to v2.79.9 (prefix-dev#6261)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore: version to 0.70.1 (prefix-dev#6268)

* fix: compare pypi git urls using the raw url, not uv's canonical one (prefix-dev#6272)

Co-authored-by: Claude <noreply@anthropic.com>

* fix: keep conda-env build discriminator out of PEP 517 config_settings (prefix-dev#6273)

Co-authored-by: Claude <noreply@anthropic.com>

* fix: accept find-links URLs during lock file satisfiability (prefix-dev#6270)

Co-authored-by: Claude <noreply@anthropic.com>

* chore: strip debug info from dependencies in dev builds (prefix-dev#6283)

* chore: Bump tikv-jemallocator to 0.7.0 (prefix-dev#6278)

* ci: speed up ubuntu and macOS x86 CI (prefix-dev#6280)

* feat: Improve PyPI > Conda clobber detection (prefix-dev#6292)

* fix(ros): avoid pixi lock panics on unmappable ROS dependencies (prefix-dev#6290)

Co-authored-by: Claude <noreply@anthropic.com>

* fix: preserve file permissions during atomic write operations (prefix-dev#6296)

* chore: version to 0.70.2 (prefix-dev#6298)

Co-authored-by: Ruben Arts <ruben.arts@pm.me>

* feat(core): Rich Platform support (prefix-dev#6178)

* test: move examples satisfiability tests to Python (prefix-dev#6300)

* fix: honor workspace [cache.*] overrides for conda-pypi mapping cache (prefix-dev#6284)

* fix: stop source builds rebuilding from scratch on every run (prefix-dev#6285)

* fix: suggest the correct cache config key in netfs-redirect warning (prefix-dev#6282)

* test: skip example satisfiability checks on unsupported platforms (prefix-dev#6311)

* chore(ci): Update Pixi (prefix-dev#6305)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update cargo patches (prefix-dev#6304)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update GitHub Actions to v2.81.1 (prefix-dev#6307)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* refactor: pypi mapping module so that its a bit more logically named (prefix-dev#6302)

* docs: Remove pixi-inject page (prefix-dev#6276)

* chore(ci): Update GitHub Actions to v2.81.2 (prefix-dev#6313)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(test): make test_info_output_extended platform-agnostic (prefix-dev#6314)

* test: skip pytorch doc examples on platforms they don't support (prefix-dev#6317)

* fix(core): key locked records by declared platform for rich platforms (prefix-dev#6315)

* chore(ci): Update GitHub Actions to v6.0.3 (prefix-dev#6319)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(ci): Update Pixi to >=0.24,<0.25 (prefix-dev#6321)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(pixi_spec): support extras, flags and when on conda dependencies (prefix-dev#6262)

* fix(satisfiability): detect extra-dependency drift for source packages (prefix-dev#6263)

* docs: add a pixi-build v3 example using extras, flags and when (prefix-dev#6264)

* fix(ci): Attest the tarballs and the binary inside separately (prefix-dev#6266)

* chore: bump pixi-build-api-version to 5 (prefix-dev#6328)

* ci: move doc examples to `pixi_build` (prefix-dev#6330)

* fix: stop requiring old backend version doc example (prefix-dev#6338)

* feat(test): Do not run tests un unsupported platforms

---------

Co-authored-by: Bas Zalmstra <4995967+baszalmstra@users.noreply.github.com>
Co-authored-by: Tobias Hunger <tobias@prefix.dev>
Co-authored-by: Ben Moss <bmoss40@bloomberg.net>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: nichmor <nmorkotilo@gmail.com>
Co-authored-by: Wolf Vollprecht <w.vollprecht@gmail.com>
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Ruben Arts <ruben.arts@hotmail.com>
Co-authored-by: Andreas Albert <103571926+AndreasAlbertQC@users.noreply.github.com>
Co-authored-by: Lucas Colley <lucas.colley8@gmail.com>
Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com>
Co-authored-by: jinhyuk9714 <jinhyuk9714@gmail.com>
Co-authored-by: GitHub Actions <actions@github.com>
Co-authored-by: Filippo Luca Ferretti <102977828+flferretti@users.noreply.github.com>
Co-authored-by: samrosenf <samrosenf@gmail.com>
Co-authored-by: Ruben Arts <ruben.arts@pm.me>
Co-authored-by: jmayes-rx <jeremy.mayes@readyx.com>
Co-authored-by: Suleman Karigar <37236131+suleman1412@users.noreply.github.com>
Co-authored-by: Tim de Jager <tim@prefix.dev>
Co-authored-by: Kevin Mills <35641675+millsks@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pixi upgrade broken since 0.68.0

3 participants