diff --git a/src/nix/make-content-addressable.cc b/src/nix/make-content-addressable.cc index 524d467c2..f9c7fef3f 100644 --- a/src/nix/make-content-addressable.cc +++ b/src/nix/make-content-addressable.cc @@ -1,10 +1,12 @@ #include "command.hh" #include "store-api.hh" #include "references.hh" +#include "common-args.hh" +#include "json.hh" using namespace nix; -struct CmdMakeContentAddressable : StorePathsCommand +struct CmdMakeContentAddressable : StorePathsCommand, MixJSON { CmdMakeContentAddressable() { @@ -37,6 +39,9 @@ struct CmdMakeContentAddressable : StorePathsCommand std::map remappings; + auto jsonRoot = json ? std::make_unique(std::cout) : nullptr; + auto jsonRewrites = json ? std::make_unique(jsonRoot->object("rewrites")) : nullptr; + for (auto & path : paths) { auto pathS = store->printStorePath(path); auto oldInfo = store->queryPathInfo(path); @@ -76,7 +81,8 @@ struct CmdMakeContentAddressable : StorePathsCommand info.narSize = sink.s->size(); info.ca = makeFixedOutputCA(true, info.narHash); - printError("rewrote '%s' to '%s'", pathS, store->printStorePath(info.path)); + if (!json) + printError("rewrote '%s' to '%s'", pathS, store->printStorePath(info.path)); auto source = sinkToSource([&](Sink & nextSink) { RewritingSink rsink2(oldHashPart, storePathToHash(store->printStorePath(info.path)), nextSink); @@ -86,6 +92,9 @@ struct CmdMakeContentAddressable : StorePathsCommand store->addToStore(info, *source); + if (json) + jsonRewrites->attr(store->printStorePath(path), store->printStorePath(info.path)); + remappings.insert_or_assign(std::move(path), std::move(info.path)); } }