aboutsummaryrefslogtreecommitdiff
path: root/src/nix/profile.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2022-05-04 10:44:26 +0200
committerFelix Uhl <felix.uhl@netlight.com>2023-07-03 12:23:57 +0200
commita353412c43e776f4fdc709dc7affd1dbb9d588be (patch)
tree164ee70cfc6ec784353bce0d9eacdcbd133f75ad /src/nix/profile.cc
parentb8e8f27159251091141ccd6db12dd2d07204771a (diff)
nix profile list: Add --json flag
This just dumps the profile manifest to stdout.
Diffstat (limited to 'src/nix/profile.cc')
-rw-r--r--src/nix/profile.cc34
1 files changed, 19 insertions, 15 deletions
diff --git a/src/nix/profile.cc b/src/nix/profile.cc
index ae2e8f4f1..b833b5192 100644
--- a/src/nix/profile.cc
+++ b/src/nix/profile.cc
@@ -168,7 +168,7 @@ struct ProfileManifest
}
}
- std::string toJSON(Store & store) const
+ nlohmann::json toJSON(Store & store) const
{
auto array = nlohmann::json::array();
for (auto & element : elements) {
@@ -190,7 +190,7 @@ struct ProfileManifest
nlohmann::json json;
json["version"] = 2;
json["elements"] = array;
- return json.dump();
+ return json;
}
StorePath build(ref<Store> store)
@@ -210,7 +210,7 @@ struct ProfileManifest
buildProfile(tempDir, std::move(pkgs));
- writeFile(tempDir + "/manifest.json", toJSON(*store));
+ writeFile(tempDir + "/manifest.json", toJSON(*store).dump());
/* Add the symlink tree to the store. */
StringSink sink;
@@ -635,7 +635,7 @@ struct CmdProfileUpgrade : virtual SourceExprCommand, MixDefaultProfile, MixProf
}
};
-struct CmdProfileList : virtual EvalCommand, virtual StoreCommand, MixDefaultProfile
+struct CmdProfileList : virtual EvalCommand, virtual StoreCommand, MixDefaultProfile, MixJSON
{
std::string description() override
{
@@ -653,18 +653,22 @@ struct CmdProfileList : virtual EvalCommand, virtual StoreCommand, MixDefaultPro
{
ProfileManifest manifest(*getEvalState(), *profile);
- for (size_t i = 0; i < manifest.elements.size(); ++i) {
- auto & element(manifest.elements[i]);
- if (i) logger->cout("");
- logger->cout("Index: " ANSI_BOLD "%s" ANSI_NORMAL "%s",
- i,
- element.active ? "" : " " ANSI_RED "(inactive)" ANSI_NORMAL);
- if (element.source) {
- logger->cout("Flake attribute: %s%s", element.source->attrPath, element.source->outputs.to_string());
- logger->cout("Original flake URL: %s", element.source->originalRef.to_string());
- logger->cout("Locked flake URL: %s", element.source->lockedRef.to_string());
+ if (json) {
+ std::cout << manifest.toJSON(*store).dump() << "\n";
+ } else {
+ for (size_t i = 0; i < manifest.elements.size(); ++i) {
+ auto & element(manifest.elements[i]);
+ if (i) logger->cout("");
+ logger->cout("Index: " ANSI_BOLD "%s" ANSI_NORMAL "%s",
+ i,
+ element.active ? "" : " " ANSI_RED "(inactive)" ANSI_NORMAL);
+ if (element.source) {
+ logger->cout("Flake attribute: %s%s", element.source->attrPath, element.source->outputs.to_string());
+ logger->cout("Original flake URL: %s", element.source->originalRef.to_string());
+ logger->cout("Locked flake URL: %s", element.source->lockedRef.to_string());
+ }
+ logger->cout("Store paths: %s", concatStringsSep(" ", store->printStorePathSet(element.storePaths)));
}
- logger->cout("Store paths: %s", concatStringsSep(" ", store->printStorePathSet(element.storePaths)));
}
}
};