Skip to content

Conversation

@cmnemoi
Copy link
Contributor

@cmnemoi cmnemoi commented Oct 15, 2025

Hello,

Summary

This PR fixes the confusing error message when running uv lock --check with an outdated lockfile.

Previously, the error message incorrectly stated that --locked was provided, even when the user used --check.

Now, the error message correctly indicates which flag was used: either --check or --locked.

This closes #14105.

Test plan

  • I updated the existing integration test (check_outdated_lock in lock.rs) to verify the new error message includes the correct flag.
  • I ran existing tests to ensure I have no introduced regressions for other commands.

@zanieb
Copy link
Member

zanieb commented Oct 15, 2025

I was imaging instead setting up a type like Mode::Lock | Mode::Check(CheckSource::Check | CheckSource::Locked) instead of a bool so we can report this value appropriately?

sort of like

/// The user-facing command used to invoke a tool run.
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub(crate) enum ToolRunCommand {
/// via the `uvx` alias
Uvx,
/// via `uv tool run`
ToolRun,
}
or
#[derive(Debug, Clone, Copy)]
pub(crate) enum PythonUpgradeSource {
/// The user invoked `uv python install --upgrade`
Install,
/// The user invoked `uv python upgrade`
Upgrade,
}
impl std::fmt::Display for PythonUpgradeSource {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Install => write!(f, "uv python install --upgrade"),
Self::Upgrade => write!(f, "uv python upgrade"),
}
}
}
#[derive(Debug, Clone, Copy)]
pub(crate) enum PythonUpgrade {
/// Python upgrades are enabled.
Enabled(PythonUpgradeSource),
/// Python upgrades are disabled.
Disabled,
}

@cmnemoi
Copy link
Contributor Author

cmnemoi commented Oct 16, 2025

@zanieb Thanks for the review, I applied necessary changes.

@cmnemoi cmnemoi changed the title fix: Running uv lock --check with outdated lockfile will print that --check or --locked was passed, instead of --locked only fix: Running uv lock --check with outdated lockfile will print that --check was passed, instead of --locked Oct 16, 2025
@konstin konstin changed the title fix: Running uv lock --check with outdated lockfile will print that --check was passed, instead of --locked Running uv lock --check with outdated lockfile will print that --check was passed, instead of --locked Oct 20, 2025
@konstin konstin added the error messages Messaging when something goes wrong label Oct 21, 2025
Copy link
Member

@konstin konstin left a comment

Choose a reason for hiding this comment

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

Thank you!

/// missing or needs to be updated, uv will exit with an error.
///
/// Equivalent to `--check`.
#[arg(long, env = EnvVars::UV_LOCKED, value_parser = clap::builder::BoolishValueParser::new(), conflicts_with_all = ["check_exists", "upgrade", "check"])]
Copy link
Member

Choose a reason for hiding this comment

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

We should hide this one, I think.

