Skip to content

Add dependents ("via ..." comments) in export command #12350

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

Merged
merged 9 commits into from
Mar 28, 2025

Conversation

zmeir
Copy link
Contributor

@zmeir zmeir commented Mar 20, 2025

Adding dependency trace/parent comments ("via ...") to the export command output.
This is a similar behavior to the pip compile output.

Note to the eager reviewer:

First of all - thanks!
Secondly, this is still a very rough draft. These are the first lines of code I've ever written in Rust. This is still mostly an educational/fun exercise for myself. If opening a Draft PR is creating too much noise - I apologize and I will close it until it is ready.

Summary

Resolves #7777

Test Plan

  • manual command execution
  • update expected output in tests

@zmeir zmeir force-pushed the zmeir/export_like_pip_compile branch from 3db6731 to 28b5dc4 Compare March 20, 2025 22:27
@zanieb zanieb requested a review from charliermarsh March 21, 2025 18:15
@zmeir zmeir force-pushed the zmeir/export_like_pip_compile branch 3 times, most recently from 537c5f7 to df20e9f Compare March 23, 2025 06:53
@zmeir zmeir force-pushed the zmeir/export_like_pip_compile branch from df20e9f to 713aef3 Compare March 23, 2025 21:51
@zmeir zmeir changed the title Add dependency parents ("via" comments) in export command Add dependents ("via ..." comments) in export command Mar 23, 2025
@zmeir zmeir force-pushed the zmeir/export_like_pip_compile branch from 05c4ccc to 652d844 Compare March 25, 2025 20:55
@@ -312,6 +314,27 @@ impl<'lock> RequirementsTxtExport<'lock> {
.map(|(index, package)| Requirement {
package,
marker: reachability.remove(&index).unwrap_or_default(),
dependents: graph
.edges_directed(index, Direction::Incoming)
.sorted_by_key(|edge| {
Copy link
Member

Choose a reason for hiding this comment

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

What is the purpose of this sort?

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 I would've expected us to sort by name rather than degree.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The purpose is to put on top any dependents that have the root as a direct dependent. This being the current project.

This is before sorting:
image

And this is after:
image

I will add a secondary sort by name

Copy link
Member

Choose a reason for hiding this comment

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

Personally I think I'd prefer to sort by name -- it's a little easier to parse visually since it's predictable.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Do you mean just by name or first the project and then the rest of the dependents by name?

I tried to be consistent with the output of uv pip compile.

Copy link
Member

Choose a reason for hiding this comment

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

I was proposing sorting just by the dependent name. Doesn't uv pip compile just sort by name?

let mut dependents = graph
    .edges_directed(index, Direction::Incoming)
    .map(|edge| &graph[edge.source()])
    .map(uv_distribution_types::Name::name)
    .collect::<Vec<_>>();
dependents.sort_unstable();
dependents.dedup();
dependents

Copy link
Member

@charliermarsh charliermarsh left a comment

Choose a reason for hiding this comment

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

This looks pretty reasonable overall.

@charliermarsh charliermarsh self-assigned this Mar 27, 2025
@charliermarsh charliermarsh added the enhancement New feature or improvement to existing functionality label Mar 27, 2025
@zmeir zmeir marked this pull request as ready for review March 27, 2025 21:56
@zmeir
Copy link
Contributor Author

zmeir commented Mar 27, 2025

Thanks for your review @charliermarsh, I think this is just about ready.

I've updated the sorting as discussed here. If you would like me to change it please let me know.

I've also added a CLI option: --no-annotate, similarly to uv pip compile.

@charliermarsh charliermarsh enabled auto-merge (squash) March 28, 2025 14:26
@charliermarsh charliermarsh disabled auto-merge March 28, 2025 14:37
@charliermarsh charliermarsh merged commit ab3bab1 into astral-sh:main Mar 28, 2025
75 of 76 checks passed
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Mar 31, 2025
This MR contains the following updates:

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

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

[Compare Source](astral-sh/uv@0.6.10...0.6.11)

##### Enhancements

-   Add dependents ("via ..." comments) in `uv export` command ([#&#8203;12350](astral-sh/uv#12350))
-   Bump least-recent non-EOL macOS version to 13.0 ([#&#8203;12518](astral-sh/uv#12518))
-   Support `--find-links`-style "flat" indexes in `[[tool.uv.index]]` ([#&#8203;12407](astral-sh/uv#12407))
-   Distinguish between `-q` and `-qq` ([#&#8203;12300](astral-sh/uv#12300))

##### Configuration

-   Support `UV_PROJECT` environment to set project directory. ([#&#8203;12327](astral-sh/uv#12327))

##### Performance

-   Use a boxed slice for various requirement types ([#&#8203;12514](astral-sh/uv#12514))

##### Bug fixes

-   Add a newline after metadata when initializing scripts with other metadata blocks ([#&#8203;12501](astral-sh/uv#12501))
-   Avoid writing empty `requires-python` to script blocks ([#&#8203;12517](astral-sh/uv#12517))
-   Respect build constraints in `uv sync` ([#&#8203;12502](astral-sh/uv#12502))
-   Respect transitive dependencies in `uv tree --only-group` ([#&#8203;12560](astral-sh/uv#12560))

</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:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMTkuMiIsInVwZGF0ZWRJblZlciI6IjM5LjIxOS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
@eliasecchig
Copy link

eliasecchig commented Apr 2, 2025

can you consider changing the behavior so to no-annotate by default?

This is breaking many frameworks depending on uv

@charliermarsh
Copy link
Member

Sorry, can you expand on that comment? What frameworks are depending on uv, and why are they breaking here? Comments are part of the output format.

@eliasecchig
Copy link

eliasecchig commented Apr 2, 2025

The default output of a uv export command changed between uv <= 0.6.10 and uv >= 0.6.11, representing a backwards-incompatible change.

I am using uv and the export command as part of a public project - see this line

 uv export --no-hashes --no-sources --no-header --no-emit-project --frozen > .requirements.txt

In short the same command:

  • uv <= 0.6.10: Produces Output X
  • uv >= 0.6.11: Produces Output Y

Hence why my request is to ensure --no-annotate is the default option.

@charliermarsh
Copy link
Member

Right, but the output is still a valid requirements.txt file.

@zanieb
Copy link
Member

zanieb commented Apr 2, 2025

Sorry, but a change in the output is not considered a breaking change if the format is unchanged. Here, we've just added comments that are compatible with the file format.

@eliasecchig
Copy link

Understood, I will deal with it on my side thanks!

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Apr 21, 2025
## 0.6.14

### Python versions

The following Python versions have been added:

- CPython 3.13.3
- CPython 3.12.10
- CPython 3.11.12
- CPython 3.10.17
- CPython 3.9.22

See the [`python-build-standalone` release notes](https://github.com/astral-sh/python-build-standalone/releases/tag/20250409) for more details.

### Enhancements

- Add `uv-build` and `uv_build` aliases to `uv init --build-backend` ([#12776](astral-sh/uv#12776))
- Emit dedicated error message for Conda `environment.yml` files ([#12669](astral-sh/uv#12669))


### Preview features

- Build backend: Check module dir exists for sdist build ([#12779](astral-sh/uv#12779))
- Build backend: Fix sdist with long directories ([#12764](astral-sh/uv#12764))

### Performance

- Avoid querying GitHub on repeated install invocations ([#12767](astral-sh/uv#12767))

### Bug fixes

- Error when `tool.uv.sources` is set in system-level configuration file ([#12757](astral-sh/uv#12757))
- Split workspace members onto their own lines in `uv init` ([#12756](astral-sh/uv#12756))

### Documentation

- Add lockfile note about PEP 751 ([#12732](astral-sh/uv#12732))
- Extend the reference documentation for `uv pip sync` ([#12683](astral-sh/uv#12683))
- Fix mismatched pip interface header / nav titles ([#12640](astral-sh/uv#12640))

## 0.6.13

### Enhancements

- Add `--show-version` to `uv python find` ([#12376](astral-sh/uv#12376))
- Remove `--no-config` warning from `uv pip compile` and `uv pip sync` ([#12642](astral-sh/uv#12642))
- Skip repeated directories in `PATH` when searching for Python interpreters ([#12367](astral-sh/uv#12367))
- Unset `SCRIPT_PATH` in relocatable activation script ([#12672](astral-sh/uv#12672))
- Add `UV_PYTHON_DOWNLOADS_JSON_URL` to set custom managed python sources ([#10939](astral-sh/uv#10939))
- Reject `pyproject.toml` files in `uv pip compile -o` ([#12673](astral-sh/uv#12673))
- Respect the `--offline` flag for Git operations ([#12619](astral-sh/uv#12619))

### Bug fixes

- Warn instead of error if CRC appears to be missing ([#12722](astral-sh/uv#12722))
- Avoid infinite loop in `uv export` with conflicts ([#12726](astral-sh/uv#12726))

### Rust API

- Update MSRV to 1.84 ([#12670](astral-sh/uv#12670))

## 0.6.12

### Enhancements

- Report the queried executable path in `uv python list` ([#12628](astral-sh/uv#12628))
- Improve archive unpack error messages ([#12627](astral-sh/uv#12627))

### Bug fixes

- Respect `authenticate` when using `explicit = true` ([#12631](astral-sh/uv#12631))
- Normalize extra and group names in `uv add` and `uv remove` ([#12586](astral-sh/uv#12586))
- Enforce CRC-32 checks when unpacking archives ([#12623](astral-sh/uv#12623))
- Fix parsing of `python-platform` in settings files ([#12592](astral-sh/uv#12592))

### Documentation

- Add note about `uv build` to `package = false` ([#12608](astral-sh/uv#12608))
- Add index fallback note to `authenticate = always` documentation ([#12498](astral-sh/uv#12498))
- Fix invalid 'kind' reference in flat index docs ([#12583](astral-sh/uv#12583))

## 0.6.11

### Enhancements

- Add dependents ("via ..." comments) in `uv export` command ([#12350](astral-sh/uv#12350))
- Bump least-recent non-EOL macOS version to 13.0 ([#12518](astral-sh/uv#12518))
- Support `--find-links`-style "flat" indexes in `[[tool.uv.index]]` ([#12407](astral-sh/uv#12407))
- Distinguish between `-q` and `-qq` ([#12300](astral-sh/uv#12300))

### Configuration

- Support `UV_PROJECT` environment to set project directory. ([#12327](astral-sh/uv#12327))

### Performance

- Use a boxed slice for various requirement types ([#12514](astral-sh/uv#12514))

### Bug fixes

- Add a newline after metadata when initializing scripts with other metadata blocks ([#12501](astral-sh/uv#12501))
- Avoid writing empty `requires-python` to script blocks ([#12517](astral-sh/uv#12517))
- Respect build constraints in `uv sync` ([#12502](astral-sh/uv#12502))
- Respect transitive dependencies in `uv tree --only-group` ([#12560](astral-sh/uv#12560))

## 0.6.10

### Enhancements

- Add `uv sync --check` flag ([#12342](astral-sh/uv#12342))
- Add support for Python version requests in `uv python list` ([#12375](astral-sh/uv#12375))
- Support `.env` files in `uv tool run` ([#12386](astral-sh/uv#12386))
- Support `python find --script` ([#11891](astral-sh/uv#11891))

### Preview features

- Check all compatible torch indexes when `--torch-backend` is enabled ([#12385](astral-sh/uv#12385))

### Performance

- Use a boxed slice for extras and groups ([#12391](astral-sh/uv#12391))
- Use small string for index name type ([#12355](astral-sh/uv#12355))

### Bug fixes

- Allow virtual packages with `--no-build` ([#12314](astral-sh/uv#12314))
- Ignore `--find-links` entries for pinned indexes ([#12396](astral-sh/uv#12396))
- Omit wheels from lockfile based on `--exclude-newer` ([#12299](astral-sh/uv#12299))
- Retain end-of-line comment position when adding dependency ([#12360](astral-sh/uv#12360))
- Omit fragment when querying for wheels in Simple HTML API ([#12384](astral-sh/uv#12384))
- Error on missing argument in `requirements.txt` ([#12354](astral-sh/uv#12354))
- Support modules with different casing in build backend ([#12240](astral-sh/uv#12240))
- Add authentication policy support for `pip` commands ([#12470](astral-sh/uv#12470))

## 0.6.9

### Enhancements

- Use `keyring --mode creds` when `authenticate = "always"` ([#12316](astral-sh/uv#12316))
- Fail with specific error message when no password is present and `authenticate = "always"` ([#12313](astral-sh/uv#12313))

### Bug fixes

- Add boolish value parser for `UV_MANAGED_PYTHON` flags ([#12345](astral-sh/uv#12345))
- Make deserialization non-fatal when assessing source tree revisions ([#12319](astral-sh/uv#12319))
- Use resolver-returned wheel over alternate cached wheel ([#12301](astral-sh/uv#12301))

### Documentation

- Add experimental `--torch-backend` to the PyTorch guide ([#12317](astral-sh/uv#12317))
- Fix `#keyring-provider` references in alternative index docs ([#12315](astral-sh/uv#12315))
- Fix `--directory` path in examples ([#12165](astral-sh/uv#12165))

### Preview changes

- Automatically infer the PyTorch index via `--torch-backend=auto` ([#12070](astral-sh/uv#12070))

## 0.6.8

### Enhancements

- Add support for enabling all groups by default with `default-groups = "all"` ([#12289](astral-sh/uv#12289))
- Add simpler `--managed-python` and `--no-managed-python` flags for toggling Python preferences ([#12246](astral-sh/uv#12246))

### Performance

- Avoid allocations for default cache keys ([#12063](astral-sh/uv#12063))

### Bug fixes

- Allow local version mismatches when validating lockfile ([#12285](astral-sh/uv#12285))
- Allow owned string when deserializing `requires-python` ([#12278](astral-sh/uv#12278))
- Make cache errors non-fatal in `Planner::build` ([#12281](astral-sh/uv#12281))

## 0.6.7

### Python

- Add CPython 3.14.0a6
- Fix regression where extension modules would use wrong `CXX` compiler on Linux
- Enable FTS3 enhanced query syntax for SQLite

See the [`python-build-standalone` release notes](https://github.com/astral-sh/python-build-standalone/releases/tag/20250317) for more details.

### Enhancements

- Add support for `-c` constraints in `uv add` ([#12209](astral-sh/uv#12209))
- Add support for `--global` default version in `uv python pin` ([#12115](astral-sh/uv#12115))
- Always reinstall local source trees passed to `uv pip install` ([#12176](astral-sh/uv#12176))
- Render token claims on publish permission error ([#12135](astral-sh/uv#12135))
- Add pip-compatible `--group` flag to `uv pip install` and `uv pip compile` ([#11686](astral-sh/uv#11686))

### Preview features

- Avoid creating duplicate directory entries in built wheels ([#12206](astral-sh/uv#12206))
- Allow overriding module names for editable builds ([#12137](astral-sh/uv#12137))

### Performance

- Avoid replicating core-metadata field on `File` struct ([#12159](astral-sh/uv#12159))

### Bug fixes

- Add `src` to default cache keys ([#12062](astral-sh/uv#12062))
- Discard insufficient fork markers ([#10682](astral-sh/uv#10682))
- Ensure `python pin --global` creates parent directories if missing ([#12180](astral-sh/uv#12180))
- Fix GraalPy abi tag parsing and discovery ([#12154](astral-sh/uv#12154))
- Remove extraneous script packages in `uv sync --script` ([#12158](astral-sh/uv#12158))
- Remove redundant `activate.bat` output ([#12160](astral-sh/uv#12160))
- Avoid subsequent index hint when no versions are available on the first index ([#9332](astral-sh/uv#9332))
- Error on lockfiles with incoherent wheel versions ([#12235](astral-sh/uv#12235))

### Rust API

- Update `BaseClientBuild` to accept custom proxies ([#12232](astral-sh/uv#12232))

### Documentation

- Make testpypi index explicit in example snippet ([#12148](astral-sh/uv#12148))
- Reverse and format the archived changelogs ([#12099](astral-sh/uv#12099))
- Use consistent commas around i.e. and e.g. ([#12157](astral-sh/uv#12157))
- Fix typos in MRE docs ([#12198](astral-sh/uv#12198))
- Fix double space typo ([#12171](astral-sh/uv#12171))
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.

Adding package dependency trace to uv export
4 participants