diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2019-05-29 22:17:08 +0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2019-05-29 22:22:28 +0200 |
commit | 49436bdbb77f32ffec2035e836add04f98be49e3 (patch) | |
tree | dcac4ef693b8eeee60b130bceac8452946c3ef86 /src/nix/flake.cc | |
parent | 3488fa7c6cef487d3f9501e89894f9e632e678db (diff) |
nix flake info --json: List the "provides"
It also lists the contents of "checks" and "packages".
For example:
$ nix flake info --json | jq
{
"branch": "HEAD",
"description": "The purely functional package manager",
"epoch": 2019,
"id": "nix",
"lastModified": 1559161142,
"path": "/nix/store/2w2qla8735dbxah8gai8r1nsbf5x4f5d-source",
"provides": {
"checks": {
"binaryTarball": {},
"nix-copy-closure": {},
"perlBindings": {},
"remoteBuilds": {},
"setuid": {}
},
"defaultPackage": {},
"devShell": {},
"hydraJobs": {},
"packages": {
"nix": {},
"nix-perl-bindings": {}
}
},
"revCount": 6955,
"revision": "8cb24e04e8b6cc60e2504733afe78e0eadafcd98",
"uri": "/home/eelco/Dev/nix"
}
Fixes #2820.
Diffstat (limited to 'src/nix/flake.cc')
-rw-r--r-- | src/nix/flake.cc | 56 |
1 files changed, 41 insertions, 15 deletions
diff --git a/src/nix/flake.cc b/src/nix/flake.cc index 0be003da2..872ec2849 100644 --- a/src/nix/flake.cc +++ b/src/nix/flake.cc @@ -199,6 +199,19 @@ struct CmdFlakeUpdate : FlakeCommand } }; +static void enumerateProvides(EvalState & state, Value & vFlake, + std::function<void(const std::string & name, Value & vProvide)> callback) +{ + state.forceAttrs(vFlake); + + auto vProvides = (*vFlake.attrs->get(state.symbols.create("provides")))->value; + + state.forceAttrs(*vProvides); + + for (auto & attr : *vProvides->attrs) + callback(attr.name, *attr.value); +} + struct CmdFlakeInfo : FlakeCommand, MixJSON { std::string name() override @@ -215,25 +228,38 @@ struct CmdFlakeInfo : FlakeCommand, MixJSON { auto flake = getFlake(); stopProgressBar(); - if (json) - std::cout << flakeToJson(flake).dump() << std::endl; - else - printFlakeInfo(flake); - } -}; -static void enumerateProvides(EvalState & state, Value & vFlake, - std::function<void(const std::string & name, Value & vProvide)> callback) -{ - state.forceAttrs(vFlake); + if (json) { + auto json = flakeToJson(flake); - auto vProvides = (*vFlake.attrs->get(state.symbols.create("provides")))->value; + auto state = getEvalState(); - state.forceAttrs(*vProvides); + auto vFlake = state->allocValue(); + flake::callFlake(*state, flake, *vFlake); - for (auto & attr : *vProvides->attrs) - callback(attr.name, *attr.value); -} + auto provides = nlohmann::json::object(); + + enumerateProvides(*state, + *vFlake, + [&](const std::string & name, Value & vProvide) { + auto provide = nlohmann::json::object(); + + if (name == "checks" || name == "packages") { + state->forceAttrs(vProvide); + for (auto & aCheck : *vProvide.attrs) + provide[aCheck.name] = nlohmann::json::object(); + } + + provides[name] = provide; + }); + + json["provides"] = std::move(provides); + + std::cout << json.dump() << std::endl; + } else + printFlakeInfo(flake); + } +}; struct CmdFlakeCheck : FlakeCommand, MixJSON { |