-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow -p
to use complex Python version requests in uv pip compile
#11486
Conversation
f769253
to
16296d6
Compare
dded29e
to
8a5571b
Compare
// Resolve `-p` into `--python-version` or `--python` | ||
if let Some(python_legacy) = python_legacy { | ||
if let Ok(version) = PythonVersion::from_str(&python_legacy) { | ||
python_version = Some(version); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So the net effect here is that we don't error if the version doesn't exist, right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes
crates/uv-cli/src/lib.rs
Outdated
/// | ||
/// `UV_PYTHON` is respected, but overridden by `--python-version` or `--python`. | ||
#[arg(short, hide = true, help_heading = "Python options")] | ||
pub python_legacy: Option<String>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why can't this just be done via -p
? So --python 3.7
and -p 3.7
now behave differently?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should --python 3.7
error if 3.7 isn't installed or available?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's complicated.
--python 3.7
continues to work as it does today — it errors if it's not found. I don't know if I want to break that behavior because it does matter when you're not just doing version requests, e.g., --python pypy
needs to fail if we can't find that implementation or the tags will be wrong. Similarly, --python <path>
needs to fail.
We could special case --python <version>
in the future if we want, which (as you said) would let us drop this legacy flag. However, then there would be no way for users to enforce that we actually find that interpreter.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Always setting a great example with your test coverage :)
crates/uv-cli/src/lib.rs
Outdated
conflicts_with_all = ["python", | ||
"python_version"], | ||
value_name = "PYTHON", | ||
help_heading = "Python options" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this help heading is presumably pointless but i guess it's future-proof
Thanks @Gankra :) For reference, I talked to @charliermarsh offline and made some more changes in 24be46c to special-case |
@@ -216,6 +240,7 @@ pub(crate) async fn pip_compile( | |||
&& python_version.minor() == interpreter.python_minor() | |||
}; | |||
if no_build.is_none() | |||
&& python.is_none() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Avoids warning if --python
intentionally requested a different interpreter than --python-version
.
…#11486) Closes #11285 Closes #11437 This changes `-p` from an alias of `--python-version` to `--python` while retaining backwards compatibility for `--python-version`-like fallback behavior when the requested version, e.g., `-p 3.12`, cannot be found. This was initially implemented with a hidden `--python-legacy` flag which allows us to special case the short `-p` flag — unlike the implementation in #11437. However, after further discussion, we decided the behavior difference between `-p` and `--python` would be confusing so now `-p` is an alias for `--python` and `--python` is special-cased when a version is used. Additionally, we now respect the `UV_PYTHON` environment variable, but it is ignored when `--python-version` is set. If you want different `--python-version` and `--python` values, you must do so explicitly. I considered banning this, but it is valid for e.g. `--python pypy --python-version 3.12`
…#11486) Closes #11285 Closes #11437 This changes `-p` from an alias of `--python-version` to `--python` while retaining backwards compatibility for `--python-version`-like fallback behavior when the requested version, e.g., `-p 3.12`, cannot be found. This was initially implemented with a hidden `--python-legacy` flag which allows us to special case the short `-p` flag — unlike the implementation in #11437. However, after further discussion, we decided the behavior difference between `-p` and `--python` would be confusing so now `-p` is an alias for `--python` and `--python` is special-cased when a version is used. Additionally, we now respect the `UV_PYTHON` environment variable, but it is ignored when `--python-version` is set. If you want different `--python-version` and `--python` values, you must do so explicitly. I considered banning this, but it is valid for e.g. `--python pypy --python-version 3.12`
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [astral-sh/uv](https://github.com/astral-sh/uv) | minor | `0.5.31` -> `0.6.0` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>astral-sh/uv (astral-sh/uv)</summary> ### [`v0.6.0`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#060) [Compare Source](astral-sh/uv@0.5.31...0.6.0) There have been 31 releases and 1135 pull requests since [0.5.0](https://github.com/astral-sh/uv/releases/tag/0.5.0), our last release with breaking changes. As before, we've accumulated various changes that improve correctness and user experience, but could break some workflows. This release contains those changes; many have been marked as breaking out of an abundance of caution. We expect most users to be able to upgrade without making changes. ##### Breaking changes - **Create `main.py` instead of `hello.py` in `uv init`** ([#​10369](astral-sh/uv#10369)) Previously, `uv init` created a `hello.py` sample file. Now, `uv init` will create `main.py` instead — which aligns with expectations from user feedback. The `--bare` option can be used to avoid creating the file altogether. - **Respect `UV_PYTHON` in `uv python install`** ([#​11487](astral-sh/uv#11487)) Previously, `uv python install` did not read this environment variable; now it does. We believe this matches user expectations, however, this will take priority over `.python-version` files which could be considered breaking. - **Set `UV` to the uv executable path** ([#​11326](astral-sh/uv#11326)) When uv spawns a subprocess, it will now have the `UV` environment variable set to the `uv` binary path. This change is breaking if you are setting the `UV` environment variable yourself, as we will overwrite its value. Additionally, this change requires marking the uv Rust entrypoint (`uv::main`) as `unsafe` to avoid unsoundness — this is only relevant if you are invoking uv using Rust. See the [Rust documentation](https://doc.rust-lang.org/std/env/fn.set_var.html#safety) for details about the safety of updating a process' environment. - **Error on non-existent extras, e.g., in `uv sync`** ([#​11426](astral-sh/uv#11426)) Previously, uv would silently ignore non-existent extras requested on the command-line (e.g., via `uv sync --extra foo`). This is *generally* correct behavior when resolving requests for package extras, because an extra may be present on one compatible version of a package but not another. However, this flexibility doesn't need to apply to the local project and it's less surprising to error here. - **Error on missing dependency groups when `--frozen` is provided** ([#​11499](astral-sh/uv#11499)) Previously, uv would not validate that the requested dependency groups were present in the lockfile when the `--frozen` flag was used. Now, an error will be raised if a requested dependency group is not present. - **Change `-p` to a `--python` alias in `uv pip compile`** ([#​11486](astral-sh/uv#11486)) In `uv pip compile`, `-p` was an alias for `--python-version` while everywhere else in uv's interface it is an alias for `--python`. Additionally, `uv pip compile` did not respect the `UV_PYTHON` environment variable. Now, the semantics of this flag have been updated for parity with the rest of the CLI. However, `--python-version` is unique: if we cannot find an interpreter with the given version, we will not fail. Instead, we'll use an alternative interpreter and override its version tags with the requested version during package resolution. This behavior is retained here for backwards compatibility, `--python <version>` / `-p <version>` will not fail if the version cannot be found. However, if a specific interpreter is requested, e.g., with `--python <path>` or `--python pypy`, and cannot be found — uv will exit with an error. The breaking changes here are that `UV_PYTHON` is respected and `--python <version>` will no longer fail if the version cannot be found. - **Bump `alpine` default tag to 3.21 for derived Docker images** ([#​11157](astral-sh/uv#11157)) Alpine 3.21 was released in Dec 2024 and is used in the official Alpine-based Python images. Our `uv:python3.x-alpine` images have been using 3.21 since uv v0.5.8. However, now the the `uv:alpine` image will use 3.21 instead of 3.20 and `uv:alpine3.20` will no longer be updated. - **Use files instead of junctions on Windows** ([#​11269](astral-sh/uv#11269)) Previously, we used junctions for atomic replacement of cache entries on Windows. Now, we use a file with a pointer to the cache entry instead. This resolves various edge-case behaviors with junctions. These files are only intended to be consumed by uv and the cache version has been bumped. We do not think this change will affect workflows. ##### Stabilizations - **`uv publish` is no longer in preview** ([#​11032](astral-sh/uv#11032)) This does not come with any behavior changes. You will no longer see an experimental warning when using `uv publish`. See the linked pull request for a report on the stabilization. ##### Enhancements - Support `--active` for PEP 723 script environments ([#​11433](astral-sh/uv#11433)) - Add `revision` to the lockfile to allow backwards-compatible metadata changes ([#​11500](astral-sh/uv#11500)) ##### Bug fixes - Avoid reading metadata from `.egg-info` files ([#​11395](astral-sh/uv#11395)) - Include archive bucket version in archive pointers ([#​11306](astral-sh/uv#11306)) - Omit lockfile version when additional fields are dynamic ([#​11468](astral-sh/uv#11468)) - Respect executable name in `uvx --from tool@latest` ([#​11465](astral-sh/uv#11465)) ##### Documentation - The `CHANGELOG.md` is now split into separate files for each "major" version to fix rendering ([#​11510](astral-sh/uv#11510)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNzAuMSIsInVwZGF0ZWRJblZlciI6IjM5LjE3MC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
Closes #11285
Closes #11437
This changes
-p
from an alias of--python-version
to--python
while retaining backwards compatibility for--python-version
-like fallback behavior when the requested version, e.g.,-p 3.12
, cannot be found.This was initially implemented with a hidden
--python-legacy
flag which allows us to special case the short-p
flag — unlike the implementation in #11437. However, after further discussion, we decided the behavior difference between-p
and--python
would be confusing so now-p
is an alias for--python
and--python
is special-cased when a version is used.Additionally, we now respect the
UV_PYTHON
environment variable, but it is ignored when--python-version
is set. If you want different--python-version
and--python
values, you must do so explicitly. I considered banning this, but it is valid for e.g.--python pypy --python-version 3.12