aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-05-29 22:17:08 +0200
committerEelco Dolstra <edolstra@gmail.com>2019-05-29 22:22:28 +0200
commit49436bdbb77f32ffec2035e836add04f98be49e3 (patch)
treedcac4ef693b8eeee60b130bceac8452946c3ef86
parent3488fa7c6cef487d3f9501e89894f9e632e678db (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.
-rw-r--r--src/nix/flake.cc56
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
{