Support unused dependencies

Cargo stashes unused patches into a special section of the Cargo.lock
file:

```
[[patch.unused]]
name = "uuid"
version = "1.4.1"
source = "git+https://github.com/uuid-rs/uuid#50f70278de02c106650b8d6deb325dd59b5f2a24"
```

... a section that we, currently, don't read.

Ignoring that section causes the build to fail because even if the patch
is unused, when the source is unavailable, Cargo tries to fetch it
(which, understandably, is not possible inside the sandbox).

This commit extends our logic so that we download both the "used" and
"unused" dependencies.

Closes https://github.com/nix-community/naersk/issues/308.
This commit is contained in:
Patryk Wychowaniec 2023-09-06 14:05:28 +02:00
parent 3aa2c1e1ed
commit 3f976d822b
6 changed files with 46 additions and 1 deletions

View file

@ -99,7 +99,14 @@ rec
} // (lib.optionalAttrs (! isNull branch) { inherit branch; }) } // (lib.optionalAttrs (! isNull branch) { inherit branch; })
// (lib.optionalAttrs (! isNull tag) { inherit tag; }) // (lib.optionalAttrs (! isNull tag) { inherit tag; })
// (lib.optionalAttrs (! isNull rev) { inherit rev; }); // (lib.optionalAttrs (! isNull rev) { inherit rev; });
packageLocks = builtins.map parseLock (lib.filter query cargolock.package);
usedPackageLocks =
builtins.map parseLock (lib.filter query cargolock.package);
unusedPackageLocks =
builtins.map parseLock (lib.filter query ((cargolock.patch or []).unused or []));
packageLocks = usedPackageLocks ++ unusedPackageLocks;
mkFetch = lock: { mkFetch = lock: {
key = lock.rev or lock.tag or lock.branch or lock.revision key = lock.rev or lock.tag or lock.branch or lock.revision

View file

@ -16,6 +16,7 @@ args: {
simple-dep = import ./simple-dep args; simple-dep = import ./simple-dep args;
simple-dep-patched = import ./simple-dep-patched args; simple-dep-patched = import ./simple-dep-patched args;
symlinks = import ./symlinks args; symlinks = import ./symlinks args;
unused-patch = import ./unused-patch args;
workspace = import ./workspace args; workspace = import ./workspace args;
workspace-build-rs = import ./workspace-build-rs args; workspace-build-rs = import ./workspace-build-rs args;
workspace-patched = import ./workspace-patched args; workspace-patched = import ./workspace-patched args;

View file

@ -0,0 +1,15 @@
{ naersk, pkgs, ... }:
let
app = naersk.buildPackage {
src = ./fixtures;
};
in
if builtins.compareVersions pkgs.lib.version "22.11" <= 0 then
# Executing this test requires nixpkgs > 22.11 due to changes to the TOML
# serialization function.
#
# See `writeTOML` in this repository for more details.
true
else
app

View file

@ -0,0 +1,12 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "app"
version = "0.1.0"
[[patch.unused]]
name = "uuid"
version = "1.4.1"
source = "git+https://github.com/uuid-rs/uuid#50f70278de02c106650b8d6deb325dd59b5f2a24"

View file

@ -0,0 +1,7 @@
[package]
name = "app"
version = "0.1.0"
edition = "2018"
[patch.crates-io]
uuid = { git = "https://github.com/uuid-rs/uuid" }

View file

@ -0,0 +1,3 @@
fn main() {
println!("Hello, world!");
}