### What does this PR try to resolve?
Unblock CI
### How to test and review this PR?
### Notes
These were caught with the latest nightly
This was pulled from #15800
When running `cargo package` the verify the build cache
(target-dir/build-dir) will not be used and all dependencies will be
recompiled.
This is inconsistent as setting target dir (via `CARGO_TARGET_DIR` for
example) will cause `cargo package` to reuse the build cache.
This commit changes the default behavior to always use the build cache,
matching the behavior of having target-dir set.
### What does this PR try to resolve?
ref https://github.com/rust-lang/cargo/issues/14834
In this pull request, I moved `IndexPackage` to `cargo-util-schemas` to
enable third-party applications and `cargo-dev-registry` to utilize this
common struct.
For instance, crates.io has its own `IndexPackage` located at
005667f041/crates/crates_io_index/data.rs (L5).
By moving it to `cargo-util-schemas`, we allow different applications to
use this struct more easily.
### How to test and review this PR?
It shouldn't break any tests; it's just a refactoring.
### What does this PR try to resolve?
Unconditionally enabling "blocking-http-transport-curl" made the `cargo`
library incompatible with crates that prefer reqwest. An example being
the `rustsec` crate with git support:
-
https://github.com/rustsec/rustsec/blob/rustsec/v0.30.2/rustsec/Cargo.toml#L45-L47
-
https://github.com/rustsec/rustsec/blob/rustsec/v0.30.2/rustsec/Cargo.toml#L34
-
https://github.com/EmbarkStudios/tame-index/blob/0.21.0/Cargo.toml#L14-L17
Having `cargo` and `rustsec` in the same dependency graph makes
`gix-transport` fail to compile.
```toml
[dependencies]
cargo = "0.88.0"
rustsec = "0.30.2"
```
```console
error[E0428]: the name `Impl` is defined multiple times
--> $CARGO_HOME/registry/src/index.crates.io-1949cf8c6b5b557f/gix-transport-0.45.0/src/client/blocking_io/http/mod.rs:220:1
|
217 | pub type Impl = curl::Curl;
| --------------------------- previous definition of the type `Impl` here
...
220 | pub type Impl = reqwest::Remote;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Impl` redefined here
|
= note: `Impl` must be defined only once in the type namespace of this module
error: Cannot set both 'http-client-reqwest' and 'http-client-curl' features as they are mutually exclusive
--> $CARGO_HOME/registry/src/index.crates.io-1949cf8c6b5b557f/gix-transport-0.45.0/src/client/blocking_io/http/mod.rs:26:1
|
26 | compile_error!("Cannot set both 'http-client-reqwest' and 'http-client-curl' features as they are mutually exclusive");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```
After this PR, dependency graphs that prefer reqwest can switch to
Cargo's http-transport-reqwest feature.
```toml
[dependencies]
cargo = { default-features = false, features = ["http-transport-reqwest"] }
rustsec = "0.30.2"
```
Cargo will continue to have a direct dependency on `curl`, but HTTP
operations performed through gix will use `reqwest`. This means both
curl's HTTP implementation and reqwest's HTTP implementation will be
linked. This is still much better than the only existing solution, which
is that you must pick versions of `cargo` and other dependency
(`rustsec`) which depend on semver-incompatible versions of gix, causing
2 entire versions of gix to be linked, in order to sidestep the mutually
exclusive features being enabled on the same version of gix. Gix version
numbers advance rapidly enough that this is often possible, but
sometimes (like right now) you would be unable to use the most recent
published release of `cargo`.
### How to test and review this PR?
- `cargo check --lib`
- `cargo check --lib --no-default-features --features
http-transport-reqwest`
Also tested by backporting this commit onto
<https://github.com/rust-lang/cargo/pull/15391>'s base commit (i.e. when
gix 0.70 was used) to ensure a conflict with rustsec's gix dependency,
and successfully building the following project.
```toml
[package]
name = "repro"
version = "0.0.0"
edition = "2024"
publish = false
[dependencies]
cargo = { path = "../cargo", default-features = false, features = ["http-transport-reqwest"] }
rustsec = "0.30.2"
```
### What does this PR try to resolve?
This PR changes the way the charts produced by `cargo build --timings`
scale. It changes the scale slider so that its min/max values adapt to
the duration of the build, to allow zooming in/out even for very short
build durations. It also automatically initializes the scale value based
on the client's window width.
The number of pixels per second per scale value has been changed from 1
to 8, to avoid having too many scale values for the given duration of
supported chart widths, which I have determined in this PR to be `[200,
4096]` pixels.
https://github.com/user-attachments/assets/3e6e9f14-eabe-425a-a568-9fcb5c835145
### How to test and review this PR?
Run `cargo build --timings` e.g. on
https://github.com/BurntSushi/ripgrep. Then open the resulting page in a
browser, and try to enlarge/ensmall the window (possibly using mobile
emulation), and see how the charts react to window size.
Fixes: https://github.com/rust-lang/cargo/issues/15666
This should also help fixing these spurious "cannot package because some
excluded file is untracked" issues.
### Tasks
* [x] step-by-step conversion of `vcs.rs`
* [x] use proper feature toggle
* [x] ~~cleanup~~ final check by myself
* [ ] ~~move split & rename into its own commit. Probably squash all
changes except for the gix upgrade.~~
- I like to have the major stages of this PR conserved.
* [x] upgrade to a gix release including
https://github.com/GitoxideLabs/gitoxide/pull/2016
- This was done in `master` already.
* [x] fix tests by fixing `gix` - `submodules()` call isn't bare-repo
safe.
* [x] fix failure on Windows
- `gix status` seems to go through a symlink, arriving at the wrong
conclusion, on Windows.
* [x] fix performance regression on `aws-sdk-rust`.
### Notes for the Reviewer
* This implementation is both faster and more correct, thus affects
#15416 and #14955.
Related to https://github.com/GitoxideLabs/gitoxide/issues/106.
This is achieved by allowing `gix status` to only run in the
package root, while running it another time just on the few files
that are interesting outside of the package root.
This saves a lot of time compared to the previous implementation,
which ran the status on the entire repository.
This should also help fixing these spurious "cannot package because
some excluded file is untracked" issues.
Remove the respective `git2` implementation at the same time
as there seems to be no need for it.
### What does this PR try to resolve?
The type is
```c
typedef struct {
const gchar *name;
SecretSchemaFlags flags;
SecretSchemaAttribute attributes[32];
/* <private> */
gint reserved;
gpointer reserved1;
gpointer reserved2;
gpointer reserved3;
gpointer reserved4;
gpointer reserved5;
gpointer reserved6;
gpointer reserved7;
} SecretSchema;
```
so the current object we give it is 8 pointers too short
It's incredibly lucky that libsecret, at this time, only uses
`reserved`, and not in any of the functions we call
Also, some obvious cleanups while I was there and comparing with [my
implementation](https://github.com/nabijaczleweli/cargo-update/blob/v17.0.0/src/ops/mod.rs#L1443)
from [cargo-update
17.0.0](https://github.com/nabijaczleweli/cargo-update/releases/v17.0.0).
### How to test and review this PR?
Observe
https://sources.debian.org/src/libsecret/0.20.5-3/libsecret/secret-schema.h/#L43
I suppose?
The type is
typedef struct {
const gchar *name;
SecretSchemaFlags flags;
SecretSchemaAttribute attributes[32];
/* <private> */
gint reserved;
gpointer reserved1;
gpointer reserved2;
gpointer reserved3;
gpointer reserved4;
gpointer reserved5;
gpointer reserved6;
gpointer reserved7;
} SecretSchema;
so the current object we give it is 8 pointers too short
It's incredibly lucky that libsecret, at this time,
only uses reserved, and not in any of the functions we call
### What does this PR try to resolve?
This is not necessary, as 32 is the default, and actually of the wrong
type now since it's a number now.
When planning to make these type mismatches error in
https://github.com/rust-lang/rust/pull/144218, cargo would fail here, so
I just removed it.
This custom target test very much shows how Cargo should be a subtree,
in this case it was fine because there's a compatible fix that I can
push now, otherwise it would have been very annoying.
### How to test and review this PR?
If the test suite passes, it works
This is not necessary, as 32 is the default, and actually of the wrong
type now since it's a number now.
When planning to make these type mismatches error, cargo would fail
here, so I just removed it.
This custom target test very much shows how Cargo should be a subtree,
in this case it was fine because there's a compatible fix that I can
push now, otherwise it would have been very annoying.
### What does this PR try to resolve?
Information about artifact dependencies is already available through
`cargo metadata`, and therefore also through serializing and re-parsing
`dependency.serialized()` using `serde_json::to_value` +
`serde_json::from_value`. This PR makes the same information available
directly through the library API of `cargo::core::Dependency`.
I ran into these private methods while working on
https://github.com/rust-lang/cargo/issues/15751.
### How to test and review this PR?
`cargo check`
The `[hints]` table in a `Cargo.toml` manifest provides optional
information that Cargo can use for building the package, and will use
even when using the package as a dependency. All hints can be safely
ignored, and Cargo only warns about unknown hints, but does not error.
This allows packages to use hints without depending on new Cargo.
Add a `mostly-unused` hint, which allows a package to hint that most
users of the package will not use most of its items. This is useful for
improving the build performance of crates with large dependencies.
Crates can override this hint using `hint-mostly-unused = false` in
their profile for a dependency.
---
In the future, this same mechanism could be used for other hints, such
as
`min-opt-level`.
### How to test and review this PR?
This PR is built atop https://github.com/rust-lang/cargo/pull/15643 .
I'd
suggest reviewing that PR separately, then just reviewing the new
commits in
this PR.
The new "hints" testsuite module demonstrates the expected behavior of
hints.
Like https://github.com/rust-lang/cargo/pull/15643 , the nightly-only
tests
will only pass once https://github.com/rust-lang/rust/pull/135656 has
been
merged into Rust.
The `[hints]` table in a `Cargo.toml` manifest provides optional
information that Cargo can use for building the package, and will use
even when using the package as a dependency. All hints can be safely
ignored, and Cargo only warns about unknown hints, but does not error.
This allows packages to use hints without depending on new Cargo.
Add a `mostly-unused` hint, which allows a package to hint that most
users of the package will not use most of its items. This is useful for
improving the build performance of crates with large dependencies.
Crates can override this hint using `hint-mostly-unused = false` in
their profile for a dependency.
These tests show what prior versions of Cargo will do with hints.
The subsequent addition of support for hints will modify these tests to
reflect the corresponding changes to Cargo.
Hi Everyone!
This is PR for the implementation of the first milestone of [GSoC
Project : Build Script
Delegation](https://summerofcode.withgoogle.com/programs/2025/projects/nUt4PdAA)
This will provide actual implementation for #15630
### What does this PR try to resolve?
Now, multiple build scripts are parsed, this PR aims to implement the
functioning the feature. This PR will allow users to 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.
Deferred
- Accessing each build script's `OUT_DIR`: This will be handled in a
follow up PR. For now, each build script writes to its own `OUT_DIR` and
`OUT_DIR` for the regular build targets is set to the build script with
the **lexicographically largest** name..
- User control over which build script wins in a conflict. This will be
handled in a follow up PR. If two build scripts write to the same env
variable, which gets applied to the binary? Currently, its the build
script with the **lexicographically largest** name. This makes it
deterministic. With some futzing, users can control this for now.
However, with build script delegation, users won't be able to control
this. We likely want it based off of the order the user assigns into the
build script array.
- Something about linking a C library is actually preferring
**lexicographically smallest** name. We should handle conflicts
consistently. We need to dig into what parts are doing it based on
smallest and make sure that whatever priority scheme we use for env
variables applies here as well.
### 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