-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Allow pinning managed Python versions to specific build versions #15314
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
Conversation
f12bae7
to
3212cb3
Compare
a0cd585
to
6a8d153
Compare
ec1816c
to
b145177
Compare
b145177
to
96a2dbd
Compare
1767aee
to
4c1c479
Compare
4c1c479
to
9a34dcd
Compare
9a34dcd
to
5115bd6
Compare
5115bd6
to
39f569d
Compare
39f569d
to
58c88e7
Compare
58c88e7
to
a5291b7
Compare
a5291b7
to
97825d0
Compare
97825d0
to
e193380
Compare
/// Add extra standard filtering for Python executable names, e.g., stripping version number | ||
/// and `.exe` suffixes. | ||
#[must_use] | ||
pub fn with_filtered_python_names(mut self) -> Self { |
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.
Absolutely nightmarish to get the filters working on Windows and Unix. Hopefully this makes them more robust elsewhere.
/// A wrapper type to display a `ManagedPythonDownload` with its build information. | ||
pub struct ManagedPythonDownloadWithBuild<'a>(&'a ManagedPythonDownload); | ||
|
||
impl Display for ManagedPythonDownloadWithBuild<'_> { | ||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||
if let Some(build) = self.0.build { | ||
write!(f, "{}+{}", self.0.key, build) | ||
} else { | ||
write!(f, "{}", self.0.key) | ||
} | ||
} | ||
} |
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.
I want to make use of this for some error messages to avoid confusion when this is in a request. I'm not sure what the best way to do so is yet though.
) -> Result<Option<String>, BuildVersionError> { | ||
let variable = python_build_version_variable(implementation); | ||
|
||
let Some(build_os) = env::var_os(variable) else { |
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.
We should use env::var
here, this also avoids using our own error type
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.
I don't want to use env::var
here, it will error if not present and I want that to have different behavior. I also want the dedicated error type for when we perform further validation of these values in the future, e.g., we know what a well formed build version looks like.
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 makes sense if we add our own validation logic on top.
} | ||
|
||
/// Get the environment variable name for the build constraint for a given implementation. | ||
pub(crate) fn python_build_version_variable(implementation: ImplementationName) -> &'static str { |
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 this be a method on implementation name?
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 could be 🤔 I wanted to keep all this logic together but I don't feel strongly.
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [astral-sh/uv](https://github.com/astral-sh/uv) | patch | `0.8.13` -> `0.8.14` | 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.8.14`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0814) [Compare Source](astral-sh/uv@0.8.13...0.8.14) ##### Python - Add managed CPython distributions for aarch64 musl ##### Enhancements - Add `--python-platform` to `uv pip check` ([#​15486](astral-sh/uv#15486)) - Add an environment variable for `UV_ISOLATED` ([#​15428](astral-sh/uv#15428)) - Add logging to the uv build backend ([#​15533](astral-sh/uv#15533)) - Allow more trailing null bytes in zip files ([#​15452](astral-sh/uv#15452)) - Allow pinning managed Python versions to specific build versions ([#​15314](astral-sh/uv#15314)) - Cache PyTorch wheels by default ([#​15481](astral-sh/uv#15481)) - Reject already-installed wheels that don't match the target platform ([#​15484](astral-sh/uv#15484)) - Add `--no-install-local` option to `uv sync`, `uv add` and `uv export` ([#​15328](astral-sh/uv#15328)) - Include cycle error message in `uv pip` CLI ([#​15453](astral-sh/uv#15453)) ##### Preview features - Fix format of `{version}` on `uv format` failure ([#​15527](astral-sh/uv#15527)) - Lock during installs in `uv format` to prevent races ([#​15551](astral-sh/uv#15551)) - Respect `--project` in `uv format` ([#​15438](astral-sh/uv#15438)) - Run `uv format` in the project root ([#​15440](astral-sh/uv#15440)) ##### Configuration - Add file-to-CLI overrides for build isolation configuration ([#​15437](astral-sh/uv#15437)) - Add file-to-CLI overrides for reinstall configuration ([#​15426](astral-sh/uv#15426)) ##### Performance - Cache `WHEEL` and `METADATA` reads in installed distributions ([#​15489](astral-sh/uv#15489)) ##### Bug fixes - Avoid erroring when creating `venv` in current working directory ([#​15537](astral-sh/uv#15537)) - Avoid introducing unnecessary system dependency on CUDA ([#​15449](astral-sh/uv#15449)) - Clear discovered site packages when creating virtual environment ([#​15522](astral-sh/uv#15522)) - Read index credentials from the environment during `uv publish` checks ([#​15545](astral-sh/uv#15545)) - Refuse to remove non-virtual environments in `uv venv` ([#​15538](astral-sh/uv#15538)) - Stop setting `CLICOLOR_FORCE=1` when calling build backends ([#​15472](astral-sh/uv#15472)) - Support file or directory removal for Windows symlinks ([#​15543](astral-sh/uv#15543)) ##### Documentation - Fix GitHub guide highlight lines ([#​15443](astral-sh/uv#15443)) - Move Resolver to new Internals section in the Reference ([#​15465](astral-sh/uv#15465)) - Split the "Authentication" page into sections ([#​15575](astral-sh/uv#15575)) - Update uninstall docs to mention `uvw.exe` needs to be removed ([#​15536](astral-sh/uv#15536)) </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:eyJjcmVhdGVkSW5WZXIiOiI0MS44OC4wIiwidXBkYXRlZEluVmVyIjoiNDEuODguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
Allows pinning the Python build version via environment variables, e.g.,
UV_PYTHON_CPYTHON_BUILD=...
. Each variable is implementation specific, because they use different versioning schemes.Updates the Python download metadata to include a
build
string, so we can filter downloads by the pin. Writes the build version to a file in the managed install, e.g.,cpython-3.10.18-macos-aarch64-none/BUILD
, so we can filter installed versions by the pin.Some important follow-up here:
Some less important follow-ups to consider: