Files
uv/.github/workflows/ci.yml
T
renovate[bot] cfe82dc22a Update EmbarkStudios/cargo-deny-action action to v2 (#13164)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[EmbarkStudios/cargo-deny-action](https://redirect.github.com/EmbarkStudios/cargo-deny-action)
| action | major | `v1` -> `v2.0.11` |

---

### Release Notes

<details>
<summary>EmbarkStudios/cargo-deny-action
(EmbarkStudios/cargo-deny-action)</summary>

###
[`v2.0.11`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.11)

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.10...v2.0.11)

#### \[0.18.2] - 2025-03-10

##### Added

-
[PR#753](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/753)
resolved
[#&#8203;752](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/752)
by adding back the `advisories.unmaintained` config option. See the
[docs](https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html#the-unmaintained-field-optional)
for how it can be used. The default matches the current behavior, which
is to error on any `unmaintained` advisory, but adding `unmaintained =
"workspace"` to the `[advisories]` table will mean unmaintained
advisories will only error if the crate is a direct dependency of your
workspace.

#### \[0.18.1] - 2025-02-27

##### Fixed

-
[PR#749](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/749)
updated `krates` to pull in the fix for
[EmbarkStudios/krates#100](https://redirect.github.com/EmbarkStudios/krates/issues/100).

###
[`v2.0.10`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.10)

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.9...v2.0.10)

-
[PR#96](https://redirect.github.com/EmbarkStudios/cargo-deny-action/pull/96)
resolved
[#&#8203;94](https://redirect.github.com/EmbarkStudios/cargo-deny-action/issues/94)
by switching to the directory the manifest path is located in and doing
`rustup toolchain install` if `rustup show` failed due to any reason

###
[`v2.0.9`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.9):
Release 2.0.9 - cargo-deny 0.18.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.8...v2.0.9)

-
[`d8395c1`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/commit/d8395c1)
removed the rustup update.

###
[`v2.0.8`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.8)

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.7...v2.0.8)

-
[PR#93](https://redirect.github.com/EmbarkStudios/cargo-deny-action/pull/93)
pins to a hash instead of tag, avoiding future breakage from eg. rustup
changes.

###
[`v2.0.7`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.7):
Release 2.0.7 - cargo-deny 0.18.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.6...v2.0.7)

-
[PR#92](https://redirect.github.com/EmbarkStudios/cargo-deny-action/pull/92)
fixed an issue introduced by the latest rustup release.

###
[`v2.0.6`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.6):
Release 2.0.6 - cargo-deny 0.18.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.5...v2.0.6)

##### Changed

-
[PR#746](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/746)
changed the directory naming of advisory databases,
[again](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/745),
so the name uses the last path component and a different, but also
stable, hashing algorithm. Eg. the default
`https://github.com/rustsec/advisory-db` will now be placed in
`$CARGO_HOME/advisory-dbs/advisory-db-3157b0e258782691`.
-
[PR#746](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/746)
changed the MSRV to 1.85.0 and uses edition 2024.

##### Fixed

-
[PR#746](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/746)
fixes an issue when using cargo 1.85.0 where source urls were not being
properly assigned to crates.io due to the constant being used no longer
matching the new path used in cargo 1.85.0 causing eg. workspace
dependency checks to fail.

###
[`v2.0.5`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.5):
Release 2.0.5 - cargo-deny 0.17.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.4...v2.0.5)

##### Changed

-
[PR#745](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/745)
updated `tame-index` to
[0.18.0](https://redirect.github.com/EmbarkStudios/tame-index/releases/tag/0.18.0)
so that cargo 1.85.0 is transparently supported along with older cargo
versions.
-
[PR#745](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/745)
now uses the same stable hashing as cargo 1.85.0 for the advisory
databases, which changes their path, but will notably now be the same
across all host platforms.

###
[`v2.0.4`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.4):
Release 2.0.4 - cargo-deny 0.16.3

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.3...v2.0.4)

- Update base image to rust 1.83.0 so that version 4 lockfiles are
supported with no config changes

###
[`v2.0.3`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.3):
Release 2.0.3 - cargo-deny 0.16.3

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.2...v2.0.3)

##### Changed

-
[PR#721](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/721)
updated `rust-version` to 1.81.0 to accurately reflect the minimum rust
version required to compile, resolving
[#&#8203;720](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/720).
-
[PR#722](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/722)
updated the SPDX license list to 3.25.0.

##### Fixed

-
[PR#726](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/726)
resolved
[#&#8203;725](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/725)
by adding the `unnecessary-skip` diagnostic, emitted when there is a
`skip` configured for a crate that only has one version in the graph.

###
[`v2.0.2`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.2):
Release 2.0.2 - cargo-deny 0.16.2

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2.0.1...v2.0.2)

##### Fixed

-
[PR#703](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/703)
resolved
[#&#8203;696](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/696)
by no longer emitting errors when failing to deserialize deprecated
fields, and removed some lingering documentation that wasn't removed in
[PR#611](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/611).
-
[PR#719](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/719)
updated to `krates` -> 0.17.5, fixing an issue where `cargo-deny` could
[panic](https://redirect.github.com/EmbarkStudios/krates/issues/97) due
to [incorrectly
resolving](https://redirect.github.com/EmbarkStudios/krates/issues/84)
features for different versions of the same crate referenced by a single
crate.
-
[PR#719](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/719)
resolved
[#&#8203;706](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/706)
by removing a warning issued when users use ignored scheme modifiers for
source urls.
-
[PR#719](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/719)
resolved
[#&#8203;718](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/718)
by updating the book with missing arguments.

##### Added

-
[PR#715](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/715)
resolved
[#&#8203;714](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/714)
by adding support for Edition 2024. Thanks
[@&#8203;kpcyrd](https://redirect.github.com/kpcyrd)!
-
[PR#710](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/710)
resolved
[#&#8203;708](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/708)
by allowing for unpublished workspace crates to be excluded from the
dependency graph that checks are run against, either via the
`--exclude-unpublished` CLI argument or the `graph.exclude-unpublished`
config field. Thanks
[@&#8203;Tastaturtaste](https://redirect.github.com/Tastaturtaste)!

##### Changed

-
[PR#711](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/711)
updated `goblin` -> 0.9.2
-
[PR#713](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/713)
updated various crates, notably `rustsec` -> 0.30.

###
[`v2.0.1`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.1):
Release 2.0.1 - cargo-deny 0.16.1

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v2...v2.0.1)

##### Fixed

-
[PR#691](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/691)
fixed an issue where workspace dependencies that used the current dir
'.' path component would incorrectly trigger the
`unused-workspace-dependency` lint.

###
[`v2.0.0`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v2.0.0):
Release 2.0.0 - cargo-deny 0.16.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.6.3...v2)

#### `Action`

##### Added

-
[PR#78](https://redirect.github.com/EmbarkStudios/cargo-deny-action/pull/78)
added SSH support, thanks
[@&#8203;nagua](https://redirect.github.com/nagua)!

##### Changed

- This release includes breaking changes in cargo-deny, so this release
begins the `v2` tag, using `v1` will be stable but not follow future
`cargo-deny` releases.

#### `cargo-deny`

##### Removed

-
[PR#681](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/681)
finished the deprecation introduced in
[PR#611](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/611),
making the usage of the deprecated fields into errors.

##### `[advisories]`

The following fields have all been removed in favor of denying all
advisories by default. To ignore an advisory the
[`ignore`](https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html#the-ignore-field-optional)
field can be used as before.

-   `vulnerability` - Vulnerability advisories are now `deny` by default
-   `unmaintained` - Unmaintained advisories are now `deny` by default
-   `unsound` - Unsound advisories are now `deny` by default
-   `notice` - Notice advisories are now `deny` by default
- `severity-threshold` - The severity of vulnerabilities is now
irrelevant

##### `[licenses]`

The following fields have all been removed in favor of denying all
licenses that are not explicitly allowed via either
[`allow`](https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html#the-allow-field-optional)
or
[`exceptions`](https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html#the-exceptions-field-optional).

- `unlicensed` - Crates whose license(s) cannot be confidently
determined are now always errors. The
[`clarify`](https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html#the-clarify-field-optional)
field can be used to help cargo-deny determine the license.
- `allow-osi-fsf-free` - The OSI/FSF Free attributes are now irrelevant,
only whether it is explicitly allowed.
- `copyleft` - The copyleft attribute is now irrelevant, only whether it
is explicitly allowed.
-   `default` - The default is now `deny`.
- `deny` - All licenses are now denied by default, this field added
nothing.

##### Changed

-
[PR#685](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/685)
follows up on
[PR#673](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/673),
moving the fields that were added to their own separate
[`bans.workspace-dependencies`](https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html#the-workspace-dependencies-field-optional)
section. This is an unannounced breaking change but is fairly minor and
0.15.0 was never released on github actions so the amount of people
affected by this will be (hopefully) small. This also makes the
workspace duplicate detection off by default since the field is
optional, *but* makes it so that if not specified workspace duplicates
are now `deny` instead of `warn`.

##### Fixed

-
[PR#685](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/685)
resolved
[#&#8203;682](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/682)
by adding the `include-path-dependencies` field, allowing path
dependencies to be ignored if it is `false`.

###
[`v1.6.3`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.6.3):
Release 1.6.3 - cargo-deny 0.14.21

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.6.2...v1.6.3)

##### Fixed

-
[PR#643](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/643)
resolved
[#&#8203;629](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/629)
by making the hosted git (github, gitlab, bitbucket) org/user name
comparison case-insensitive. Thanks
[@&#8203;pmnlla](https://redirect.github.com/pmnlla)!
-
[PR#649](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/649)
fixed an issue where depending on the same crate multiple times by using
different `cfg()/triple` targets could cause features to be resolved
incorrectly and thus crates to be not pulled into the graph used for
checking.

#### \[0.14.20] - 2024-03-23

##### Fixed

-
[PR#642](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/642)
resolved
[#&#8203;641](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/641)
by pinning `gix-transport` (and its unique dependencies) to 0.41.2 as a
workaround for `cargo install` not using the lockfile. See [this
issue](https://redirect.github.com/Byron/gitoxide/issues/1328) for more
information.

###
[`v1.6.2`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.6.2):
Release 1.6.2 - cargo-deny 0.14.19

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.6.1...v1.6.2)

##### Changed

-
[PR#639](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/639)
updated tame-index to avoid an error if you don't used `--locked`.

#### \[0.14.18] - 2024-03-21

##### Fixed

-
[PR#638](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/638)
resolved
[#&#8203;636](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/636)
by updating `krates`.

#### \[0.14.17] - 2024-03-17

##### Changed

-
[PR#631](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/631)
improved the diagnostic for when the yank check fails due to some issue
with retrieving or reading the index information.
-
[PR#633](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/633)
updated `gix` -> 0.60.

###
[`v1.6.1`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.6.1)

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.6.0...v1.6.1)

##### Fixed

-
[PR#626](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/626)
resolved
[#&#8203;625](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/625)
by explicitly checking that a license identified as Pixar was actually
(probably) the Pixar license, instead of a normal Apache-2.0 license.

###
[`v1.6.0`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.6.0)

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.15...v1.6.0)

#### action changes

- Color output is now always enabled so that colors show up in the
action output.

#### 0.14.15

##### Added

-
[PR#618](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/618)
added metadata notes to diagnostics when a license is rejected, as well
as removing span information for accepted licenses unless the log level
is `info` or higher to make the diagnostic clearer by default.

#### 0.14.14

##### Fixed

-
[PR#617](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/617)
resolved
[#&#8203;576](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/576)
by updating the SPDX license list to 3.23.

#### 0.14.13

##### Fixed

-
[PR#615](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/615)
fixed an issue introduced in
[PR#605](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/605)
where the various `bans` diagnostic codes could not have their lint
level changed via the CLI. It also introduced the `deprecated`
diagnostic code.

#### 0.14.12

##### Changed

-
[PR#605](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/605)
did a major refactor of configuration, both how it is deserialized and
changing (hopefully improving) many options.
-
[PR#605](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/605)
moved `targets`, `exclude`, `all-features`, `features`,
`no-default-features`, and `exclude` into the `[graph]` table.
-
[PR#605](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/605)
moved `feature-depth` into the `[output]` table.

##### Added

-
[PR#613](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/613)
added support for [basic shell
expansion](https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html#the-db-path-field-optional)
to `advisories.db-path`, which expands support beyond just `~` to
include environment variable expansion.

##### Fixed

-
[PR#601](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/601)
resolved
[#&#8203;600](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/600)
by outputting the correct spans when a license was both allowed and
denied.
-
[PR#605](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/605)
resolved
[#&#8203;264](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/264)
be replacing `toml` and `serde` with `toml-span`.
-
[PR#605](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/605)
resolved
[#&#8203;539](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/539)
by simplifying the very common `name = "<crate_name>", version =
"<requirements>"` used to target specific crates into either a plain
[package spec
string](https://embarkstudios.github.io/cargo-deny/checks/cfg.html#string-format)
or the simpler `crate = "<package spec>"`.
-
[PR#605](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/605)
resolved
[#&#8203;578](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/578)
by adding a `reason = "<reason>"` field to *many* fields within the
configuration that are provided in diagnostics. `[bans.deny]` also has
an additional `use-instead = "<url/crate_name>"`.
[PR#610](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/610)
did this for the `advisories.ignore` field.
-
[PR#605](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/605)
resolved
[#&#8203;579](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/579)
by allowing yanked crates to be ignored by specifying a
[PackageSpec](https://embarkstudios.github.io/cargo-deny/checks/cfg.html#package-specs)
in the `[advisories.ignore]` array.

##### Deprecated

-
[PR#606](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/606)
and
[PR#611](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/611)
together deprecated several fields listed below. See
[PR#611](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/611)
for how to change your config to opt-in to the new behavior that will
become the default when the deprecated fields are removed in a future
minor version.
    -   `[advisories]`
        -   `vulnerability`
        -   `unmaintained`
        -   `unsound`
        -   `notice`
        -   `severity-threshold`
    -   `[licenses]`
        -   `unlicensed`
        -   `allow-osi-fsf-free`
        -   `copyleft`
        -   `default`
        -   `deny`

###
[`v1.5.15`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.15):
Release 1.5.15 - cargo-deny 0.14.11

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.14...v1.5.15)

##### Fixed

- Resolved
[https://github.com/EmbarkStudios/cargo-deny-action/issues/71](https://redirect.github.com/EmbarkStudios/cargo-deny-action/issues/71)
that was introduced in the previous release.

###
[`v1.5.14`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.14):
Release 1.5.14 - cargo-deny 0.14.11

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.13...v1.5.14)

##### Added

- Added the `manifest-path` key as a shorthand for doing `arguments:
--manifest-path <path>`

###
[`v1.5.13`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.13):
Release 1.5.13 - cargo-deny 0.14.11

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.12...v1.5.13)

##### Fixed

-
[PR#599](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/599)
resolved
[#&#8203;488](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/488)
by treating git and path sources differently. Thanks
[@&#8203;kpreid](https://redirect.github.com/kpreid)!

###
[`v1.5.12`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.12):
Release 1.5.12 - cargo-deny 0.14.10

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.11...v1.5.12)

##### Fixed

-
[PR#596](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/596)
updated `krates` *again* to pull in
[krates#77](https://redirect.github.com/EmbarkStudios/krates/pull/77).

###
[`v1.5.11`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.11):
Release 1.5.11 - cargo-deny 0.14.9

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.10...v1.5.11)

##### Fixed

-
[PR#594](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/594)
updated `krates` *again* to pull in
[krates#75](https://redirect.github.com/EmbarkStudios/krates/pull/75).

###
[`v1.5.10`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.10):
Release 1.5.10 - cargo-deny 0.14.8

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.9...v1.5.10)

##### Fixed

-
[PR#592](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/592)
updated `krates` *again* to pull in
[krates#73](https://redirect.github.com/EmbarkStudios/krates/pull/73).

###
[`v1.5.9`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.9):
Release 1.5.9 - cargo-deny 0.14.7

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.8...v1.5.9)

##### Fixed

-
[PR#591](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/591)
updated `krates` *again* to pull in
[krates#71](https://redirect.github.com/EmbarkStudios/krates/pull/71).

###
[`v1.5.8`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.8):
Release 1.5.8 - cargo-deny 0.14.6

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.7...v1.5.8)

##### Fixed

-
[PR#590](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/590)
updated `krates` to fix an issue with crates that directly have a
dependency on 2 or more versions of the same crate.

##### Added

-
[PR#590](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/590)
resolved
[#&#8203;405](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/405)
by emitting warnings when a `wrapper` crate for a banned crate does not
have a dependency on that crate.

##### Changed

-
[PR#591](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/591)
updated `gix` and `tame-index`.

###
[`v1.5.7`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.7):
Release 1.5.7 - cargo-deny 0.14.5

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.6...v1.5.7)

##### Fixed

-
[PR#588](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/588)
resolved an issue introduced in \[0.14.4] where features that reference
dev-only dependencies in non-workspace crates would cause a
[panic](https://redirect.github.com/EmbarkStudios/krates/issues/66).

###
[`v1.5.6`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.6):
Release 1.5.6 - cargo-deny 0.14.4

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.5...v1.5.6)

##### Fixed

-
[PR#586](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/586)
resolved 2 issues with crate graph creation, see
[krates#60](https://redirect.github.com/EmbarkStudios/krates/issues/60)
and
[krates#64](https://redirect.github.com/EmbarkStudios/krates/issues/64)
for more details.

###
[`v1.5.5`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.5):
Release 1.5.5 - cargo-deny 0.14.2

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.4...v1.5.5)

##### Added

-
[PR#545](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/545)
added the ability to specify additional license exceptions via
[additional configuration
files](https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html#additional-exceptions-configuration-file).
-
[PR#549](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/549)
added the
[`bans.build`](https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html#the-build-field-optional)
configuration option, opting in to checking for [file
extensions](https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html#the-script-extensions-field-optional),
[native
executables](https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html#the-executables-field-optional),
and [interpreted
scripts](https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html#the-interpreted-field-optional).
This resolved
[#&#8203;43](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/43).

##### Changed

-
[PR#557](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/557)
introduced changes to how
[`dev-dependencies`](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#development-dependencies)
are handled. By default, crates that are only used as dev-dependencies
(ie, there are no normal nor build dependency edges linking them to
other crates) will no longer be considered when checking for
[`multiple-versions`](https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html#the-multiple-versions-field-optional)
violations. This can be re-enabled via the
[`bans.multiple-versions-include-dev`](https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html#the-multiple-versions-include-dev-field-optional)
config field. Additionally, licenses are no longer checked for
`dev-dependencies`, but can be re-enabled via
[`licenses.include-dev`](https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html#the-include-dev-field-optional)
the config field. `dev-dependencies` can also be completely disabled
altogether, but this applies to all checks, including `advisories` and
`sources`, so is not enabled by default. This behavior can be enabled by
using the
[`exclude-dev`](https://embarkstudios.github.io/cargo-deny/checks/cfg.html#the-exclude-dev-field-optional)
field, or the `--exclude-dev` command line flag. This change resolved
[#&#8203;322](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/322),
[#&#8203;329](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/329),
[#&#8203;413](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/413)
and
[#&#8203;497](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/497).

##### Fixed

-
[PR#549](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/549)
fixed
[#&#8203;548](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/548)
by correctly locating cargo registry indices from an git ssh url.
-
[PR#549](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/549)
fixed
[#&#8203;552](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/552)
by correctly handling signal interrupts and removing the advisory-dbs
lock file.
-
[PR#549](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/549)
fixed
[#&#8203;553](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/553)
by adding the `native-certs` feature flag that can enable the OS native
certificate store.

##### Deprecated

-
[PR#549](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/549)
moved `bans.allow-build-scripts` to
[`bans.build.allow-build-scripts`](https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html#the-allow-build-scripts-field-optional).
`bans.allow-build-scripts` is still supported, but emits a warning.

###
[`v1.5.4`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.4):
Release 1.5.4 - cargo-deny 0.14.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.3...v1.5.4)

Updated the cargo version to 1.71.0 which should give significant
improvements to run times due to using the crates.io sparse index
instead of the old git index.

###
[`v1.5.3`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.3):
Release 1.5.3 - cargo-deny 0.14.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.2...v1.5.3)

##### Changed

- [PR#520] resolved
[#&#8203;522](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/522)
by completely removing all dependencies upon `git2` and `openssl`. This
was done by transitioning from `git2` -> `gix` for all git operations,
both directly in this crate, as well as replacing
[`crates-index`](https://redirect.github.com/frewsxcv/rust-crates-index)
with
[`tame-index`](https://redirect.github.com/EmbarkStudios/tame-index).
-   [PR#520] bumped the MSRV from `1.65.0` -> `1.70.0`
-
[PR#523](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/523)
added "(try `cargo update -p <crate_name>`)" when an advisory is
detected for a crate. Thanks
[@&#8203;Victor-N-Suadicani](https://redirect.github.com/Victor-N-Suadicani)!

##### Fixed

- [PR#520] resolved
[#&#8203;361](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/361)
by printing output when a fetch is being performed to clarify what is
taking time.
- [PR#520] (possibly) resolved
[#&#8203;435](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/435)
by switching all git operations from `git2` to `gix`.
- [PR#520] resolved
[#&#8203;439](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/439)
by using minimal refspecs for cloning and fetching all remote git
repositories (indices or advisory databases) where only the remote HEAD
is needed to update the local repository, regardless of the default
remote branch pointed to by HEAD.
- [PR#520] resolved
[#&#8203;446](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/446)
by ensuring (and testing) that crates from non-registry sources are not
checked for advisories, eg. in the case that a local crate is named and
versioned the same as a crate from crates.io that has an advisory that
affects it.
- [PR#520] resolved
[#&#8203;515](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/515)
by always opening the correct registry index based upon the environment.
-
[PR#531](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/531)
resolved
[#&#8203;210](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/210)
by adding `osi` and `fsf` options to `licenses.allow-osi-fsf-free`.
Thanks [@&#8203;zkxs](https://redirect.github.com/zkxs)!
-
[PR#533](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/533)
resolved
[#&#8203;521](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/521)
and
[#&#8203;524](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/524)
by allowing clarifications to add files that are used to verify the
license information is up to date, rather than needing to match one of
the license files that was discovered.
-
[PR#534](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/534)
resolved
[#&#8203;479](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/479)
by improving how advisory databases are cloned and/or fetched, notably
each database now uses `gix`'s [file-based
locking](https://docs.rs/gix-lock/7.0.2/gix_lock/struct.Marker.html#method.acquire_to_hold_resource)
to ensure that only one process has mutable access to an advisory
database repo at a time.

##### Removed

- [PR#520] removed all features, notably `standalone`. This is due to
cargo still being in transition from `git2` -> `gix` and having no way
to compiled *without* OpenSSL. Once cargo is a better state with regards
to this we can add back that feature.

[PR#520]: https://redirect.github.com/EmbarkStudios/cargo-deny/pull/520

###
[`v1.5.2`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.2):
Release 1.5.2 - cargo-deny 0.13.9

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.1...v1.5.2)

##### Fixed

-
[PR#506](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/506)
replaced `atty` (unmaintained) with `is-terminal`. Thanks
[@&#8203;tottoto](https://redirect.github.com/tottoto)!
-
[PR#511](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/511)
resolved
[#&#8203;494](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/494),
[#&#8203;507](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/507),
and
[#&#8203;510](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/510)
by fixing up how and when urls are normalized.
-
[PR#512](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/512)
resolved
[#&#8203;509](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/509)
by fixing casing of the root configuration keys.
-
[PR#513](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/513)
resolved
[#&#8203;508](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/508)
by correctly using the crates.io sparse index when checking for yanked
crates if specified by the user, as well as falling back to the regular
git index if the sparse index is not present.

###
[`v1.5.1`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.1):
Release 1.5.1 - cargo-deny 0.13.8

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.5.0...v1.5.1)

##### Added

-
[PR#504](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/504)
(though really
[PR#365](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/365))
resolved
[#&#8203;350](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/350)
by adding the `deny-multiple-versions` field to `bans.deny` entries,
allowing specific crates to deny multiple versions while
allowing/warning on them more generally. Thanks
[@&#8203;leops](https://redirect.github.com/leops)!
-
[PR#493](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/493)
resolved
[#&#8203;437](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/437)
by also looking for deny configuration files in `.cargo`. Thanks
[@&#8203;DJMcNab](https://redirect.github.com/DJMcNab)!
-
[PR#502](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/502)
resolved
[#&#8203;500](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/500)
by adding initial support for [sparse
indices](https://blog.rust-lang.org/inside-rust/2023/01/30/cargo-sparse-protocol.html).

##### Fixed

-
[PR#503](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/503)
resolved
[#&#8203;498](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/498)
by falling back to more lax parsing of the SPDX expression of crate if
fails to parse according to the stricter but more correct rules.

###
[`v1.5.0`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.5.0):
Release 1.5.0 - cargo-deny 0.13.7

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.4.0...v1.5.0)

Update from cargo-deny 0.13.5 to 0.13.7, apparently I missed two
releases, that's embarrassing.

#### 0.13.7

##### Fixed

-
[PR#491](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/491)
resolved
[#&#8203;490](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/490)
by building libgit2 from vendored sources instead of relying on
potentially outdated packages.

#### 0.13.6

##### Changed

-
[PR#489](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/489)
updated dependencies, notably `clap`, `cargo`, and `git2`

##### Added

-
[PR#485](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/485)
added this project and repository to our Security Bug Bounty Program and
has Private vulnerability reporting enabled. See
[`SECURITY.md`](./SECURITY.md) for more details.
-
[PR#487](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/487)
added `allow-wildcard-paths`, fixing
[#&#8203;488](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/448)
by allowing wildcards to be denied, but allowing them for internal,
private crates. Thanks [@&#8203;sribich](https://giqthub.com/sribich)!

##### Fixed

-
[PR#489](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/489)
fixed an issue where git sources where `branch=master` would be
incorrectly categorized as not specifying the branch (ie use HEAD of
default branch).

###
[`v1.4.0`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.4.0):
Release 1.4.0 - cargo-deny 0.13.5

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.3.2...v1.4.0)

##### Changed

-   Updated to cargo-deny 0.13.5

###
[`v1.3.2`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.3.2):
- cargo-deny 0.12.1

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.3.1...v1.3.2)

##### Added

- [PR#54](https://redirect.github.com/PR/cargo-deny-action/issues/54)
resolved
[#&#8203;53](https://redirect.github.com/EmbarkStudios/cargo-deny-action/issues/53)
by adding the `credentials` parameter for passing in a private access
token to allow cargo to fetch private github repositories. Thanks
[@&#8203;danielhaap83](https://redirect.github.com/danielhaap83)!

###
[`v1.3.1`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.3.1):
- cargo-deny 0.12.1

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.3.0...v1.3.1)

##### Fixed

-
[PR#426](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/426)
fixed an oversight in
[PR#422](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/422),
fully resolving
[#&#8203;412](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/412)
by allowing both `https` and `ssh` URLs for advisory databases. Thanks
[@&#8203;jbg](https://redirect.github.com/jbg)!

##### Changed

-
[PR#427](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/427)
updated dependencies.

###
[`v1.3.0`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.3.0):
- cargo-deny 0.12.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.17...v1.3.0)

##### Removed

-
[PR#423](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/423)
removed the `fix` subcommand. This functionality was far too complicated
for far too little benefit.

##### Fixed

-
[PR#420](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/420)
resolved
[#&#8203;388](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/388)
by adding the ability to fetch advisory databases via the `git` CLI.
Thanks [@&#8203;danielhaap83](https://redirect.github.com/danielhaap83)!
-
[PR#422](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/422)
fixed
[#&#8203;380](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/380)
and
[#&#8203;410](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/410)
by updating a few transitive dependencies that use `git2`, as well as
removing the usage of `rustsec`'s `git` feature so that we now use `git2
v0.14`, resolving a crash issue in new `libgit2` versions available in
eg. rolling release distros such as Arch. This should also make it
easier to update and improve git related functionality since more of it
is inside cargo-deny itself now.
-
[PR#424](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/424)
*really* fixed (there's even a test now!)
[#&#8203;384](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/384)
by adding each version's reverse dependency graph in the ascending
order.

###
[`v1.2.17`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.17):
- cargo-deny 0.11.4

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.16...v1.2.17)

#### Changed

-
[PR#51](https://redirect.github.com/EmbarkStudios/cargo-deny-action/pull/51)
updated the image to use Rust 1.60.0 by default. Thanks
[@&#8203;MarcoIeni](https://redirect.github.com/MarcoIeni)!

###
[`v1.2.16`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.16):
- cargo-deny 0.11.4

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.15...v1.2.16)

#### Added

-
[PR#49](https://redirect.github.com/EmbarkStudios/cargo-deny-action/pull/49)
added the `command-arguments` option to the action. Thanks
[@&#8203;ryo33](https://redirect.github.com/ryo33)!

###
[`v1.2.15`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.15):
- cargo-deny 0.11.3

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.14...v1.2.15)

##### Fixed

- Accidentally change how arguments were forwarded to cargo-deny which
broken more complicated invocations

###
[`v1.2.14`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.14):
- cargo-deny 0.11.3

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.13...v1.2.14)

##### Added

- Added `git` to the image, resolving
[#&#8203;40](https://redirect.github.com/EmbarkStudios/cargo-deny-action/issues/40)

###
[`v1.2.13`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.13):
- cargo-deny 0.11.3

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.12...v1.2.13)

##### Changed

- Added the `rust-version` github actions variable, allowing you to
specify a specific cargo version to use when running cargo-deny,
including nightly, or other unstable versions.

###
[`v1.2.12`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.12):
- cargo-deny 0.11.3

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.11...v1.2.12)

##### Fixed

-
[PR#407](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/407)
resolved
[#&#8203;406](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/406)
by always checking license exceptions first.

###
[`v1.2.11`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.10...v1.2.11)

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.10...v1.2.11)

###
[`v1.2.10`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.10):
- cargo-deny 0.11.1

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.9...v1.2.10)

##### Added

-
[PR#391](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/391)
resolved
[#&#8203;344](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/344)
by adding `[licenses.ignore-sources]` to ignore license checking for
crates sourced from 1 or more specified registries. Thanks
[@&#8203;ShellWowza](https://redirect.github.com/ShellWowza)!
-
[PR#396](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/396)
resolved
[#&#8203;366](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/366)
by also looking for `.deny.toml` in addition to `deny.toml` if a config
file is not specified.

##### Changed

-
[PR#392](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/392)
updated all dependencies.

##### Fixed

-
[PR#393](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/393)
resolved
[#&#8203;371](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/371)
by changing the default for version requirements specified in config
files to accept all versions, rather than using the almost-but-not-quite
default of `*`.
-
[PR#394](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/394)
resolved
[#&#8203;147](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/147)
by ignore *all* private crates, not only the ones in the workspace.
-
[PR#395](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/395)
resolved
[#&#8203;375](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/375)
by fixing a potential infinite loop when using `[bans.skip-tree]`.

###
[`v1.2.9`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.9):
- cargo-deny 0.11.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.8...v1.2.9)

Fixed image to use proper tag.

###
[`v1.2.8`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.8):
- cargo-deny 0.11.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.7...v1.2.8)

Updated the cargo version in the image to 1.57.0 to allow for the use of
[custom
profiles](https://doc.rust-lang.org/cargo/reference/profiles.html#custom-profiles).

###
[`v1.2.7`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.7):
v1.2.6 - cargo-deny 0.11.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.6...v1.2.7)

#### \[0.11.0] - 2021-12-06

##### Changed

-
[PR#382](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/382)
updated dependencies and bumped the Minimum Stable Rust Version to
**1.56.1**.

#### \[0.10.3] - 2021-11-22

##### Changed

-
[PR#379](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/379)
updated `askalono` which got rid of the `failure` dependency, which was
pulling in a lot of additional crates that are now gone.

##### Fixed

-
[PR#379](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/379)
fixed
[#&#8203;378](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/378)
which was an edge case where the `sources` check was executed against a
crate that didn't use any crates from crates.io, and the config file was
shorter than the crates.io URL.

#### \[0.10.2] - 2021-11-21

##### Fixed

-
[PR#376](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/376)
fixed the JSON formatting when using `--format json` output option.
Thanks [@&#8203;dnaka91](https://redirect.github.com/dnaka91)!

##### Changed

-
[PR#377](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/377)
updated dependencies.

#### \[0.10.1] - 2021-11-10

##### Fixed

-
[PR#347](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/374)
resolved
[#&#8203;372](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/372)
by correcting a slight mistake that resulted in an incorrect hash making
cargo-deny unable to lookup index or crate information from the local
file system.

#### \[0.10.0] - 2021-10-29

##### Added

-
[PR#353](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/353)
resolved
[#&#8203;351](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/351)
by adding the `sources.private` field to blanket allow git repositories
sourced from a particular url.
-
[PR#359](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/359)
resolved
[#&#8203;341](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/341)
and
[#&#8203;357](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/357)
by adding support for the [`--frozen`, `--locked`, and
`--offline`](https://doc.rust-lang.org/cargo/commands/cargo-metadata.html#manifest-options)
flags to determine whether network access is allowed, and whether the
`Cargo.lock` file can be created and/or modified.
-
[PR#368](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/368)
added the `licenses.unused-allowed-license` field to control whether the
[L006 - license was not
encountered](https://embarkstudios.github.io/cargo-deny/checks/licenses/diags.html#l006---license-was-not-encountered)
diagnostic. Thanks [@&#8203;thomcc](https://redirect.github.com/thomcc)!

##### Changed

-
[PR#358](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/358)
bumped the Minimum Stable Rust Version to **1.53.0**.
-
[PR#358](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/358)
bumped various dependencies, notably `semver` to `1.0.3`.

#### \[0.9.1] - 2021-03-26

##### Changed

-   Updated dependencies

###
[`v1.2.6`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.6):
Release 1.2.6 - cargo-deny 0.9.1

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.5...v1.2.6)

##### Changed

-   Updated dependencies

###
[`v1.2.5`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.5):
- cargo-deny 0.9.0

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.4...v1.2.5)

##### Changed

- Updated `krates`, which in turn uses an updated `cargo_metadata` which
uses [`camino`](https://docs.rs/camino) for utf-8 paths. Rather than
support both vanilla Path/Buf and Utf8Path/Buf, cargo-deny now just uses
Utf8Path/Buf, which means that non-utf-8 paths for things like your
Cargo.toml manifest or license paths will no longer function. This is a
breaking change, that can be reverted if it disruptive for users, but
the assumption is that cargo-deny is operating on normal checkouts of
rust repositories that are overwhelmingly going to be utf-8 compatible
paths.

###
[`v1.2.4`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.4):
Update image

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.3...v1.2.4)

Updates the base image to rust 1.50.0 to fix issue if you pin to it via
eg rust-toolchain.

###
[`v1.2.3`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.3):
- cargo-deny 0.8.5

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.2...v1.2.3)

##### Added

-
[PR#315](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/315)
resolved
[#&#8203;312](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/312)
by adding support for excluding packages in the deny configuration file,
in addition to the existing support for the `--exclude` CLI option.
Thanks [@&#8203;luser](https://redirect.github.com/luser)!

##### Fixed

-
[PR#318](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/318)
fixed
[#&#8203;316](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/316)
by adding a workaround for crate versions with pre-release identifiers
in them that could be erroneously marked as matching advisories in an
advisory database. Thanks for reporting this
[@&#8203;djc](https://redirect.github.com/djc)!

###
[`v1.2.2`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.2):
- cargo-deny 0.8.4

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.2.1...v1.2.2)

##### Changed

-   Updated dependencies, notably `rustsec`, `crossbeam`\*, and `cargo`.
-   Bumped the Minimum Stable Rust Version to **1.44.1**.

###
[`v1.2.1`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/v1.2.1):
- cargo-deny 0.8.1

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/1.2.0...v1.2.1)

Updates cargo-deny from 0.7.3 -> 0.8.1

##### Added

-
[PR#238](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/238)
resolved
[#&#8203;225](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/225)
by adding a `wrappers` field to `[bans.deny]` entries, which allows the
banned crate to be used only if it is a direct dependency of one of the
wrapper crates. Thanks
[@&#8203;Stupremee](https://redirect.github.com/Stupremee)!
-
[PR#244](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/244)
resolved
[#&#8203;69](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/69)
by adding support for multiple advisory databases, which will all be
checked during the `advisory` check. Thanks
[@&#8203;Stupremee](https://redirect.github.com/Stupremee)!
-
[PR#243](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/243)
resolved
[#&#8203;54](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/54)
by adding support for compiling and using `cargo` crate directly via the
`standalone` feature. This allows `cargo-deny` to be used without cargo
being installed, but it still requires
[**rustc**](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/295)
to be available. Thanks
[@&#8203;Stupremee](https://redirect.github.com/Stupremee)!
-
[PR#275](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/275)
resolved
[#&#8203;64](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/64)
by adding a diagnostic when a user tries to ignore an advisory
identifier that doesn't exist in any database.
-
[PR#262](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/262)
added the `fix` subcommand, which was added to bring `cargo-deny` to
feature parity with `cargo-audit` so that it can take over for
`cargo-audit` as the [official
frontend](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/194)
for the the [RustSec Advisory
Database](https://redirect.github.com/RustSec/advisory-db).

##### Changed

- `advisories.db-url` has been deprecated in favor of
`advisories.db-urls` since multiple databses are now supported.
- `advisories.db-path` is now no longer the directory into which the
advisory database is cloned into, but rather a root directory where each
unique database is placed in a canonicalized directory similar to how
`.cargo/registry/index` directories work.
-
[PR#274](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/274)
resolved
[#&#8203;115](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/115)
by normalizing git urls. Thanks
[@&#8203;senden9](https://redirect.github.com/senden9)!

##### Fixed

-
[#&#8203;265](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/265)
A transitive dependency (`smol_str`) forced the usage of the latest Rust
stable version (1.46) which was unintended. We now state the MSRV in the
README and check for it in CI so that changing the MSRV is a conscious
decision.
-
[PR#287](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/287)
fixed
[#&#8203;286](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/286),
which could happen if using a git source where the representation
differed slightly between the user specified id and the id used for
dependencies.
-
[PR#249](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/249)
fixed
[#&#8203;190](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/190)
by printing a different diagnostic for when the path specified for a
clarification license file could not be found. Thanks
[@&#8203;khodzha](https://redirect.github.com/khodzha)!
-
[PR#297](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/297)
fixed a couple of diagnostics to have codes.
-
[PR#296](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/296)
resolved
[#&#8203;288](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/288)
by improving the information in diagnostics pertaining to advisories.
Thanks [@&#8203;tomasfarias](https://redirect.github.com/tomasfarias)!

###
[`v1.2.0`](https://redirect.github.com/EmbarkStudios/cargo-deny-action/releases/tag/1.2.0):
- cargo-deny 0.8.1

[Compare
Source](https://redirect.github.com/EmbarkStudios/cargo-deny-action/compare/v1.1.0...1.2.0)

Updates cargo-deny from 0.7.3 -> 0.8.1

##### Added

-
[PR#238](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/238)
resolved
[#&#8203;225](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/225)
by adding a `wrappers` field to `[bans.deny]` entries, which allows the
banned crate to be used only if it is a direct dependency of one of the
wrapper crates. Thanks
[@&#8203;Stupremee](https://redirect.github.com/Stupremee)!
-
[PR#244](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/244)
resolved
[#&#8203;69](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/69)
by adding support for multiple advisory databases, which will all be
checked during the `advisory` check. Thanks
[@&#8203;Stupremee](https://redirect.github.com/Stupremee)!
-
[PR#243](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/243)
resolved
[#&#8203;54](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/54)
by adding support for compiling and using `cargo` crate directly via the
`standalone` feature. This allows `cargo-deny` to be used without cargo
being installed, but it still requires
[**rustc**](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/295)
to be available. Thanks
[@&#8203;Stupremee](https://redirect.github.com/Stupremee)!
-
[PR#275](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/275)
resolved
[#&#8203;64](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/64)
by adding a diagnostic when a user tries to ignore an advisory
identifier that doesn't exist in any database.
-
[PR#262](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/262)
added the `fix` subcommand, which was added to bring `cargo-deny` to
feature parity with `cargo-audit` so that it can take over for
`cargo-audit` as the [official
frontend](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/194)
for the the [RustSec Advisory
Database](https://redirect.github.com/RustSec/advisory-db).

##### Changed

- `advisories.db-url` has been deprecated in favor of
`advisories.db-urls` since multiple databses are now supported.
- `advisories.db-path` is now no longer the directory into which the
advisory database is cloned into, but rather a root directory where each
unique database is placed in a canonicalized directory similar to how
`.cargo/registry/index` directories work.
-
[PR#274](https://redirect.github.com/EmbarkStudios/cargo-deny/pull/274)
resolved
[#&#8203;115](https://redirect.github.com/EmbarkStudios/cargo-deny/issues/115)
by normalizing git urls. Thanks
[@&#8203;senden9](https://redirect.github.com/senden9)!

##### Fixe

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/astral-sh/uv).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4yNTcuMyIsInVwZGF0ZWRJblZlciI6IjM5LjI1Ny4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJpbnRlcm5hbCJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-28 10:56:57 +02:00

2260 lines
78 KiB
YAML

name: CI
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
CARGO_INCREMENTAL: 0
CARGO_NET_RETRY: 10
CARGO_TERM_COLOR: always
RUSTUP_MAX_RETRIES: 10
PYTHON_VERSION: "3.12"
jobs:
determine_changes:
name: "Determine changes"
runs-on: ubuntu-latest
outputs:
# Flag that is raised when any code is changed
code: ${{ steps.changed.outputs.code_any_changed }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- name: "Determine changed files"
id: changed
shell: bash
run: |
CHANGED_FILES=$(git diff --name-only ${{ github.event.pull_request.base.sha || 'origin/main' }}...HEAD)
CODE_CHANGED=false
while IFS= read -r file; do
# Generated markdown and JSON files are checked during test runs.
if [[ "${file}" =~ ^docs/ && ! "${file}" =~ ^docs/reference/(cli|settings).md && ! "${file}" =~ ^docs/configuration/environment.md ]]; then
echo "Skipping ${file} (matches docs/ pattern)"
continue
fi
if [[ "${file}" =~ ^mkdocs.*\.yml$ ]]; then
echo "Skipping ${file} (matches mkdocs*.yml pattern)"
continue
fi
if [[ "${file}" =~ \.md$ ]]; then
echo "Skipping ${file} (matches *.md pattern)"
continue
fi
if [[ "${file}" =~ ^bin/ ]]; then
echo "Skipping ${file} (matches bin/ pattern)"
continue
fi
if [[ "${file}" =~ ^assets/ ]]; then
echo "Skipping ${file} (matches assets/ pattern)"
continue
fi
echo "Detected code change in: ${file}"
CODE_CHANGED=true
break
done <<< "${CHANGED_FILES}"
echo "code_any_changed=${CODE_CHANGED}" >> "${GITHUB_OUTPUT}"
lint:
timeout-minutes: 10
name: "lint"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: 3.12
- name: "Install Rustfmt"
run: rustup component add rustfmt
- name: "Install uv"
uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0
- name: "rustfmt"
run: cargo fmt --all --check
- name: "Prettier"
run: |
npx prettier --check "**/*.{json5,yaml,yml}"
npx prettier --prose-wrap always --check "**/*.md"
- name: "README check"
run: python scripts/transform_readme.py --target pypi
- name: "Python format"
run: uvx ruff format --diff .
- name: "Python lint"
run: uvx ruff check .
- name: "Python type check"
run: uvx mypy
- name: "Validate project metadata"
run: uvx --from 'validate-pyproject[all,store]' validate-pyproject pyproject.toml
- name: "Lint shell scripts"
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0
env:
# renovate: datasource=github-tags depName=koalaman/shellcheck
SHELLCHECK_VERSION: "v0.10.0"
SHELLCHECK_OPTS: --shell bash
with:
version: ${{ env.SHELLCHECK_VERSION }}
severity: style
check_together: "yes"
cargo-clippy:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: ubuntu-latest
name: "cargo clippy | ubuntu"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
with:
save-if: ${{ github.ref == 'refs/heads/main' }}
- name: "Check uv_build dependencies"
uses: EmbarkStudios/cargo-deny-action@34899fc7ba81ca6268d5947a7a16b4649013fea1 # v2.0.11
with:
command: check bans
manifest-path: crates/uv-build/Cargo.toml
- name: "Install Rust toolchain"
run: rustup component add clippy
- name: "Clippy"
run: cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
cargo-clippy-windows:
timeout-minutes: 15
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: windows-latest
name: "cargo clippy | windows"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup Dev Drive
run: ${{ github.workspace }}/.github/workflows/setup-dev-drive.ps1
# actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
- name: Copy Git Repo to Dev Drive
run: |
Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.UV_WORKSPACE }}" -Recurse
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
with:
workspaces: ${{ env.UV_WORKSPACE }}
- name: "Install Rust toolchain"
run: rustup component add clippy
- name: "Clippy"
working-directory: ${{ env.UV_WORKSPACE }}
run: cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
cargo-dev-generate-all:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: ubuntu-latest
name: "cargo dev generate-all"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
with:
save-if: ${{ github.ref == 'refs/heads/main' }}
- name: "Generate all"
run: cargo dev generate-all --mode check
cargo-shear:
timeout-minutes: 10
name: "cargo shear"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install cargo shear"
uses: taiki-e/install-action@ab3728c7ba6948b9b429627f4d55a68842b27f18 # v2
with:
tool: cargo-shear
- run: cargo shear
# We use the large GitHub actions runners
# For Ubuntu and Windows, this requires Organization-level configuration
# See: https://docs.github.com/en/actions/using-github-hosted-runners/about-larger-runners/about-larger-runners#about-ubuntu-and-windows-larger-runners
cargo-test-linux:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: depot-ubuntu-22.04-16
name: "cargo test | ubuntu"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- name: "Install Rust toolchain"
run: rustup show
- uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0
- name: "Install required Python versions"
run: uv python install
- name: "Install cargo nextest"
uses: taiki-e/install-action@ab3728c7ba6948b9b429627f4d55a68842b27f18 # v2
with:
tool: cargo-nextest
- name: "Cargo test"
run: |
cargo nextest run \
--features python-patch \
--workspace \
--status-level skip --failure-output immediate-final --no-fail-fast -j 20 --final-status-level slow
cargo-test-macos:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: macos-latest-xlarge # github-macos-14-aarch64-6
name: "cargo test | macos"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- name: "Install Rust toolchain"
run: rustup show
- uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0
- name: "Install required Python versions"
run: uv python install
- name: "Install cargo nextest"
uses: taiki-e/install-action@ab3728c7ba6948b9b429627f4d55a68842b27f18 # v2
with:
tool: cargo-nextest
- name: "Cargo test"
run: |
cargo nextest run \
--no-default-features \
--features python,python-managed,pypi,git,performance,crates-io \
--workspace \
--status-level skip --failure-output immediate-final --no-fail-fast -j 12 --final-status-level slow
cargo-test-windows:
timeout-minutes: 15
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: github-windows-2025-x86_64-16
name: "cargo test | windows"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup Dev Drive
run: ${{ github.workspace }}/.github/workflows/setup-dev-drive.ps1
# actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
- name: Copy Git Repo to Dev Drive
run: |
Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.UV_WORKSPACE }}" -Recurse
- uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0
- name: "Install required Python versions"
run: uv python install
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
with:
workspaces: ${{ env.UV_WORKSPACE }}
- name: "Install Rust toolchain"
working-directory: ${{ env.UV_WORKSPACE }}
run: rustup show
- name: "Install cargo nextest"
uses: taiki-e/install-action@ab3728c7ba6948b9b429627f4d55a68842b27f18 # v2
with:
tool: cargo-nextest
- name: "Cargo test"
working-directory: ${{ env.UV_WORKSPACE }}
env:
# Avoid permission errors during concurrent tests
# See https://github.com/astral-sh/uv/issues/6940
UV_LINK_MODE: copy
shell: bash
run: |
cargo nextest run \
--no-default-features \
--features python,pypi,python-managed \
--workspace \
--status-level skip --failure-output immediate-final --no-fail-fast -j 20 --final-status-level slow
# Separate jobs for the nightly crate
windows-trampoline-check:
timeout-minutes: 15
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: windows-latest
name: "check windows trampoline | ${{ matrix.target-arch }}"
strategy:
fail-fast: false
matrix:
target-arch: ["x86_64", "i686", "aarch64"]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup Dev Drive
run: ${{ github.workspace }}/.github/workflows/setup-dev-drive.ps1
# actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
- name: Copy Git Repo to Dev Drive
run: |
Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.UV_WORKSPACE }}" -Recurse
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
with:
workspaces: ${{ env.UV_WORKSPACE }}/crates/uv-trampoline
- name: "Install Rust toolchain"
working-directory: ${{ env.UV_WORKSPACE }}/crates/uv-trampoline
run: |
rustup target add ${{ matrix.target-arch }}-pc-windows-msvc
rustup component add rust-src --target ${{ matrix.target-arch }}-pc-windows-msvc
- name: "Install cargo-bloat"
uses: taiki-e/install-action@ab3728c7ba6948b9b429627f4d55a68842b27f18 # v2
with:
tool: cargo-bloat
- name: "Clippy"
working-directory: ${{ env.UV_WORKSPACE }}/crates/uv-trampoline
run: cargo clippy --all-features --locked --target x86_64-pc-windows-msvc --tests -- -D warnings
- name: "Bloat Check"
working-directory: ${{ env.UV_WORKSPACE }}/crates/uv-trampoline
run: |
$output = cargo bloat --release --target x86_64-pc-windows-msvc
$filteredOutput = $output | Select-String -Pattern 'core::fmt::write|core::fmt::getcount' -NotMatch
$containsPatterns = $filteredOutput | Select-String -Pattern 'core::fmt|std::panicking|std::backtrace_rs'
if ($containsPatterns) {
Exit 1
} else {
Exit 0
}
# Separate jobs for the nightly crate
windows-trampoline-test:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: windows-latest
name: "test windows trampoline | ${{ matrix.target-arch }}"
strategy:
fail-fast: false
matrix:
# Note, we exclude `aarch64` because it's not supported by the GitHub runner
target-arch: ["x86_64", "i686"]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup Dev Drive
run: ${{ github.workspace }}/.github/workflows/setup-dev-drive.ps1
# actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
- name: Copy Git Repo to Dev Drive
run: |
Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.UV_WORKSPACE }}" -Recurse
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
with:
workspaces: ${{ env.UV_WORKSPACE }}/crates/uv-trampoline
- name: "Install Rust toolchain"
working-directory: ${{ env.UV_WORKSPACE }}/crates/uv-trampoline
run: |
rustup target add ${{ matrix.target-arch }}-pc-windows-msvc
rustup component add rust-src --target ${{ matrix.target-arch }}-pc-windows-msvc
- name: "Test committed binaries"
working-directory: ${{ env.UV_WORKSPACE }}
run: |
rustup target add ${{ matrix.target-arch }}-pc-windows-msvc
cargo test -p uv-trampoline-builder --target ${{ matrix.target-arch }}-pc-windows-msvc
# Build and copy the new binaries
- name: "Build"
working-directory: ${{ env.UV_WORKSPACE }}/crates/uv-trampoline
run: |
cargo build --target ${{ matrix.target-arch }}-pc-windows-msvc
cp target/${{ matrix.target-arch }}-pc-windows-msvc/debug/uv-trampoline-console.exe trampolines/uv-trampoline-${{ matrix.target-arch }}-console.exe
cp target/${{ matrix.target-arch }}-pc-windows-msvc/debug/uv-trampoline-gui.exe trampolines/uv-trampoline-${{ matrix.target-arch }}-gui.exe
- name: "Test new binaries"
working-directory: ${{ env.UV_WORKSPACE }}
run: |
# We turn off the default "production" test feature since these are debug binaries
cargo test -p uv-trampoline-builder --target ${{ matrix.target-arch }}-pc-windows-msvc --no-default-features
typos:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: crate-ci/typos@master
docs:
timeout-minutes: 10
name: "mkdocs"
runs-on: ubuntu-latest
env:
MKDOCS_INSIDERS_SSH_KEY_EXISTS: ${{ secrets.MKDOCS_INSIDERS_SSH_KEY != '' }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
- name: "Add SSH key"
if: ${{ env.MKDOCS_INSIDERS_SSH_KEY_EXISTS == 'true' }}
uses: webfactory/ssh-agent@a6f90b1f127823b31d4d4a8d96047790581349bd # v0.9.1
with:
ssh-private-key: ${{ secrets.MKDOCS_INSIDERS_SSH_KEY }}
- name: "Build docs (public)"
run: uvx --with-requirements docs/requirements.txt mkdocs build --strict -f mkdocs.public.yml
- name: "Build docs (insiders)"
if: ${{ env.MKDOCS_INSIDERS_SSH_KEY_EXISTS == 'true' }}
run: uvx --with-requirements docs/requirements.txt mkdocs build --strict -f mkdocs.insiders.yml
build-binary-linux-libc:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: github-ubuntu-24.04-x86_64-8
name: "build binary | linux libc"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- name: "Build"
run: cargo build
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-linux-libc-${{ github.sha }}
path: |
./target/debug/uv
./target/debug/uvx
retention-days: 1
build-binary-linux-musl:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: github-ubuntu-24.04-x86_64-8
name: "build binary | linux musl"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: rui314/setup-mold@v1
- name: "Setup musl"
run: |
sudo apt-get install musl-tools
rustup target add x86_64-unknown-linux-musl
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- name: "Build"
run: cargo build --target x86_64-unknown-linux-musl --bin uv --bin uvx
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-linux-musl-${{ github.sha }}
path: |
./target/x86_64-unknown-linux-musl/debug/uv
./target/x86_64-unknown-linux-musl/debug/uvx
retention-days: 1
build-binary-macos-aarch64:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: macos-14 # github-macos-14-aarch64-3
name: "build binary | macos aarch64"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- name: "Build"
run: cargo build --bin uv --bin uvx
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-macos-aarch64-${{ github.sha }}
path: |
./target/debug/uv
./target/debug/uvx
retention-days: 1
build-binary-macos-x86_64:
timeout-minutes: 10
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: macos-latest-large # github-macos-14-x86_64-12
name: "build binary | macos x86_64"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- name: "Build"
run: cargo build --bin uv --bin uvx
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-macos-x86_64-${{ github.sha }}
path: |
./target/debug/uv
./target/debug/uvx
retention-days: 1
build-binary-windows-x86_64:
needs: determine_changes
timeout-minutes: 10
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: windows-latest
name: "build binary | windows x86_64"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup Dev Drive
run: ${{ github.workspace }}/.github/workflows/setup-dev-drive.ps1
# actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
- name: Copy Git Repo to Dev Drive
run: |
Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.UV_WORKSPACE }}" -Recurse
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
with:
workspaces: ${{ env.UV_WORKSPACE }}
- name: "Build"
working-directory: ${{ env.UV_WORKSPACE }}
run: cargo build --bin uv --bin uvx
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-windows-x86_64-${{ github.sha }}
path: |
${{ env.UV_WORKSPACE }}/target/debug/uv.exe
${{ env.UV_WORKSPACE }}/target/debug/uvx.exe
retention-days: 1
build-binary-windows-aarch64:
needs: determine_changes
timeout-minutes: 25
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on:
labels: windows-latest
name: "build binary | windows aarch64"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Create Dev Drive using ReFS
run: ${{ github.workspace }}/.github/workflows/setup-dev-drive.ps1
# actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
- name: Copy Git Repo to Dev Drive
run: |
Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.UV_WORKSPACE }}" -Recurse
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
with:
workspaces: ${{ env.UV_WORKSPACE }}
- name: "Install cross target"
run: rustup target add aarch64-pc-windows-msvc
- name: "Build"
working-directory: ${{ env.UV_WORKSPACE }}
run: cargo build --target aarch64-pc-windows-msvc
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-windows-aarch64-${{ github.sha }}
path: |
${{ env.UV_WORKSPACE }}/target/aarch64-pc-windows-msvc/debug/uv.exe
${{ env.UV_WORKSPACE }}/target/aarch64-pc-windows-msvc/debug/uvx.exe
retention-days: 1
cargo-build-msrv:
name: "cargo build (msrv)"
needs: determine_changes
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: github-ubuntu-24.04-x86_64-8
timeout-minutes: 10
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: SebRollen/toml-action@b1b3628f55fc3a28208d4203ada8b737e9687876 # v1.2.0
id: msrv
with:
file: "Cargo.toml"
field: "workspace.package.rust-version"
- name: "Install Rust toolchain"
run: rustup default ${{ steps.msrv.outputs.value }}
- name: "Install mold"
uses: rui314/setup-mold@v1
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- run: cargo +${{ steps.msrv.outputs.value }} build
- run: ./target/debug/uv --version
build-binary-freebsd:
needs: determine_changes
timeout-minutes: 10
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
runs-on: ubuntu-latest
name: "build binary | freebsd"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- name: "Cross build"
run: |
# Install cross from `freebsd-firecracker`
wget -q -O cross https://github.com/acj/freebsd-firecracker/releases/download/v0.0.10/cross
chmod +x cross
mv cross /usr/local/bin/cross
cross build --target x86_64-unknown-freebsd
- name: Test in Firecracker VM
uses: acj/freebsd-firecracker-action@4d93174d9eea32cd2b2650f964af69f8c72eaff2 # v0.3.0
with:
verbose: false
checkout: false
pre-run: |
# The exclude `*` prevents examination of directories so we need to
# include each parent directory of the binary
include_path="$(mktemp)"
cat <<EOF > $include_path
target
target/x86_64-unknown-freebsd
target/x86_64-unknown-freebsd/debug
target/x86_64-unknown-freebsd/debug/uv
EOF
rsync -r -e "ssh" \
--relative \
--copy-links \
--include-from "$include_path" \
--exclude "*" \
. firecracker:
run-in-vm: |
mv target/x86_64-unknown-freebsd/debug/uv uv
chmod +x uv
./uv --version
ecosystem-test:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "ecosystem test | ${{ matrix.repo }}"
runs-on: ubuntu-latest
strategy:
matrix:
include:
- repo: "prefecthq/prefect"
commands:
- "uv venv"
- "uv pip install -e '.[dev]'"
python: "3.9"
- repo: "pallets/flask"
commands:
- "uv venv"
- "uv pip install -r requirements/dev.txt"
python: "3.12"
- repo: "pydantic/pydantic-core"
commands:
- "uv sync --group all"
- "uv lock --upgrade"
python: "3.12"
fail-fast: false
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
repository: ${{ matrix.repo }}
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: ${{ matrix.python }}
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Test"
run: |
echo '${{ toJSON(matrix.commands) }}' | jq -r '.[]' | while read cmd; do
echo "+ $cmd" >&2
if [[ $cmd == uv* ]]; then
./$cmd
else
$cmd
fi
done
smoke-test-linux:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "smoke test | linux"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: |
chmod +x ./uv
chmod +x ./uvx
- name: "Smoke test"
run: |
./uv run scripts/smoke-test
- name: "Test shell completions"
run: |
eval "$(./uv generate-shell-completion bash)"
eval "$(./uvx --generate-shell-completion bash)"
smoke-test-linux-musl:
timeout-minutes: 10
needs: build-binary-linux-musl
name: "check system | alpine"
runs-on: ubuntu-latest
container: alpine:latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-musl-${{ github.sha }}
- name: "Prepare binary"
run: |
chmod +x ./uv
chmod +x ./uvx
- name: "Smoke test"
run: |
./uv run scripts/smoke-test
smoke-test-macos:
timeout-minutes: 10
needs: build-binary-macos-x86_64
name: "smoke test | macos"
runs-on: macos-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-macos-x86_64-${{ github.sha }}
- name: "Prepare binary"
run: |
chmod +x ./uv
chmod +x ./uvx
- name: "Smoke test"
run: |
./uv run scripts/smoke-test
- name: "Test shell completions"
run: |
eval "$(./uv generate-shell-completion bash)"
eval "$(./uvx --generate-shell-completion bash)"
smoke-test-windows-x86_64:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "smoke test | windows x86_64"
runs-on: windows-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
- name: "Smoke test"
working-directory: ${{ env.UV_WORKSPACE }}
run: |
./uv run scripts/smoke-test
- name: "Test uv shell completions"
working-directory: ${{ env.UV_WORKSPACE }}
run: |
(& ./uv generate-shell-completion powershell) | Out-String | Invoke-Expression
- name: "Test uvx shell completions"
working-directory: ${{ env.UV_WORKSPACE }}
run: |
(& ./uvx --generate-shell-completion powershell) | Out-String | Invoke-Expression
smoke-test-windows-aarch64:
timeout-minutes: 10
needs: build-binary-windows-aarch64
name: "smoke test | windows aarch64"
runs-on: github-windows-11-aarch64-4
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-aarch64-${{ github.sha }}
- name: "Smoke test"
working-directory: ${{ env.UV_WORKSPACE }}
run: |
./uv run scripts/smoke-test
- name: "Test uv shell completions"
working-directory: ${{ env.UV_WORKSPACE }}
run: |
(& ./uv generate-shell-completion powershell) | Out-String | Invoke-Expression
- name: "Test uvx shell completions"
working-directory: ${{ env.UV_WORKSPACE }}
run: |
(& ./uvx --generate-shell-completion powershell) | Out-String | Invoke-Expression
integration-test-conda:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "integration test | conda on ubuntu"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3.1.1
with:
miniconda-version: latest
activate-environment: uv
python-version: "3.12"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: Conda info
shell: bash -el {0}
run: conda info
- name: "Install a package"
shell: bash -el {0}
run: |
echo "$CONDA_PREFIX"
./uv pip install anyio
integration-test-deadsnakes-39-linux:
timeout-minutes: 5
needs: build-binary-linux-libc
name: "integration test | deadsnakes python3.9 on ubuntu"
runs-on: ubuntu-latest
steps:
- name: "Install python3.9"
run: |
for i in {1..5}; do
sudo add-apt-repository ppa:deadsnakes && break || { echo "Attempt $i failed, retrying in 10 seconds..."; sleep 10; }
if [ $i -eq 5 ]; then
echo "Failed to add repository after 5 attempts"
exit 1
fi
done
sudo apt-get update
sudo apt-get install python3.9
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Check missing distutils"
run: |
./uv venv -p 3.9 --python-preference only-system -v 2>&1 | tee log.txt || true
# We should report that distutils is missing
grep 'Python installation is missing `distutils`' log.txt
- name: "Install distutils"
run: |
sudo apt-get install python3.9-distutils
- name: "Create a virtualenv"
run: |
./uv venv -p 3.9 --python-preference only-system -v
- name: "Check version"
run: |
.venv/bin/python --version
- name: "Check install"
run: |
./uv pip install -v anyio
integration-test-free-threaded-linux:
timeout-minutes: 5
needs: build-binary-linux-libc
name: "integration test | free-threaded on linux"
runs-on: ubuntu-latest
steps:
- name: "Install python3.13-nogil"
run: |
sudo add-apt-repository ppa:deadsnakes
sudo apt-get update
sudo apt-get install python3.13-nogil
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Create a virtual environment"
run: |
./uv venv -p 3.13t --python-preference only-system
- name: "Check version"
run: |
.venv/bin/python --version
- name: "Check is free-threaded"
run: |
.venv/bin/python -c "import sys; exit(1) if sys._is_gil_enabled() else exit(0)"
- name: "Check install"
run: |
./uv pip install -v anyio
- name: "Install free-threaded Python via uv"
run: |
./uv python install -v 3.13t
./uv venv -p 3.13t --python-preference only-managed
- name: "Check version"
run: |
.venv/bin/python --version
- name: "Check is free-threaded"
run: |
.venv/bin/python -c "import sys; exit(1) if sys._is_gil_enabled() else exit(0)"
- name: "Check install"
run: |
./uv pip install -v anyio
integration-test-free-threaded-windows-x86_64:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "integration test | free-threaded on windows"
runs-on: windows-latest
steps:
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
- name: "Install free-threaded Python via uv"
run: |
./uv python install -v 3.13t
- name: "Create a virtual environment (stdlib)"
run: |
& (./uv python find 3.13t) -m venv .venv
- name: "Check version (stdlib)"
run: |
.venv/Scripts/python --version
- name: "Create a virtual environment (uv)"
run: |
./uv venv -p 3.13t --python-preference only-managed
- name: "Check version (uv)"
run: |
.venv/Scripts/python --version
- name: "Check is free-threaded"
run: |
.venv/Scripts/python -c "import sys; exit(1) if sys._is_gil_enabled() else exit(0)"
- name: "Check install"
run: |
./uv pip install -v anyio
- name: "Check uv run"
run: |
./uv run python -c ""
./uv run -p 3.13t python -c ""
integration-test-pypy-linux:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "integration test | pypy on ubuntu"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Install PyPy"
run: ./uv python install -v pypy3.9
- name: "Create a virtual environment"
run: |
./uv venv -p pypy3.9 --python-preference only-managed
- name: "Check for executables"
run: |
check_in_bin() {
local executable_name=$1
local bin_path=".venv/bin"
if [[ -x "$bin_path/$executable_name" ]]; then
return 0
else
echo "Executable '$executable_name' not found in folder '$bin_path'."
return 1
fi
}
executables=("pypy" "pypy3" "python")
all_found=true
for executable_name in "${executables[@]}"; do
check_in_bin "$executable_name" "$folder_path"
result=$?
if [[ $result -ne 0 ]]; then
all_found=false
fi
done
if ! $all_found; then
echo "One or more expected executables were not found."
exit 1
fi
- name: "Check version"
run: |
.venv/bin/pypy --version
.venv/bin/pypy3 --version
.venv/bin/python --version
- name: "Check install"
run: |
./uv pip install anyio
integration-test-pypy-windows-x86_64:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "integration test | pypy on windows"
runs-on: windows-latest
steps:
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
- name: "Install PyPy"
run: .\uv.exe python install pypy3.9
- name: "Create a virtual environment"
run: |
.\uv.exe venv -p pypy3.9 --python-preference only-managed
- name: "Check for executables"
shell: python
run: |
import sys
from pathlib import Path
def binary_exist(binary):
binaries_path = Path(".venv\\Scripts")
if (binaries_path / binary).exists():
return True
print(f"Executable '{binary}' not found in folder '{binaries_path}'.")
all_found = True
expected_binaries = [
"pypy3.9.exe",
"pypy3.9w.exe",
"pypy3.exe",
"pypyw.exe",
"python.exe",
"python3.9.exe",
"python3.exe",
"pythonw.exe",
]
for binary in expected_binaries:
if not binary_exist(binary):
all_found = False
if not all_found:
print("One or more expected executables were not found.")
sys.exit(1)
- name: "Check version"
run: |
& .venv\Scripts\pypy3.9.exe --version
& .venv\Scripts\pypy3.exe --version
& .venv\Scripts\python.exe --version
- name: "Check install"
run: |
.\uv.exe pip install anyio
integration-test-graalpy-linux:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "integration test | graalpy on ubuntu"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "graalpy24.1"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: Graalpy info
run: |
which graalpy
- name: "Create a virtual environment"
run: |
./uv venv -p $(which graalpy)
- name: "Check for executables"
run: |
check_in_bin() {
local executable_name=$1
local bin_path=".venv/bin"
if [[ -x "$bin_path/$executable_name" ]]; then
return 0
else
echo "Executable '$executable_name' not found in folder '$bin_path'."
return 1
fi
}
executables=("graalpy" "python3" "python")
all_found=true
for executable_name in "${executables[@]}"; do
check_in_bin "$executable_name" "$folder_path"
result=$?
if [[ $result -ne 0 ]]; then
all_found=false
fi
done
if ! $all_found; then
echo "One or more expected executables were not found."
exit 1
fi
- name: "Check version"
run: |
.venv/bin/graalpy --version
.venv/bin/python3 --version
.venv/bin/python --version
- name: "Check install"
run: |
./uv pip install anyio
integration-test-graalpy-windows-x86_64:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "integration test | graalpy on windows"
runs-on: windows-latest
steps:
- uses: timfel/setup-python@fc9bcb4a04f5b1ea7d678c2ca7ea1c479a2468d7
with:
python-version: "graalpy24.1"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
- name: Graalpy info
run: Get-Command graalpy
- name: "Create a virtual environment"
run: |
$graalpy = (Get-Command graalpy).source
.\uv.exe venv -p $graalpy
- name: "Check for executables"
shell: python
run: |
import sys
from pathlib import Path
def binary_exist(binary):
binaries_path = Path(".venv\\Scripts")
if (binaries_path / binary).exists():
return True
print(f"Executable '{binary}' not found in folder '{binaries_path}'.")
all_found = True
expected_binaries = [
"graalpy.exe",
"python.exe",
"python3.exe",
]
for binary in expected_binaries:
if not binary_exist(binary):
all_found = False
if not all_found:
print("One or more expected executables were not found.")
sys.exit(1)
- name: "Check version"
run: |
& .venv\Scripts\graalpy.exe --version
& .venv\Scripts\python3.exe --version
& .venv\Scripts\python.exe --version
- name: "Check install"
run: |
.\uv.exe pip install anyio
integration-test-github-actions:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "integration test | github actions"
runs-on: ubuntu-latest
steps:
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.12.7"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Install a package without system opt-in"
run: |
./uv pip install anyio && exit 1 || echo "Failed as expected"
- name: "Install a package with system opt-in"
run: |
./uv pip install anyio --system
- name: Configure uv to use the system Python by default
run: echo "UV_SYSTEM_PYTHON=1" >> $GITHUB_ENV
- name: "Install a package with system opt-in via the environment"
run: |
./uv pip install anyio --reinstall
- name: "Create a project"
run: |
# Use Python 3.11 as the minimum required version
./uv init --python 3.11
./uv add anyio
- name: "Sync to the system Python"
run: ./uv sync -v --python 3.12
env:
UV_PROJECT_ENVIRONMENT: "/opt/hostedtoolcache/Python/3.12.7/x64"
- name: "Attempt to sync to the system Python with an incompatible version"
run: |
./uv sync -v --python 3.11 && { echo "ci: Error; should not succeed"; exit 1; } || { echo "ci: Ok; expected failure"; exit 0; }
env:
UV_PROJECT_ENVIRONMENT: "/opt/hostedtoolcache/Python/3.12.7/x64"
- name: "Attempt to sync to a non-Python environment directory"
run: |
mkdir -p /home/runner/example
touch /home/runner/example/some-file
./uv sync -v && { echo "ci: Error; should not succeed"; exit 1; } || { echo "ci: Ok; expected failure"; exit 0; }
env:
UV_PROJECT_ENVIRONMENT: "/home/runner/example"
integration-test-github-actions-freethreaded:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "integration test | free-threaded python on github actions"
runs-on: ubuntu-latest
steps:
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13t"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Install a package without system opt-in"
run: |
./uv pip install anyio && exit 1 || echo "Failed as expected"
- name: "Install a package with system opt-in but without free-threaded opt-in"
run: |
./uv pip install anyio --system --python 3.13 || echo "Failed as expected"
# (we need to request 3.13 or we'll discover 3.12 on the system)
- name: "Install a package with system and free-threaded opt-in"
run: |
./uv pip install anyio --system --python 3.13t
integration-test-publish-changed:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "integration test | determine publish changes"
runs-on: ubuntu-latest
outputs:
# Flag that is raised when any code is changed
code: ${{ steps.changed.outputs.code_any_changed }}
# Only the main repository is a trusted publisher
if: github.repository == 'astral-sh/uv' && !contains(github.event.pull_request.labels.*.name, 'no-test')
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
# Only publish a new release if the publishing code changed
- name: "Determine changed files"
id: changed
shell: bash
run: |
CHANGED_FILES=$(git diff --name-only ${{ github.event.pull_request.base.sha || 'origin/main' }}...HEAD)
CODE_CHANGED=false
while IFS= read -r file; do
if [[ "${file}" =~ ^crates/uv-publish/ || "${file}" =~ ^scripts/publish/ || "${file}" == ".github/workflows/ci.yml" ]]; then
echo "Detected code change in: ${file}"
CODE_CHANGED=true
break
fi
echo "Skipping ${file} (not in watched paths)"
continue
done <<< "${CHANGED_FILES}"
echo "code_any_changed=${CODE_CHANGED}" >> "${GITHUB_OUTPUT}"
integration-test-publish:
timeout-minutes: 10
needs: integration-test-publish-changed
name: "integration test | uv publish"
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.labels.*.name, 'no-test') && github.event.pull_request.head.repo.fork != true && (needs.integration-test-publish-changed.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
environment: uv-test-publish
env:
# No dbus in GitHub Actions
PYTHON_KEYRING_BACKEND: keyrings.alt.file.PlaintextKeyring
PYTHON_VERSION: 3.12
permissions:
# For trusted publishing
id-token: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "${{ env.PYTHON_VERSION }}"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Build astral-test-pypa-gh-action"
run: |
# Build a yet unused version of `astral-test-pypa-gh-action`
mkdir astral-test-pypa-gh-action
cd astral-test-pypa-gh-action
../uv init --package
# Get the latest patch version
patch_version=$(curl https://test.pypi.org/simple/astral-test-pypa-gh-action/?format=application/vnd.pypi.simple.v1+json | jq --raw-output '.files[-1].filename' | sed 's/astral_test_pypa_gh_action-0\.1\.\([0-9]\+\)\.tar\.gz/\1/')
# Set the current version to one higher (which should be unused)
sed -i "s/0.1.0/0.1.$((patch_version + 1))/g" pyproject.toml
../uv build
- name: "Publish astral-test-pypa-gh-action"
uses: pypa/gh-action-pypi-publish@db8f07d3871a0a180efa06b95d467625c19d5d5f # release/v1
with:
# With this GitHub action, we can't do as rigid checks as with our custom Python script, so we publish more
# leniently
skip-existing: "true"
repository-url: "https://test.pypi.org/legacy/"
packages-dir: "astral-test-pypa-gh-action/dist"
- name: "Add password to keyring"
run: |
# `keyrings.alt` contains the plaintext keyring
./uv tool install --with keyrings.alt keyring
echo $UV_TEST_PUBLISH_KEYRING | keyring set https://test.pypi.org/legacy/?astral-test-keyring __token__
env:
UV_TEST_PUBLISH_KEYRING: ${{ secrets.UV_TEST_PUBLISH_KEYRING }}
- name: "Publish test packages"
# `-p 3.12` prefers the python we just installed over the one locked in `.python_version`.
run: ./uv run -p ${{ env.PYTHON_VERSION }} scripts/publish/test_publish.py --uv ./uv all
env:
RUST_LOG: uv=debug,uv_publish=trace
UV_TEST_PUBLISH_TOKEN: ${{ secrets.UV_TEST_PUBLISH_TOKEN }}
UV_TEST_PUBLISH_PASSWORD: ${{ secrets.UV_TEST_PUBLISH_PASSWORD }}
UV_TEST_PUBLISH_GITLAB_PAT: ${{ secrets.UV_TEST_PUBLISH_GITLAB_PAT }}
UV_TEST_PUBLISH_CODEBERG_TOKEN: ${{ secrets.UV_TEST_PUBLISH_CODEBERG_TOKEN }}
UV_TEST_PUBLISH_CLOUDSMITH_TOKEN: ${{ secrets.UV_TEST_PUBLISH_CLOUDSMITH_TOKEN }}
UV_TEST_PUBLISH_PYTHON_VERSION: ${{ env.PYTHON_VERSION }}
integration-uv-build-backend:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "integration test | uv_build"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "${{ env.PYTHON_VERSION }}"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: |
chmod +x ./uv
chmod +x ./uvx
- name: "Test uv_build package"
run: |
# Build the Python package, which is not covered by uv's integration tests since they can't depend on having
# a Python package (only the binary itself is built before running Rust's tests)
./uv build -v crates/uv-build
# Test the main path (`build_wheel`) through pip
./uv venv -v --seed
./uv run --no-project python -m pip install -v scripts/packages/built-by-uv --find-links crates/uv-build/dist --no-index --no-deps
./uv run --no-project python -c "from built_by_uv import greet; print(greet())"
# Test both `build_wheel` and `build_sdist` through uv
./uv venv -v
./uv build -v --force-pep517 scripts/packages/built-by-uv --find-links crates/uv-build/dist --offline
./uv pip install -v scripts/packages/built-by-uv/dist/*.tar.gz --find-links crates/uv-build/dist --offline --no-deps
./uv run --no-project python -c "from built_by_uv import greet; print(greet())"
# Test both `build_wheel` and `build_sdist` through the official `build`
rm -rf scripts/packages/built-by-uv/dist/
./uv venv -v
./uv pip install build
# Add the uv binary to PATH for `build` to find
PATH="$(pwd):$PATH" UV_OFFLINE=1 UV_FIND_LINKS=crates/uv-build/dist ./uv run --no-project python -m build -v --installer uv scripts/packages/built-by-uv
./uv pip install -v scripts/packages/built-by-uv/dist/*.tar.gz --find-links crates/uv-build/dist --offline --no-deps
./uv run --no-project python -c "from built_by_uv import greet; print(greet())"
cache-test-ubuntu:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "check cache | ubuntu"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.12"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Download binary for last version"
run: curl -LsSf "https://github.com/astral-sh/uv/releases/latest/download/uv-x86_64-unknown-linux-gnu.tar.gz" | tar -xvz
- name: "Check cache compatibility"
run: python scripts/check_cache_compat.py --uv-current ./uv --uv-previous ./uv-x86_64-unknown-linux-gnu/uv
cache-test-macos-aarch64:
timeout-minutes: 10
needs: build-binary-macos-aarch64
name: "check cache | macos aarch64"
runs-on: macos-14 # github-macos-14-aarch64-3
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-macos-aarch64-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Download binary for last version"
run: curl -LsSf "https://github.com/astral-sh/uv/releases/latest/download/uv-aarch64-apple-darwin.tar.gz" | tar -xvz
- name: "Check cache compatibility"
run: python scripts/check_cache_compat.py --uv-current ./uv --uv-previous ./uv-aarch64-apple-darwin/uv
system-test-debian:
timeout-minutes: 10
needs: build-binary-linux-musl
name: "check system | python on debian"
runs-on: ubuntu-latest
container: debian:bookworm
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install Python"
run: apt-get update && apt-get install -y python3.11 python3-pip python3.11-venv
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-musl-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3.11)
- name: "Validate global Python install"
run: python3.11 scripts/check_system_python.py --uv ./uv --externally-managed
system-test-fedora:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "check system | python on fedora"
runs-on: ubuntu-latest
container: fedora:42
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install Python"
run: dnf install python3 which -y && python3 -m ensurepip
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: python3 scripts/check_system_python.py --uv ./uv
system-test-ubuntu:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "check system | python on ubuntu"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.12"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python)
- name: "Validate global Python install"
run: python scripts/check_system_python.py --uv ./uv
system-test-opensuse:
timeout-minutes: 5
needs: build-binary-linux-libc
name: "check system | python on opensuse"
runs-on: ubuntu-latest
container: opensuse/tumbleweed
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install Python"
run: >
until
zypper install -y python310 which && python3.10 -m ensurepip && mv /usr/bin/python3.10 /usr/bin/python3;
do sleep 10;
done
# We retry because `zypper` can fail during remote repository updates
# The above will not sleep forever due to the job level timeout
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: python3 scripts/check_system_python.py --uv ./uv
# Note: rockylinux is a 1-1 code compatible distro to rhel
# rockylinux mimics centos but with added maintenance stability
# and avoids issues with centos stream uptime concerns
system-test-rocky-linux:
timeout-minutes: 10
needs: build-binary-linux-musl
name: "check system | python on rocky linux ${{ matrix.rocky-version }}"
runs-on: ubuntu-latest
container: rockylinux:${{ matrix.rocky-version }}
strategy:
fail-fast: false
matrix:
rocky-version: ["8", "9"]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install Python"
if: matrix.rocky-version == '8'
run: |
dnf install python39 python39-pip which -y
- name: "Install Python"
if: matrix.rocky-version == '9'
run: |
dnf install python3.9 python3.9-pip which -y
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-musl-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: python3 scripts/check_system_python.py --uv ./uv
system-test-pypy:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "check system | pypy on ubuntu"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "pypy3.9"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which pypy)
- name: "Validate global Python install"
run: pypy scripts/check_system_python.py --uv ./uv
system-test-pyston:
timeout-minutes: 10
needs: build-binary-linux-musl
name: "check system | pyston"
runs-on: ubuntu-latest
container: pyston/pyston:2.3.5
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-musl-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which pyston)
- name: "Validate global Python install"
run: pyston scripts/check_system_python.py --uv ./uv
system-test-alpine:
timeout-minutes: 10
needs: build-binary-linux-musl
name: "check system | alpine"
runs-on: ubuntu-latest
container: alpine:latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install Python"
run: apk add --update --no-cache python3 py3-pip
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-musl-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: python3 scripts/check_system_python.py --uv ./uv --externally-managed
system-test-macos-aarch64:
timeout-minutes: 10
needs: build-binary-macos-aarch64
name: "check system | python on macos aarch64"
runs-on: macos-14 # github-macos-14-aarch64-3
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-macos-aarch64-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
# This should be the macOS system Python
# We'd like to test with Homebrew but this Python takes precedence in system Python discovery
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: python3 scripts/check_system_python.py --uv ./uv --externally-managed
system-test-macos-aarch64-homebrew:
timeout-minutes: 10
needs: build-binary-macos-aarch64
name: "check system | homebrew python on macos aarch64"
runs-on: macos-14 # github-macos-14-aarch64-3
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install Python"
run: brew install python3
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-macos-aarch64-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: python3 scripts/check_system_python.py --uv ./uv --externally-managed
system-test-macos-x86_64:
timeout-minutes: 10
needs: build-binary-macos-x86_64
name: "check system | python on macos x86-64"
runs-on: macos-13 # github-macos-13-x86_64-4
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# We test with GitHub's Python as a regression test for
# https://github.com/astral-sh/uv/issues/2450
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-macos-x86_64-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: python3 scripts/check_system_python.py --uv ./uv
system-test-windows-python-310:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "check system | python3.10 on windows x86-64"
runs-on: windows-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.10"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
- name: "Print Python path"
run: echo $(which python)
- name: "Validate global Python install"
run: py -3.10 ./scripts/check_system_python.py --uv ./uv.exe
system-test-windows-x86_64-python-310:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "check system | python3.10 on windows x86"
runs-on: windows-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.10"
architecture: "x86"
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
- name: "Print Python path"
run: echo $(which python)
- name: "Validate global Python install"
run: python ./scripts/check_system_python.py --uv ./uv.exe
system-test-windows-x86_64-python-313:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "check system | python3.13 on windows x86-64"
runs-on: windows-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13"
allow-prereleases: true
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
- name: "Print Python path"
run: echo $(which python)
- name: "Validate global Python install"
run: py -3.13 ./scripts/check_system_python.py --uv ./uv.exe
system-test-windows-aarch64-x86-python-313:
timeout-minutes: 10
needs: build-binary-windows-aarch64
name: "check system | x86-64 python3.13 on windows aarch64"
runs-on: github-windows-11-aarch64-4
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13"
architecture: "x64"
allow-prereleases: true
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-aarch64-${{ github.sha }}
- name: "Validate global Python install"
run: py -3.13 ./scripts/check_system_python.py --uv ./uv.exe
# Test our PEP 514 integration that installs Python into the Windows registry.
system-test-windows-registry:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "check system | windows registry"
runs-on: windows-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
# NB: Run this last, we are modifying the registry
- name: "Test PEP 514 registration"
run: python ./scripts/check_registry.py --uv ./uv.exe
system-test-choco:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "check system | python3.12 via chocolatey"
runs-on: windows-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install Python"
run: choco install python3 --verbose --version=3.9.13
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: py -3.9 ./scripts/check_system_python.py --uv ./uv.exe
system-test-pyenv:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "check system | python3.9 via pyenv"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install pyenv"
run: |
# Install pyenv
curl https://pyenv.run | bash
# Set up environment variables for current step
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
# Install Python 3.9
pyenv install 3.9
pyenv global 3.9
# Make environment variables persist across steps
echo "PYENV_ROOT=$HOME/.pyenv" >> $GITHUB_ENV
echo "$HOME/.pyenv/bin" >> $GITHUB_PATH
echo "$HOME/.pyenv/shims" >> $GITHUB_PATH
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3.9)
- name: "Validate global Python install"
run: python3.9 scripts/check_system_python.py --uv ./uv
system-test-linux-313:
timeout-minutes: 10
needs: build-binary-linux-libc
name: "check system | python3.13"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: 3.13
allow-prereleases: true
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-libc-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3.13)
- name: "Validate global Python install"
run: python3.13 scripts/check_system_python.py --uv ./uv
system-test-conda:
timeout-minutes: 10
needs:
[
build-binary-windows-x86_64,
build-binary-macos-aarch64,
build-binary-linux-libc,
]
name: check system | conda${{ matrix.python-version }} on ${{ matrix.os }} ${{ matrix.arch }}
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
os: ["linux", "windows", "macos"]
python-version: ["3.8", "3.11"]
include:
- {
os: "linux",
target: "linux-libc",
runner: "ubuntu-latest",
arch: "x86-64",
}
- {
os: "windows",
target: "windows-x86_64",
runner: "windows-latest",
arch: "x86-64",
}
- {
os: "macos",
target: "macos-aarch64",
runner: "macos-14",
arch: "aarch64",
}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3.1.1
with:
miniconda-version: "latest"
activate-environment: uv
python-version: ${{ matrix.python-version }}
- name: Conda info
shell: bash -el {0}
run: conda info
- name: Conda list
shell: pwsh
run: conda list
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-${{ matrix.target }}-${{ github.sha }}
- name: "Prepare binary"
if: ${{ matrix.os != 'windows' }}
run: chmod +x ./uv
- name: "Print Python path"
shell: bash -el {0}
run: echo $(which python)
- name: "Validate global Python install"
shell: bash -el {0}
run: python ./scripts/check_system_python.py --uv ./uv
system-test-amazonlinux:
timeout-minutes: 10
needs: build-binary-linux-musl
name: "check system | amazonlinux"
runs-on: ubuntu-latest
container: amazonlinux:2023
steps:
- name: "Install base requirements"
run: |
# Needed for `actions/checkout`
yum install tar gzip which -y
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Install Python"
run: yum install python3 python3-pip -y
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-linux-musl-${{ github.sha }}
- name: "Prepare binary"
run: chmod +x ./uv
- name: "Print Python path"
run: echo $(which python3)
- name: "Validate global Python install"
run: python3 scripts/check_system_python.py --uv ./uv
system-test-windows-embedded-python-310:
timeout-minutes: 10
needs: build-binary-windows-x86_64
name: "check system | embedded python3.10 on windows x86-64"
runs-on: windows-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: "Download binary"
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: uv-windows-x86_64-${{ github.sha }}
# Download embedded Python.
- name: "Download embedded Python"
run: curl -LsSf https://www.python.org/ftp/python/3.11.8/python-3.11.8-embed-amd64.zip -o python-3.11.8-embed-amd64.zip
- name: "Unzip embedded Python"
run: 7z x python-3.11.8-embed-amd64.zip -oembedded-python
- name: "Show embedded Python contents"
run: ls embedded-python
- name: "Set PATH"
run: echo "${{ github.workspace }}\embedded-python" >> $env:GITHUB_PATH
- name: "Print Python path"
run: echo $(which python)
- name: "Validate embedded Python install"
run: python ./scripts/check_embedded_python.py --uv ./uv.exe
benchmarks:
runs-on: ubuntu-latest
needs: determine_changes
if: ${{ github.repository == 'astral-sh/uv' && !contains(github.event.pull_request.labels.*.name, 'no-test') && (needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main') }}
timeout-minutes: 20
steps:
- name: "Checkout Branch"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
- name: "Install Rust toolchain"
run: rustup show
- name: "Install codspeed"
uses: taiki-e/install-action@ab3728c7ba6948b9b429627f4d55a68842b27f18 # v2
with:
tool: cargo-codspeed
- name: "Install requirements and prime cache"
run: |
sudo apt-get update
sudo apt-get install -y libsasl2-dev libldap2-dev libkrb5-dev
cargo run --bin uv -- venv --cache-dir .cache
cargo run --bin uv -- pip compile scripts/requirements/jupyter.in --universal --exclude-newer 2024-08-08 --cache-dir .cache
cargo run --bin uv -- pip compile scripts/requirements/airflow.in --universal --exclude-newer 2024-08-08 --cache-dir .cache
- name: "Build benchmarks"
run: cargo codspeed build --profile profiling --features "codspeed,performance" -p uv-bench
- name: "Run benchmarks"
uses: CodSpeedHQ/action@0010eb0ca6e89b80c88e8edaaa07cfe5f3e6664d # v3.5.0
with:
run: cargo codspeed run
token: ${{ secrets.CODSPEED_TOKEN }}