aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-11-17 14:59:49 +0100
committerGitHub <noreply@github.com>2020-11-17 14:59:49 +0100
commitf4e790cc854fd7b29a33309ef07535de761b9606 (patch)
tree5706f9c7805dfdda337cb764f2e2bf71f1dca133
parentdf5c69a94ef20c70bcff1602d9f00af5d32ab4e3 (diff)
parentd52b12c0a53f88b8ea9238d604f293b54c8ae51a (diff)
Merge pull request #4182 from mkenigs/fix-1930
Print built derivations as json for build
-rw-r--r--src/nix/build.cc6
-rw-r--r--src/nix/installables.cc27
-rw-r--r--src/nix/installables.hh5
-rw-r--r--tests/build.sh12
-rw-r--r--tests/local.mk3
5 files changed, 51 insertions, 2 deletions
diff --git a/src/nix/build.cc b/src/nix/build.cc
index 65708e98b..67be4024b 100644
--- a/src/nix/build.cc
+++ b/src/nix/build.cc
@@ -5,9 +5,11 @@
#include "store-api.hh"
#include "local-fs-store.hh"
+#include <nlohmann/json.hpp>
+
using namespace nix;
-struct CmdBuild : InstallablesCommand, MixDryRun, MixProfile
+struct CmdBuild : InstallablesCommand, MixDryRun, MixJSON, MixProfile
{
Path outLink = "result";
BuildMode buildMode = bmNormal;
@@ -86,6 +88,8 @@ struct CmdBuild : InstallablesCommand, MixDryRun, MixProfile
}, buildables[i]);
updateProfile(buildables);
+
+ if (json) logger->cout("%s", buildablesToJSON(buildables, store).dump());
}
};
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index 7473c9758..f385289e5 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -16,8 +16,35 @@
#include <regex>
#include <queue>
+#include <nlohmann/json.hpp>
+
namespace nix {
+nlohmann::json BuildableOpaque::toJSON(ref<Store> store) const {
+ nlohmann::json res;
+ res["path"] = store->printStorePath(path);
+ return res;
+}
+
+nlohmann::json BuildableFromDrv::toJSON(ref<Store> store) const {
+ nlohmann::json res;
+ res["drvPath"] = store->printStorePath(drvPath);
+ for (const auto& [output, path] : outputs) {
+ res["outputs"][output] = path ? store->printStorePath(*path) : "";
+ }
+ return res;
+}
+
+nlohmann::json buildablesToJSON(const Buildables & buildables, ref<Store> store) {
+ auto res = nlohmann::json::array();
+ for (const Buildable & buildable : buildables) {
+ std::visit([&res, store](const auto & buildable) {
+ res.push_back(buildable.toJSON(store));
+ }, buildable);
+ }
+ return res;
+}
+
void completeFlakeInputPath(
ref<EvalState> evalState,
const FlakeRef & flakeRef,
diff --git a/src/nix/installables.hh b/src/nix/installables.hh
index c7c2f8981..f37b3f829 100644
--- a/src/nix/installables.hh
+++ b/src/nix/installables.hh
@@ -7,6 +7,8 @@
#include <optional>
+#include <nlohmann/json_fwd.hpp>
+
namespace nix {
struct DrvInfo;
@@ -16,11 +18,13 @@ namespace eval_cache { class EvalCache; class AttrCursor; }
struct BuildableOpaque {
StorePath path;
+ nlohmann::json toJSON(ref<Store> store) const;
};
struct BuildableFromDrv {
StorePath drvPath;
std::map<std::string, std::optional<StorePath>> outputs;
+ nlohmann::json toJSON(ref<Store> store) const;
};
typedef std::variant<
@@ -29,6 +33,7 @@ typedef std::variant<
> Buildable;
typedef std::vector<Buildable> Buildables;
+nlohmann::json buildablesToJSON(const Buildables & buildables, ref<Store> store);
struct App
{
diff --git a/tests/build.sh b/tests/build.sh
new file mode 100644
index 000000000..aa54b88eb
--- /dev/null
+++ b/tests/build.sh
@@ -0,0 +1,12 @@
+source common.sh
+
+expectedJSONRegex='\[\{"drvPath":".*multiple-outputs-a.drv","outputs":\{"first":".*multiple-outputs-a-first","second":".*multiple-outputs-a-second"}},\{"drvPath":".*multiple-outputs-b.drv","outputs":\{"out":".*multiple-outputs-b"}}]'
+nix build -f multiple-outputs.nix --json a.all b.all | jq --exit-status '
+ (.[0] |
+ (.drvPath | match(".*multiple-outputs-a.drv")) and
+ (.outputs.first | match(".*multiple-outputs-a-first")) and
+ (.outputs.second | match(".*multiple-outputs-a-second")))
+ and (.[1] |
+ (.drvPath | match(".*multiple-outputs-b.drv")) and
+ (.outputs.out | match(".*multiple-outputs-b")))
+'
diff --git a/tests/local.mk b/tests/local.mk
index a1929f96d..ce94ec80e 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -35,7 +35,8 @@ nix_tests = \
recursive.sh \
describe-stores.sh \
flakes.sh \
- content-addressed.sh
+ content-addressed.sh \
+ build.sh
# parallel.sh
# build-remote-content-addressed-fixed.sh \