Skip to content

Implement uv pip freeze --exclude flag#17045

Merged
zanieb merged 7 commits intoastral-sh:mainfrom
gaardhus:freeze-exclude
Jan 17, 2026
Merged

Implement uv pip freeze --exclude flag#17045
zanieb merged 7 commits intoastral-sh:mainfrom
gaardhus:freeze-exclude

Conversation

@gaardhus
Copy link
Contributor

@gaardhus gaardhus commented Dec 9, 2025

Summary

Implements the --exclude flag to uv pip freeze, which allows to filter unwanted dependencies from the resulting requirements.txt file.

uv pip freeze --exclude pandas

part of #3141

Test Plan

Unit test with simple exclusion example of command argument(s)

/// Enumerate the installed packages in the current environment.
pub(crate) fn pip_freeze(
exclude_editable: bool,
exclude: &[PackageName],
Copy link
Member

Choose a reason for hiding this comment

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

Should this be a hash set instead?

Copy link
Member

Choose a reason for hiding this comment

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

#[derive(Debug, Clone)]
pub(crate) struct PipFreezeSettings {
pub(crate) exclude_editable: bool,
pub(crate) exclude: Vec<PackageName>,
Copy link
Member

Choose a reason for hiding this comment

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

I presume we'd transform to a hash set here

Comment on lines 582 to 590
let requirements_txt = context.temp_dir.child("requirements.txt");
requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?;

// Run `pip sync`.
context
.pip_sync()
.arg(requirements_txt.path())
.assert()
.success();
Copy link
Member

Choose a reason for hiding this comment

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

I might just pip install these packages instead since it's simpler, and you don't need to pin versions because we use exclude-newer in the test suite.

Copy link
Contributor Author

@gaardhus gaardhus Dec 11, 2025

Choose a reason for hiding this comment

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

changed to pip_install, and can also remove pins, however I just adopted that from the other test cases, so unsure how to move forward with that.

Copy link
Member

Choose a reason for hiding this comment

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


Self {
exclude_editable,
exclude,
Copy link
Contributor Author

Choose a reason for hiding this comment

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

transform to hash set here seems to be how I can make it work? exclude: exclude.into_iter().collect(),

however, like pinning versions in pip_install test, I'm unsure if other similar cases should be changed, i.e. PipListSettings implements a similar exclude argument which is also currently a Vec.

@zanieb

Copy link
Member

Choose a reason for hiding this comment

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

We can pursue refactoring other cases separately, want to just open an issue to track that?

context
.pip_install()
.arg("-r")
.arg("requirements.txt")
Copy link
Member

Choose a reason for hiding this comment

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

I think you should drop the requirements.txt entirely and just use MarkupSafe and ntomli as arguments here.

@gaardhus
Copy link
Contributor Author

@zanieb Sorry for the delayed response. I have rebased on main and created two issues, let me know if anything else is missing.

@zanieb
Copy link
Member

zanieb commented Jan 17, 2026

Thanks!

@zanieb zanieb added the enhancement New feature or improvement to existing functionality label Jan 17, 2026
@zanieb zanieb merged commit e2095b9 into astral-sh:main Jan 17, 2026
53 checks passed
zaniebot pushed a commit to zaniebot/uv that referenced this pull request Jan 17, 2026
Further simplify pip_freeze tests by passing package names directly
to pip_install rather than creating temporary requirements files.
This follows the suggestion from PR astral-sh#17045 review discussion.
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jan 27, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [astral-sh/uv](https://github.com/astral-sh/uv) | patch | `0.9.26` → `0.9.27` |

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

[Compare Source](astral-sh/uv@0.9.26...0.9.27)

Released on 2026-01-26.

##### Python

- Upgrade Pyodide to 0.29.2 ([#&#8203;17652](astral-sh/uv#17652))
- Upgrade to GraalPy 25.0.2 ([#&#8203;17634](astral-sh/uv#17634))

##### Enhancements

- Add `-t` shortform for `--target` to `uv pip` subcommands ([#&#8203;17501](astral-sh/uv#17501))
- Add support for ROCm 7.0 and 7.1 accelerator backends ([#&#8203;17681](astral-sh/uv#17681))
- Further improve free-threading ABI incompatibility errors ([#&#8203;17491](astral-sh/uv#17491))
- Implement `uv pip freeze --exclude` flag ([#&#8203;17045](astral-sh/uv#17045))
- Improve warnings for `--system` and `--no-system` in `uv venv` ([#&#8203;17647](astral-sh/uv#17647))
- Make `uv pip compile` attempt to download a specified `--python-version` if it can. ([#&#8203;17249](astral-sh/uv#17249))
- Support Trusted Publishing with pyx ([#&#8203;17438](astral-sh/uv#17438))
- Fix JSON schema for `exclude-newer-package` ([#&#8203;17665](astral-sh/uv#17665))

##### Preview features

- Better detection for conflicting packages ([#&#8203;17623](astral-sh/uv#17623))
- Upgrade based on outdated build versions in `uv python upgrade` ([#&#8203;17653](astral-sh/uv#17653))

##### Bug fixes

- Change chocolatey system test to ensure uv uses the right python ([#&#8203;17533](astral-sh/uv#17533))
- Fix infinite loop when `SSL_CERT_FILE` is a directory ([#&#8203;17503](astral-sh/uv#17503))

##### Documentation

- Add cargo-xwin to the CONTRIBUTING guide ([#&#8203;17507](astral-sh/uv#17507))
- Fix typo in the documentation of UV\_PUBLISH\_INDEX ([#&#8203;17672](astral-sh/uv#17672))
- Move MSRV to platform support section ([#&#8203;17534](astral-sh/uv#17534))
- Update the testing instructions in the CONTRIBUTING guide ([#&#8203;17528](astral-sh/uv#17528))
- Use `--locked` to install `cargo-xwin` in guide ([#&#8203;17530](astral-sh/uv#17530))
- Warn about PyPy being unmaintained ([#&#8203;17643](astral-sh/uv#17643))
- docs: Correct gitlab-ci.yml to .gitlab-ci.yml ([#&#8203;17682](astral-sh/uv#17682))

##### Other changes

- Update MSRV to 1.91 ([#&#8203;17677](astral-sh/uv#17677))

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

Labels

enhancement New feature or improvement to existing functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants