mirror of
https://github.com/nix-community/dream2nix.git
synced 2024-12-25 23:41:42 +03:00
fix(rust): normalize dependencies inherited from workspace (#463)
This commit is contained in:
parent
029dcc6358
commit
d91e7381fa
48
src/subsystems/rust/builders/patch-workspace-deps.jq
Normal file
48
src/subsystems/rust/builders/patch-workspace-deps.jq
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
def normalizeWorkspaceDep:
|
||||||
|
if ($workspaceDependencies."\(.key)" | type) == "object"
|
||||||
|
then [., $workspaceDependencies."\(.key)"] | add
|
||||||
|
else [., {"version":$workspaceDependencies."\(.key)"}] | add
|
||||||
|
end
|
||||||
|
# remove workspace option from the dependency
|
||||||
|
| del(.workspace)
|
||||||
|
;
|
||||||
|
|
||||||
|
# normalizes workspace inherited dependencies for one list
|
||||||
|
def mapWorkspaceDepsFor(name):
|
||||||
|
if has(name)
|
||||||
|
then
|
||||||
|
."\(name)" = (
|
||||||
|
."\(name)"
|
||||||
|
| to_entries
|
||||||
|
| map(
|
||||||
|
if (.value | type) == "object" and .value.workspace == true
|
||||||
|
then .value = (.value | normalizeWorkspaceDep)
|
||||||
|
else .
|
||||||
|
end
|
||||||
|
)
|
||||||
|
| from_entries
|
||||||
|
)
|
||||||
|
else .
|
||||||
|
end
|
||||||
|
;
|
||||||
|
|
||||||
|
# shorthand for normalizing all the dependencies list
|
||||||
|
def mapWorkspaceDeps:
|
||||||
|
mapWorkspaceDepsFor("dependencies")
|
||||||
|
| mapWorkspaceDepsFor("dev-dependencies")
|
||||||
|
| mapWorkspaceDepsFor("build-dependencies")
|
||||||
|
;
|
||||||
|
|
||||||
|
# normalize workspace inherited deps
|
||||||
|
mapWorkspaceDeps
|
||||||
|
| if has("target")
|
||||||
|
then
|
||||||
|
# normalize workspace inherited deps in target specific deps
|
||||||
|
.target = (
|
||||||
|
.target
|
||||||
|
| to_entries
|
||||||
|
| map(.value = (.value | mapWorkspaceDeps))
|
||||||
|
| from_entries
|
||||||
|
)
|
||||||
|
else .
|
||||||
|
end
|
@ -49,18 +49,21 @@ in rec {
|
|||||||
sources = l.map makeSource deps;
|
sources = l.map makeSource deps;
|
||||||
|
|
||||||
findCrateSource = source: let
|
findCrateSource = source: let
|
||||||
inherit (pkgs) cargo jq;
|
cargo = "${pkgs.cargo}/bin/cargo";
|
||||||
|
jq = "${pkgs.jq}/bin/jq";
|
||||||
|
yj = "${pkgs.yj}/bin/yj";
|
||||||
|
sponge = "${pkgs.moreutils}/bin/sponge";
|
||||||
pkg = source.dep;
|
pkg = source.dep;
|
||||||
in ''
|
in ''
|
||||||
# If the target package is in a workspace, or if it's the top-level
|
# If the target package is in a workspace, or if it's the top-level
|
||||||
# crate, we should find the crate path using `cargo metadata`.
|
# crate, we should find the crate path using `cargo metadata`.
|
||||||
crateCargoTOML=$(${cargo}/bin/cargo metadata --format-version 1 --no-deps --manifest-path $tree/Cargo.toml | \
|
crateCargoTOML=$(${cargo} metadata --format-version 1 --no-deps --manifest-path $tree/Cargo.toml | \
|
||||||
${jq}/bin/jq -r '.packages[] | select(.name == "${pkg.name}") | .manifest_path')
|
${jq} -r '.packages[] | select(.name == "${pkg.name}") | .manifest_path')
|
||||||
# If the repository is not a workspace the package might be in a subdirectory.
|
# If the repository is not a workspace the package might be in a subdirectory.
|
||||||
if [[ -z $crateCargoTOML ]]; then
|
if [[ -z $crateCargoTOML ]]; then
|
||||||
for manifest in $(find $tree -name "Cargo.toml"); do
|
for manifest in $(find $tree -name "Cargo.toml"); do
|
||||||
echo Looking at $manifest
|
echo Looking at $manifest
|
||||||
crateCargoTOML=$(${cargo}/bin/cargo metadata --format-version 1 --no-deps --manifest-path "$manifest" | ${jq}/bin/jq -r '.packages[] | select(.name == "${pkg.name}") | .manifest_path' || :)
|
crateCargoTOML=$(${cargo} metadata --format-version 1 --no-deps --manifest-path "$manifest" | ${jq} -r '.packages[] | select(.name == "${pkg.name}") | .manifest_path' || :)
|
||||||
if [[ ! -z $crateCargoTOML ]]; then
|
if [[ ! -z $crateCargoTOML ]]; then
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
@ -69,6 +72,20 @@ in rec {
|
|||||||
>&2 echo "Cannot find path for crate '${pkg.name}-${pkg.version}' in the tree in: $tree"
|
>&2 echo "Cannot find path for crate '${pkg.name}-${pkg.version}' in the tree in: $tree"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
# we need to patch dependencies with `workspace = true` (workspace inheritance)
|
||||||
|
workspaceDependencies="$(cat "$tree/Cargo.toml" | ${yj} -tj | ${jq} -cr '.workspace.dependencies')"
|
||||||
|
if [[ "$workspaceDependencies" != "null" ]]; then
|
||||||
|
tree="$(pwd)/${pkg.name}-${pkg.version}"
|
||||||
|
cp -prd --no-preserve=mode,ownership "$(dirname $crateCargoTOML)" "$tree"
|
||||||
|
crateCargoTOML="$tree/Cargo.toml"
|
||||||
|
cat "$crateCargoTOML" \
|
||||||
|
| ${yj} -tj \
|
||||||
|
| ${jq} -cr --argjson workspaceDependencies "$workspaceDependencies" \
|
||||||
|
--from-file ${./patch-workspace-deps.jq} \
|
||||||
|
| ${yj} -jt \
|
||||||
|
| ${sponge} "$crateCargoTOML"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
echo Found crate ${pkg.name} at $crateCargoTOML
|
echo Found crate ${pkg.name} at $crateCargoTOML
|
||||||
tree="$(dirname $crateCargoTOML)"
|
tree="$(dirname $crateCargoTOML)"
|
||||||
|
Loading…
Reference in New Issue
Block a user