20200 Commits

Author SHA1 Message Date
Ross Sullivan
15f755cefd
chore: Created CargoProjectExt extention trait 2025-06-25 23:18:00 +09:00
Ross Sullivan
92d9a94d02
chore: Migrated testsuite to testsuite::prelude 2025-06-25 22:37:24 +09:00
Ross Sullivan
66fc1055a7
chore: Created testsuite prelude 2025-06-25 22:29:12 +09:00
Ross Sullivan
47312c446d
chore: Moved tools and some cross compiling logic into testsuite 2025-06-24 23:51:39 +09:00
Ed Page
409fed7dc1
Fix potential deadlock in CacheState::lock (#15698)
This PR fixes a potential source of deadlock in the `CacheState::lock`
function
([here](84709f0850/src/cargo/util/cache_lock.rs (L411))),
as explained below.

I ran into this deadlock while testing Dylint. For example, in [this
GitHub
run](https://github.com/trailofbits/dylint/actions/runs/15570922048),
two jobs were killed after running for six hours. This fix seems to
resolve the deadlock (e.g., see [this
run](https://github.com/trailofbits/dylint/actions/runs/15822570315),
which [uses the
fix](https://github.com/trailofbits/dylint/actions/runs/15822570315/workflow#L119-L132)).

Until this fix (or a similar one) appears in `rustup`-installable Cargo,
is there an easy workaround?

---

A `CacheState` struct holds [two recursive
locks](84709f0850/src/cargo/util/cache_lock.rs (L347-L357)):
`mutate_lock` and `cache_lock`.

When `MutateExclusive` is passed to `CacheState::lock`, it tries to
acquire both locks. First, it tries to acquire `mutate_lock`, then it
tries to acquire `cache_lock`.

The problematic case is when it acquires the first, but not the second.

Note that if the second cannot be acquired because of an error, the
`mutate_lock` recursive lock is decremented:
84709f0850/src/cargo/util/cache_lock.rs (L412-L415)

However, if the second would simply block, `LockingResult::WouldBlock`
is returned.

`CacheState::lock` is called from two places. One of those locations is
in `CacheLocker::try_lock`:[^1]
84709f0850/src/cargo/util/cache_lock.rs (L502-L506)

Note that `CacheLocker::try_lock` creates a
[`CacheLock`](84709f0850/src/cargo/util/cache_lock.rs (L427-L430))
if and only if `LockingResult::LockAcquired` is returned.

Furthermore, when a `CacheLock` is dropped, it decrements both
`mutate_lock` and `cache_lock`:
84709f0850/src/cargo/util/cache_lock.rs (L443-L446)

A scan of `cache_lock.rs` shows that there are only three places[^2]
where `mutate_lock.decrement()` is called: the error location in
`CacheState::lock` (referenced above), and two places in
`CacheLock::drop`.

Thus, if `LockingResult::WouldBlock` is returned from
`CacheState::lock`, `mutate_lock` is never decremented.

[^1]: The other location is in `CacheLocker::lock`, which calls
`CacheState::lock` with `BlockingMode::Blocking`. For that reason,
`CacheLocker::lock` should not return `WouldBlock` when called from this
location.
[^2]:
84709f0850/src/cargo/util/cache_lock.rs (L413),
84709f0850/src/cargo/util/cache_lock.rs (L438),
and
84709f0850/src/cargo/util/cache_lock.rs (L445)
2025-06-23 15:55:04 +00:00
Ed Page
f94409aec8
feat(toml): Parse support for multiple build scripts (#15630)
Hi Everyone!

This is PR for the manifest parsing of the first milestone of [GSoC
Project : Build Script
Delegation](https://summerofcode.withgoogle.com/programs/2025/projects/nUt4PdAA)

### What does this PR try to resolve?

Currently, just a single build script is allowed for each package. This
PR will allow users to create and use multiple build scripts, and is
backward compatible with single script as well as boolean values.

**Motivation :** This will help users to maintain separate smaller and
cleaner build scripts instead of one large build script. This is also
necessary for build script delegation.

**Open questions:**
- What should the build script target names be?
- Currently they use the file stem of the build script which could run
into conflicts

**Known Issues:**
- This is just parsing support, and currently, only the first build
script of the array is actually executed.

### How to test and review this PR?

There is a feature gate `multiple-build-scripts` that can be passed via
`cargo-features` in `Cargo.toml`. So, you have to add
```toml
cargo-features = ["multiple-build-scripts"]
```
Preferably on the top of the `Cargo.toml` and use nightly toolchain to
use the feature

**This PR is ready to be reviewed and merged**
2025-06-23 14:28:48 +00:00
Naman Garg
5c7f68fe5d
Add multi-build script support to cargo vendor 2025-06-23 19:14:41 +05:30
Naman Garg
21c2f1615d
Add multi-build script support to cargo publish 2025-06-23 19:14:40 +05:30
Naman Garg
68429eb381
Attach all build scripts to the target 2025-06-23 19:14:38 +05:30
Naman Garg
a9d5cb8abe
Add MultipleScript (error on stable, error about not implemented on nightly) 2025-06-23 19:14:37 +05:30
Naman Garg
db8dbaf3ed
Add initial tests for multiple build scripts (not implemented yet) 2025-06-23 19:14:36 +05:30
Naman Garg
126b3a18c1
Refactor normalized_build to accept slice instead of string 2025-06-23 19:14:35 +05:30
Naman Garg
92b00aefc3
Fork StringOrBool into new TomlPackageBuild type and update manifest.schema.json 2025-06-23 19:14:33 +05:30
Naman Garg
79730837cb
Add feature gate for multiple build scripts 2025-06-23 19:14:32 +05:30
Naman Garg
93fd488f94
Rename readme variable to build 2025-06-23 19:14:30 +05:30
Samuel Moelius
0b362e320e Fix potential deadlock in CacheState::lock 2025-06-23 06:17:04 -04:00
Weihang Lo
84709f0850
Bump cargo-util-schemas version (#15696)
https://github.com/rust-lang/cargo/pull/15643 introduced a semver
breaking change by adding a new pub field to `TomlProfile`.
2025-06-22 23:58:39 +00:00
Eric Huss
0c59ee9009 Bump cargo-util-schemas version
https://github.com/rust-lang/cargo/pull/15643 introduced a semver
breaking change by adding a new pub field to `TomlProfile`.
2025-06-22 15:54:29 -07:00
Eric Huss
4832e11629
test(msrv): use a far future "newer" version (#15693)
Two tests were using `.rust_version("1.90.0")` for a "newer" Rust, but
this failed in rust-lang/rust#142792 for the start of the *real* 1.90.0.
Let's bump that to 1.999.0 so we won't have to deal with it for a while.
2025-06-22 22:39:20 +00:00
Josh Stone
d97bf418d9 test(msrv): use a far future "newer" version
Two tests were using `.rust_version("1.90.0")` for a "newer" Rust, but
this failed in rust-lang/rust#142792 for the start of the *real* 1.90.0.
Let's bump that to 1.999.0 so we won't have to deal with it for a while.
2025-06-22 12:05:40 -07:00
Ed Page
0731d176ad
Plumb rustc -Zhint-mostly-unused flag through as a profile option (#15643)
The rustc `-Zhint-mostly-unused` flag tells rustc that most of a crate
will go unused. This is useful for speeding up compilation of large
dependencies from which you only use a few items. Plumb that option
through as a profile option, to allow specifying it for specific
dependencies:

```toml
[profile.dev.package.huge-mostly-unused-dependency]
hint-mostly-unused = true
```

To enable this feature, pass `-Zprofile-hint-mostly-unused`. However,
since this option is a hint, using it without passing
`-Zprofile-hint-mostly-unused` will only warn and ignore the profile
option. Versions of Cargo prior to the introduction of this feature will
give an "unused manifest key" warning, but will otherwise function
without erroring. This allows using the hint in a crate's `Cargo.toml`
without mandating the use of a newer Cargo to build it.

Add a test verifying that the profile option gets ignored with a warning
without passing `-Zprofile-hint-mostly-unused`, and another test
verifying that it gets handled when passing
`-Zprofile-hint-mostly-unused`.

### How to test and review this PR?

The tests in the testsuite demonstrate both that the option works as
expected and that it gets ignored with a warning if not passing
`-Zprofile-hint-mostly-unused`.

This will remain a draft until
https://github.com/rust-lang/rust/pull/135656 gets merged in rustc; once
that happens, the "nightly" jobs will pass in CI.
2025-06-20 23:01:05 +00:00
Josh Triplett
3315a60762 Add table-of-contents link to the hint-mostly-unused section 2025-06-20 15:16:03 -07:00
Josh Triplett
dd183e0338 Test hint-mostly-unused with check rather than build 2025-06-20 15:16:03 -07:00
Josh Triplett
36480ce012 Plumb rustc -Zhint-mostly-unused flag through as a profile option
The rustc `-Zhint-mostly-unused` flag tells rustc that most of a crate
will go unused. This is useful for speeding up compilation of large
dependencies from which you only use a few items. Plumb that option
through as a profile option, to allow specifying it for specific
dependencies:

```toml
[profile.dev.package.huge-mostly-unused-dependency]
hint-mostly-unused = true
```

To enable this feature, pass `-Zprofile-hint-mostly-unused`. However,
since this option is a hint, using it without passing
`-Zprofile-hint-mostly-unused` will only warn and ignore the profile
option. Versions of Cargo prior to the introduction of this feature will
give an "unused manifest key" warning, but will otherwise function
without erroring. This allows using the hint in a crate's `Cargo.toml`
without mandating the use of a newer Cargo to build it.

Add a test verifying that the profile option gets ignored with a warning
without passing `-Zprofile-hint-mostly-unused`, and another test
verifying that it gets handled when passing
`-Zprofile-hint-mostly-unused`.
2025-06-20 15:16:03 -07:00
Ed Page
8789c2b757
Disable lldb test, which seems to be broken due to issues with lldb (#15687)
r? @weihanglo
2025-06-20 14:15:04 +00:00
Josh Triplett
0419be8eae Disable cdb test, which seems to be broken 2025-06-20 02:21:46 -07:00
Josh Triplett
4cfa4b0c60 Disable lldb test, which seems to be broken due to issues with lldb 2025-06-20 01:43:22 -07:00
Ed Page
00132f31fd
docs(contrib): change clap URL to docs.rs/clap (#15682)
### What does this PR try to resolve?

The current [subcommands
page](https://doc.crates.io/contrib/implementation/subcommands.html) in
Cargo contrib guide links clap to https://clap.rs, which doesn't exist.
This PR updates that link to https://docs.rs/clap, which is the URL
mentioned in [clap's repository](https://github.com/clap-rs/clap)

### How to test and review this PR?
2025-06-19 11:17:47 +00:00
secona
9b0d02d57d docs(contrib): change clap URL to docs.rs/clap 2025-06-19 16:20:17 +07:00
Ed Page
0b974c06c6
feat: Introduce perma unstable --compile-time-deps option for cargo build (#15674)
Resolves #14434
2025-06-19 00:59:15 +00:00
Shoyu Vanilla
072b345bbf feat(compile-time-deps): Add cli flag --compile-time-deps and adjust docs 2025-06-19 09:09:32 +09:00
Shoyu Vanilla
5b178a8d05 feat(compile-time-deps): Implement non compile time deps filtering 2025-06-19 09:09:32 +09:00
Shoyu Vanilla
d253d12122 test(compile-time-deps): Add tests for --compile-time-deps 2025-06-19 09:09:32 +09:00
Ed Page
18729550bd
fix: Failing tests on rustc nightly (#15679)
Fixes #15678
2025-06-18 17:20:31 +00:00
Shoyu Vanilla
da332544bc fix: Failing tests on rustc nightly 2025-06-19 01:05:01 +09:00
Ed Page
2251525ae5
feat: Add custom completer for cargo remove <TAB> (#15662)
fix #15656

### What does this PR try to resolve?

This PR implements custom TAB completer for cargo remove <package_name>.

### How to test and review this PR?

This patch works like this:

```console
$ cat Cargo.toml
[package]
name = "sandbox"
version = "0.1.0"
edition = "2024"

[dependencies]
rand = "0.9.1"
serde_json = "1"

$ ~/cargo/target/debug/cargo remove
completing values
--build          -- Remove from build-dependencies
--color          -- Coloring
--config         -- Override a configuration value
--dev            -- Remove from dev-dependencies
--dry-run        -- Don't actually write the manifest
--frozen         -- Equivalent to specifying both --locked and --offline
--help           -- Print help
--locked         -- Assert that `Cargo.lock` will remain unchanged
--lockfile-path  -- Path to Cargo.lock (unstable)
--manifest-path  -- Path to Cargo.toml
--offline        -- Run without accessing the network
--package        -- Package to remove from
--quiet          -- Do not print cargo log messages
--target         -- Remove from target-dependencies
--verbose        -- Use verbose output (-vv very verbose/build.rs output)
-Z               -- Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details
rand        serde_json

```

(on zsh)
2025-06-16 22:01:27 +00:00
motorailgun
72e90fa963 feat: Add custom completer for cargo remove <TAB> 2025-06-16 21:26:27 +00:00
Ed Page
1d71929823
chore(deps): update msrv (3 versions) to v1.85 (#15668)
This PR contains the following updates:

| Package | Update | Change | Pending |
|---|---|---|---|
| [MSRV:3](https://redirect.github.com/rust-lang/rust) | minor | `1.84`
-> `1.85` | `1.87` (+1) |

---

### Release Notes

<details>
<summary>rust-lang/rust (MSRV:3)</summary>

###
[`v1.85`](https://redirect.github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1851-2025-03-18)

[Compare
Source](https://redirect.github.com/rust-lang/rust/compare/1.84.0...1.85.0)

\==========================

<a id="1.85.1"></a>

- [Fix the doctest-merging feature of the 2024
Edition.](https://redirect.github.com/rust-lang/rust/pull/137899/)
- [Relax some `target_feature` checks when generating
docs.](https://redirect.github.com/rust-lang/rust/pull/137632/)
- [Fix errors in `std::fs::rename` on Windows 10, version
1607.](https://redirect.github.com/rust-lang/rust/pull/137528/)
- [Downgrade bootstrap `cc` to fix custom
targets.](https://redirect.github.com/rust-lang/rust/pull/137460/)
- [Skip submodule updates when building Rust from a source
tarball.](https://redirect.github.com/rust-lang/rust/pull/137338/)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - Every minute ( * * * * * ) (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/rust-lang/cargo).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC41MC4wIiwidXBkYXRlZEluVmVyIjoiNDAuNTAuMCIsInRhcmdldEJyYW5jaCI6Im1hc3RlciIsImxhYmVscyI6W119-->
2025-06-16 13:53:01 +00:00
renovate[bot]
9d05224480
chore(deps): update msrv (3 versions) to v1.85 2025-06-16 06:28:30 +00:00
Weihang Lo
f6cea42b79
refactor: replace InternedString with Cow in IndexPackage (#15559)
### What does this PR try to resolve?

ref https://github.com/rust-lang/cargo/issues/14834

As described in the issue, we want to move IndexPackage into
cargo-util-schemas. However, it contains InternedString fields, which we
don't want to expose as part of the public API.
This PR replaces InternedString with Cow.

And also, as @weihanglo's suggested, I implemented the From/Into trait
to simplify code.

From Cow tarit implementation: [`42f593f`
(#15559)](42f593fa72)

Replace InternedString with `into()` across the whole codebase:
[`5f90098`
(#15559)](5f900981de)
I am unsure if it worsens the readability. Feel free to comment.

### How should we test and review this PR?

It shouldn't change or break any tests.

Benchmark 1:
https://github.com/rust-lang/cargo/pull/15559#issuecomment-2913155520
Benchmark 2:
https://github.com/rust-lang/cargo/pull/15559#issuecomment-2927304675

### Additional information

None
2025-06-16 01:49:54 +00:00
Weihang Lo
24a46c339f
highlight the correct words (#15659) 2025-06-15 03:12:49 +00:00
0xPoe
5f900981de refactor: replace InternedString with into() conversions across the codebase
Signed-off-by: 0xPoe <techregister@pm.me>
2025-06-14 23:43:16 +02:00
0xPoe
42f593fa72 refactor: implement From Cow trait for the InternedString
Signed-off-by: 0xPoe <techregister@pm.me>
2025-06-14 23:38:00 +02:00
0xPoe
ee60a4f6ec refactor: replace InternedString with Cow in IndexPackage
Signed-off-by: 0xPoe <techregister@pm.me>
2025-06-14 23:38:00 +02:00
Weihang Lo
d2c0bcd8e9
CHANGELOG.md: typo (#15660) 2025-06-13 10:20:04 +00:00
Tshepang Mbambo
5255cd044d
highlight the correct words
I assumed the link target was about contributing to docs, but it was more a link to the docs readme.
2025-06-13 11:40:54 +02:00
Tshepang Mbambo
80f5b251dc
CHANGELOG.md: typo 2025-06-13 11:36:04 +02:00
Weihang Lo
aed94a893c
Use Not::not rather than a custom is_false function (#15645)
The `is_false` function already exists in the standard library, as
`Not::not`; use that in `skip_serializing_if` rather than defining an
`is_false` function.
2025-06-09 02:48:06 +00:00
Josh Triplett
262d4dd5f2 Use Not::not rather than a custom is_false function
The `is_false` function already exists in the standard library, as
`Not::not`; use that in `skip_serializing_if` rather than defining an
`is_false` function.
2025-06-08 19:15:27 -07:00
Weihang Lo
fc1518ef02
fix: Make UI tests handle hyperlinks consistently (#15640)
In #15639, @weihanglo noted that one of the lint tests passed in CI, but
locally it would fail as it had a hyperlink added to its output. The
root cause appears to be the recent update to `anstyle-svg@0.1.8`, which
added support for hyperlinks, combined with our hyperlink support
autodetection, disabling them in CI, but allowing them locally. To
ensure we are consistently handling hyperlinks, I made them always
enabled for UI tests. This seemed like the best option given that we
already force colors for UI tests, and it allows us to test our
hyperlink output.
2025-06-06 04:49:44 +00:00