mirror of
https://github.com/NixOS/nix.git
synced 2025-12-16 05:51:05 +01:00
Bring nix derivation show in compliance with JSON guidelines
This matches what we just did for `nix path-info`, and I hope will allow
us to avoiding any more breaking changes to this command for the
foreseeable future.
(cherry picked from commit 0f18076f3a)
This commit is contained in:
parent
72f62e1b19
commit
231d5b41ed
9 changed files with 34 additions and 11 deletions
|
|
@ -180,6 +180,21 @@ Additionally the following fields are added to both formats:
|
||||||
|
|
||||||
The derivation JSON format has been updated from version 3 to version 4:
|
The derivation JSON format has been updated from version 3 to version 4:
|
||||||
|
|
||||||
|
- **Nested structure with top-level metadata**:
|
||||||
|
|
||||||
|
The output of `nix derivation show` is now wrapped in an object with `version` and `derivations` fields:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"derivations": { ... }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The map from derivation paths to derivation info is nested under the `derivations` field.
|
||||||
|
|
||||||
|
This matches the structure used for `nix path-info --json --json-format 2`, and likewise brings this command into compliance with the JSON guidelines.
|
||||||
|
|
||||||
- **Restructured inputs**:
|
- **Restructured inputs**:
|
||||||
|
|
||||||
Inputs are now nested under an `inputs` object:
|
Inputs are now nested under an `inputs` object:
|
||||||
|
|
|
||||||
|
|
@ -1489,8 +1489,6 @@ adl_serializer<DerivationOutput>::from_json(const json & _json, const Experiment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned constexpr expectedJsonVersionDerivation = 4;
|
|
||||||
|
|
||||||
void adl_serializer<Derivation>::to_json(json & res, const Derivation & d)
|
void adl_serializer<Derivation>::to_json(json & res, const Derivation & d)
|
||||||
{
|
{
|
||||||
res = nlohmann::json::object();
|
res = nlohmann::json::object();
|
||||||
|
|
|
||||||
|
|
@ -586,6 +586,12 @@ void writeDerivation(Sink & out, const StoreDirConfig & store, const BasicDeriva
|
||||||
*/
|
*/
|
||||||
std::string hashPlaceholder(const OutputNameView outputName);
|
std::string hashPlaceholder(const OutputNameView outputName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The expected JSON version for derivation serialization.
|
||||||
|
* Used by `nix derivation show` and `nix derivation add`.
|
||||||
|
*/
|
||||||
|
constexpr unsigned expectedJsonVersionDerivation = 4;
|
||||||
|
|
||||||
} // namespace nix
|
} // namespace nix
|
||||||
|
|
||||||
JSON_IMPL_WITH_XP_FEATURES(nix::DerivationOutput)
|
JSON_IMPL_WITH_XP_FEATURES(nix::DerivationOutput)
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,11 @@ struct CmdShowDerivation : InstallablesCommand, MixPrintJSON
|
||||||
|
|
||||||
jsonRoot[drvPath.to_string()] = store->readDerivation(drvPath);
|
jsonRoot[drvPath.to_string()] = store->readDerivation(drvPath);
|
||||||
}
|
}
|
||||||
printJSON(jsonRoot);
|
printJSON(
|
||||||
|
nlohmann::json{
|
||||||
|
{"version", expectedJsonVersionDerivation},
|
||||||
|
{"derivations", std::move(jsonRoot)},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ export NIX_TESTS_CA_BY_DEFAULT=1
|
||||||
|
|
||||||
drvPath=$(nix-instantiate ../simple.nix)
|
drvPath=$(nix-instantiate ../simple.nix)
|
||||||
|
|
||||||
nix derivation show "$drvPath" | jq .[] > "$TEST_HOME"/simple.json
|
nix derivation show "$drvPath" | jq '.derivations[]' > "$TEST_HOME"/simple.json
|
||||||
|
|
||||||
drvPath2=$(nix derivation add < "$TEST_HOME"/simple.json)
|
drvPath2=$(nix derivation add < "$TEST_HOME"/simple.json)
|
||||||
|
|
||||||
|
|
@ -27,5 +27,5 @@ drvPath4=$(nix derivation add < "$TEST_HOME"/foo.json)
|
||||||
[[ -e "$drvPath3" ]]
|
[[ -e "$drvPath3" ]]
|
||||||
|
|
||||||
# The modified derivation read back as JSON matches
|
# The modified derivation read back as JSON matches
|
||||||
nix derivation show "$drvPath3" | jq .[] > "$TEST_HOME"/foo-read.json
|
nix derivation show "$drvPath3" | jq '.derivations[]' > "$TEST_HOME"/foo-read.json
|
||||||
diff "$TEST_HOME"/foo.json "$TEST_HOME"/foo-read.json
|
diff "$TEST_HOME"/foo.json "$TEST_HOME"/foo-read.json
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ source common.sh
|
||||||
|
|
||||||
drvPath=$(nix-instantiate simple.nix)
|
drvPath=$(nix-instantiate simple.nix)
|
||||||
|
|
||||||
nix derivation show "$drvPath" | jq '.[]' > "$TEST_HOME/simple.json"
|
nix derivation show "$drvPath" | jq '.derivations[]' > "$TEST_HOME/simple.json"
|
||||||
|
|
||||||
# Round tripping to JSON works
|
# Round tripping to JSON works
|
||||||
drvPath2=$(nix derivation add < "$TEST_HOME/simple.json")
|
drvPath2=$(nix derivation add < "$TEST_HOME/simple.json")
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ mkDerivation rec {
|
||||||
PATH=${builtins.getEnv "EXTRA_PATH"}:$PATH
|
PATH=${builtins.getEnv "EXTRA_PATH"}:$PATH
|
||||||
|
|
||||||
# JSON of pre-existing drv
|
# JSON of pre-existing drv
|
||||||
nix derivation show $drv | jq .[] > drv0.json
|
nix derivation show $drv | jq '.derivations[]' > drv0.json
|
||||||
|
|
||||||
# Fix name
|
# Fix name
|
||||||
jq < drv0.json '.name = "${innerName}"' > drv1.json
|
jq < drv0.json '.name = "${innerName}"' > drv1.json
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ printf 0 > "$TEST_ROOT"/counter
|
||||||
|
|
||||||
# `nix derivation add` with impure derivations work
|
# `nix derivation add` with impure derivations work
|
||||||
drvPath=$(nix-instantiate ./impure-derivations.nix -A impure)
|
drvPath=$(nix-instantiate ./impure-derivations.nix -A impure)
|
||||||
nix derivation show "$drvPath" | jq .[] > "$TEST_HOME"/impure-drv.json
|
nix derivation show "$drvPath" | jq '.derivations[]' > "$TEST_HOME"/impure-drv.json
|
||||||
drvPath2=$(nix derivation add < "$TEST_HOME"/impure-drv.json)
|
drvPath2=$(nix derivation add < "$TEST_HOME"/impure-drv.json)
|
||||||
[[ "$drvPath" = "$drvPath2" ]]
|
[[ "$drvPath" = "$drvPath2" ]]
|
||||||
|
|
||||||
|
|
@ -50,8 +50,8 @@ path4=$(nix build -L --no-link --json --file ./impure-derivations.nix impureOnIm
|
||||||
(! nix build -L --no-link --json --file ./impure-derivations.nix inputAddressed 2>&1) | grep 'depends on impure derivation'
|
(! nix build -L --no-link --json --file ./impure-derivations.nix inputAddressed 2>&1) | grep 'depends on impure derivation'
|
||||||
|
|
||||||
drvPath=$(nix eval --json --file ./impure-derivations.nix impure.drvPath | jq -r .)
|
drvPath=$(nix eval --json --file ./impure-derivations.nix impure.drvPath | jq -r .)
|
||||||
[[ $(nix derivation show "$drvPath" | jq ".[\"$(basename "$drvPath")\"].outputs.out.impure") = true ]]
|
[[ $(nix derivation show "$drvPath" | jq ".derivations[\"$(basename "$drvPath")\"].outputs.out.impure") = true ]]
|
||||||
[[ $(nix derivation show "$drvPath" | jq ".[\"$(basename "$drvPath")\"].outputs.stuff.impure") = true ]]
|
[[ $(nix derivation show "$drvPath" | jq ".derivations[\"$(basename "$drvPath")\"].outputs.stuff.impure") = true ]]
|
||||||
|
|
||||||
# Fixed-output derivations *can* depend on impure derivations.
|
# Fixed-output derivations *can* depend on impure derivations.
|
||||||
path5=$(nix build -L --no-link --json --file ./impure-derivations.nix contentAddressed | jq -r .[].outputs.out)
|
path5=$(nix build -L --no-link --json --file ./impure-derivations.nix contentAddressed | jq -r .[].outputs.out)
|
||||||
|
|
|
||||||
|
|
@ -49,4 +49,4 @@ expectStderr 0 nix-instantiate --expr "$hackyExpr" --eval --strict | grepQuiet "
|
||||||
|
|
||||||
# Check it works with the expected structured attrs
|
# Check it works with the expected structured attrs
|
||||||
hacky=$(nix-instantiate --expr "$hackyExpr")
|
hacky=$(nix-instantiate --expr "$hackyExpr")
|
||||||
nix derivation show "$hacky" | jq --exit-status '."'"$(basename "$hacky")"'".structuredAttrs | . == {"a": 1}'
|
nix derivation show "$hacky" | jq --exit-status '.derivations."'"$(basename "$hacky")"'".structuredAttrs | . == {"a": 1}'
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue