From cce3dc63a02b34d61326dc155a933a91d6937ccc Mon Sep 17 00:00:00 2001 From: figsoda Date: Tue, 13 Dec 2022 11:22:07 -0500 Subject: rustPlatform.importCargoLock: add allowBuiltinFetchGit option --- doc/languages-frameworks/rust.section.md | 17 +++++++++++++++++ pkgs/build-support/rust/import-cargo-lock.nix | 27 +++++++++++++++++++-------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/doc/languages-frameworks/rust.section.md b/doc/languages-frameworks/rust.section.md index 3ede908fe089d..168120c7fca94 100644 --- a/doc/languages-frameworks/rust.section.md +++ b/doc/languages-frameworks/rust.section.md @@ -186,6 +186,23 @@ added. To find the correct hash, you can first use `lib.fakeSha256` or `lib.fakeHash` as a stub hash. Building the package (and thus the vendored dependencies) will then inform you of the correct hash. +For usage outside nixpkgs, `allowBuiltinFetchGit` could be used to +avoid having to specify `outputHashes`. For example: + +```nix +rustPlatform.buildRustPackage rec { + pname = "myproject"; + version = "1.0.0"; + + cargoLock = { + lockFile = ./Cargo.lock; + allowBuiltinFetchGit = true; + }; + + # ... +} +``` + ### Cargo features {#cargo-features} You can disable default features using `buildNoDefaultFeatures`, and diff --git a/pkgs/build-support/rust/import-cargo-lock.nix b/pkgs/build-support/rust/import-cargo-lock.nix index e571c01f95c5d..7a4ddec3ebd1d 100644 --- a/pkgs/build-support/rust/import-cargo-lock.nix +++ b/pkgs/build-support/rust/import-cargo-lock.nix @@ -7,6 +7,9 @@ # Cargo lock file contents as string , lockFileContents ? null + # Allow `builtins.fetchGit` to be used to not require hashes for git dependencies +, allowBuiltinFetchGit ? false + # Hashes for git dependencies. , outputHashes ? {} } @ args: @@ -38,14 +41,14 @@ let # There is no source attribute for the source package itself. But # since we do not want to vendor the source package anyway, we can # safely skip it. - depPackages = (builtins.filter (p: p ? "source") packages); + depPackages = builtins.filter (p: p ? "source") packages; # Create dependent crates from packages. # # Force evaluation of the git SHA -> hash mapping, so that an error is # thrown if there are stale hashes. We cannot rely on gitShaOutputHash # being evaluated otherwise, since there could be no git dependencies. - depCrates = builtins.deepSeq (gitShaOutputHash) (builtins.map mkCrate depPackages); + depCrates = builtins.deepSeq gitShaOutputHash (builtins.map mkCrate depPackages); # Map package name + version to git commit SHA for packages with a git source. namesGitShas = builtins.listToAttrs ( @@ -117,12 +120,20 @@ let If you use `buildRustPackage`, you can add this attribute to the `cargoLock` attribute set. ''; - sha256 = gitShaOutputHash.${gitParts.sha} or missingHash; - tree = fetchgit { - inherit sha256; - inherit (gitParts) url; - rev = gitParts.sha; # The commit SHA is always available. - }; + tree = + if gitShaOutputHash ? ${gitParts.sha} then + fetchgit { + inherit (gitParts) url; + rev = gitParts.sha; # The commit SHA is always available. + sha256 = gitShaOutputHash.${gitParts.sha}; + } + else if allowBuiltinFetchGit then + builtins.fetchGit { + inherit (gitParts) url; + rev = gitParts.sha; + } + else + missingHash; in runCommand "${pkg.name}-${pkg.version}" {} '' tree=${tree} -- cgit 1.4.1