forked from lix-project/lix
Merge pull request #6277 from thufschmitt/ca/nix-build-dry-run
Fix `nix build --dry-run` with CA derivations
This commit is contained in:
commit
6afc361798
|
@ -11,6 +11,21 @@ nlohmann::json DerivedPath::Opaque::toJSON(ref<Store> store) const {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nlohmann::json DerivedPath::Built::toJSON(ref<Store> store) const {
|
||||||
|
nlohmann::json res;
|
||||||
|
res["drvPath"] = store->printStorePath(drvPath);
|
||||||
|
// Fallback for the input-addressed derivation case: We expect to always be
|
||||||
|
// able to print the output paths, so let’s do it
|
||||||
|
auto knownOutputs = store->queryPartialDerivationOutputMap(drvPath);
|
||||||
|
for (const auto& output : outputs) {
|
||||||
|
if (knownOutputs.at(output))
|
||||||
|
res["outputs"][output] = store->printStorePath(knownOutputs.at(output).value());
|
||||||
|
else
|
||||||
|
res["outputs"][output] = nullptr;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
nlohmann::json BuiltPath::Built::toJSON(ref<Store> store) const {
|
nlohmann::json BuiltPath::Built::toJSON(ref<Store> store) const {
|
||||||
nlohmann::json res;
|
nlohmann::json res;
|
||||||
res["drvPath"] = store->printStorePath(drvPath);
|
res["drvPath"] = store->printStorePath(drvPath);
|
||||||
|
@ -35,16 +50,22 @@ StorePathSet BuiltPath::outPaths() const
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
nlohmann::json derivedPathsWithHintsToJSON(const BuiltPaths & buildables, ref<Store> store) {
|
template<typename T>
|
||||||
|
nlohmann::json stuffToJSON(const std::vector<T> & ts, ref<Store> store) {
|
||||||
auto res = nlohmann::json::array();
|
auto res = nlohmann::json::array();
|
||||||
for (const BuiltPath & buildable : buildables) {
|
for (const T & t : ts) {
|
||||||
std::visit([&res, store](const auto & buildable) {
|
std::visit([&res, store](const auto & t) {
|
||||||
res.push_back(buildable.toJSON(store));
|
res.push_back(t.toJSON(store));
|
||||||
}, buildable.raw());
|
}, t.raw());
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nlohmann::json derivedPathsWithHintsToJSON(const BuiltPaths & buildables, ref<Store> store)
|
||||||
|
{ return stuffToJSON<BuiltPath>(buildables, store); }
|
||||||
|
nlohmann::json derivedPathsToJSON(const DerivedPaths & paths, ref<Store> store)
|
||||||
|
{ return stuffToJSON<DerivedPath>(paths, store); }
|
||||||
|
|
||||||
|
|
||||||
std::string DerivedPath::Opaque::to_string(const Store & store) const {
|
std::string DerivedPath::Opaque::to_string(const Store & store) const {
|
||||||
return store.printStorePath(path);
|
return store.printStorePath(path);
|
||||||
|
|
|
@ -45,6 +45,7 @@ struct DerivedPathBuilt {
|
||||||
|
|
||||||
std::string to_string(const Store & store) const;
|
std::string to_string(const Store & store) const;
|
||||||
static DerivedPathBuilt parse(const Store & store, std::string_view);
|
static DerivedPathBuilt parse(const Store & store, std::string_view);
|
||||||
|
nlohmann::json toJSON(ref<Store> store) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
using _DerivedPathRaw = std::variant<
|
using _DerivedPathRaw = std::variant<
|
||||||
|
@ -119,5 +120,6 @@ typedef std::vector<DerivedPath> DerivedPaths;
|
||||||
typedef std::vector<BuiltPath> BuiltPaths;
|
typedef std::vector<BuiltPath> BuiltPaths;
|
||||||
|
|
||||||
nlohmann::json derivedPathsWithHintsToJSON(const BuiltPaths & buildables, ref<Store> store);
|
nlohmann::json derivedPathsWithHintsToJSON(const BuiltPaths & buildables, ref<Store> store);
|
||||||
|
nlohmann::json derivedPathsToJSON(const DerivedPaths & , ref<Store> store);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,15 +52,26 @@ struct CmdBuild : InstallablesCommand, MixDryRun, MixJSON, MixProfile
|
||||||
|
|
||||||
void run(ref<Store> store) override
|
void run(ref<Store> store) override
|
||||||
{
|
{
|
||||||
|
if (dryRun) {
|
||||||
|
std::vector<DerivedPath> pathsToBuild;
|
||||||
|
|
||||||
|
for (auto & i : installables) {
|
||||||
|
auto b = i->toDerivedPaths();
|
||||||
|
pathsToBuild.insert(pathsToBuild.end(), b.begin(), b.end());
|
||||||
|
}
|
||||||
|
printMissing(store, pathsToBuild, lvlError);
|
||||||
|
if (json)
|
||||||
|
logger->cout("%s", derivedPathsToJSON(pathsToBuild, store).dump());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto buildables = Installable::build(
|
auto buildables = Installable::build(
|
||||||
getEvalStore(), store,
|
getEvalStore(), store,
|
||||||
dryRun ? Realise::Derivation : Realise::Outputs,
|
Realise::Outputs,
|
||||||
installables, buildMode);
|
installables, buildMode);
|
||||||
|
|
||||||
if (json) logger->cout("%s", derivedPathsWithHintsToJSON(buildables, store).dump());
|
if (json) logger->cout("%s", derivedPathsWithHintsToJSON(buildables, store).dump());
|
||||||
|
|
||||||
if (dryRun) return;
|
|
||||||
|
|
||||||
if (outLink != "")
|
if (outLink != "")
|
||||||
if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>())
|
if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>())
|
||||||
for (const auto & [_i, buildable] : enumerate(buildables)) {
|
for (const auto & [_i, buildable] : enumerate(buildables)) {
|
||||||
|
|
|
@ -50,3 +50,22 @@ nix build -f dependencies.nix -o $RESULT --dry-run
|
||||||
nix build -f dependencies.nix -o $RESULT
|
nix build -f dependencies.nix -o $RESULT
|
||||||
|
|
||||||
[[ -h $RESULT ]]
|
[[ -h $RESULT ]]
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
# Check the JSON output
|
||||||
|
clearStore
|
||||||
|
clearCache
|
||||||
|
|
||||||
|
RES=$(nix build -f dependencies.nix --dry-run --json)
|
||||||
|
|
||||||
|
if [[ -z "$NIX_TESTS_CA_BY_DEFAULT" ]]; then
|
||||||
|
echo "$RES" | jq '.[0] | [
|
||||||
|
(.drvPath | test("'$NIX_STORE_DIR'.*\\.drv")),
|
||||||
|
(.outputs.out | test("'$NIX_STORE_DIR'"))
|
||||||
|
] | all'
|
||||||
|
else
|
||||||
|
echo "$RES" | jq '.[0] | [
|
||||||
|
(.drvPath | test("'$NIX_STORE_DIR'.*\\.drv")),
|
||||||
|
.outputs.out == null
|
||||||
|
] | all'
|
||||||
|
fi
|
||||||
|
|
6
tests/ca/build-dry.sh
Normal file
6
tests/ca/build-dry.sh
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
source common.sh
|
||||||
|
|
||||||
|
export NIX_TESTS_CA_BY_DEFAULT=1
|
||||||
|
|
||||||
|
cd .. && source build-dry.sh
|
||||||
|
|
Loading…
Reference in a new issue