Comment on lines 180 to 183
if matches!(lock_check, LockCheck::Enabled(_)) {
warn_user_once!(
"`--locked` is a no-op for Python scripts with inline metadata, which always run in isolation"
);
Copy link
Member

Choose a reason for hiding this comment

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

Shouldn't we use the source in this warning message?

Copy link
Member

Choose a reason for hiding this comment

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

(there are some more instances of this following)

Comment on lines 980 to 981
if matches!(lock_check, LockCheck::Enabled(_)) {
LockMode::Locked(target.interpreter(), lock_check.source().unwrap())
Copy link
Member

Choose a reason for hiding this comment

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

We should use if let LockCheck::Enabled(source) = lock_check { so you can avoid the unwrap

Copy link
Member

Choose a reason for hiding this comment

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

(there are some more instances of this following)

Comment on lines 13142 to 13144
fn check_outdated_lock() -> Result<()> {
// Given a test context with a pyproject.toml
let context = TestContext::new("3.12");
Copy link
Member

Choose a reason for hiding this comment

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

I'm a bit confused that the setup for this test case changed. Why did it?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is from my old implementation.

I badly reverted the test case I added for that, I will fix that.

@zanieb
Copy link
Member

zanieb commented Oct 21, 2025

Nice! That's what I had in mind :)

@cmnemoi
Copy link
Contributor Author

cmnemoi commented Oct 21, 2025

@zanieb Thanks for the insightful review again, I applied needed changes 👍

@zanieb zanieb merged commit 225bffb into astral-sh:main Oct 21, 2025
96 of 99 checks passed
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Nov 3, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [astral-sh/uv](https://github.com/astral-sh/uv) | patch | `0.9.5` -> `0.9.7` |

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.9.7`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#097)

[Compare Source](astral-sh/uv@0.9.6...0.9.7)

Released on 2025-10-30.

##### Enhancements

- Add Windows x86-32 emulation support to interpreter architecture checks ([#&#8203;13475](astral-sh/uv#13475))
- Improve readability of progress bars ([#&#8203;16509](astral-sh/uv#16509))
- Add GitHub attestations for uv release artifacts ([#&#8203;11357](astral-sh/uv#11357))

##### Bug fixes

- Drop terminal coloring from `uv auth token` output ([#&#8203;16504](astral-sh/uv#16504))
- Don't use UV\_LOCKED to enable `--check` flag ([#&#8203;16521](astral-sh/uv#16521))

### [`v0.9.6`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#096)

[Compare Source](astral-sh/uv@0.9.5...0.9.6)

Released on 2025-10-29.

This release contains an upgrade to Astral's fork of `async_zip`, which addresses potential sources of ZIP parsing differentials between uv and other Python packaging tooling. See [GHSA-pqhf-p39g-3x64](GHSA-pqhf-p39g-3x64) for additional details.

##### Security

- Address ZIP parsing differentials ([GHSA-pqhf-p39g-3x64](GHSA-pqhf-p39g-3x64))

##### Python

- Upgrade GraalPy to 25.0.1 ([#&#8203;16401](astral-sh/uv#16401))

##### Enhancements

- Add `--clear` to `uv build` to remove old build artifacts ([#&#8203;16371](astral-sh/uv#16371))
- Add `--no-create-gitignore` to `uv build` ([#&#8203;16369](astral-sh/uv#16369))
- Do not error when a virtual environment directory cannot be removed due to a busy error ([#&#8203;16394](astral-sh/uv#16394))
- Improve hint on `pip install --system` when externally managed ([#&#8203;16392](astral-sh/uv#16392))
- Running `uv lock --check` with outdated lockfile will print that `--check` was passed, instead of `--locked`  ([#&#8203;16322](astral-sh/uv#16322))
- Update `uv init` template for Maturin ([#&#8203;16449](astral-sh/uv#16449))
- Improve ordering of Python sources in logs ([#&#8203;16463](astral-sh/uv#16463))
- Restore DockerHub release images and annotations ([#&#8203;16441](astral-sh/uv#16441))

##### Bug fixes

- Check for matching Python implementation during `uv python upgrade` ([#&#8203;16420](astral-sh/uv#16420))
- Deterministically order `--find-links` distributions ([#&#8203;16446](astral-sh/uv#16446))
- Don't panic in `uv export --frozen` when the lockfile is outdated ([#&#8203;16407](astral-sh/uv#16407))
- Fix root of `uv tree` when `--package` is used with circular dependencies ([#&#8203;15908](astral-sh/uv#15908))
- Show package list with `pip freeze --quiet` ([#&#8203;16491](astral-sh/uv#16491))
- Limit `uv auth login pyx.dev` retries to 60s ([#&#8203;16498](astral-sh/uv#16498))
- Add an empty group with `uv add --group ... -r ...` ([#&#8203;16490](astral-sh/uv#16490))

##### Documentation

- Update docs for maturin build backend init template ([#&#8203;16469](astral-sh/uv#16469))
- Update docs to reflect previous changes to signal forwarding semantics ([#&#8203;16430](astral-sh/uv#16430))
- Add instructions for installing via MacPorts ([#&#8203;16039](astral-sh/uv#16039))

</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:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNjkuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE2OS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messages Messaging when something goes wrong

Projects

None yet

Development

Successfully merging this pull request may close these issues.

confusing error message for uv lock --check

3 participants