Decouple within-build (structured attrs) and unstable CLI path info JSON

See code comment for details.

Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
This commit is contained in:
John Ericson 2024-05-31 11:01:22 -04:00
parent c50e14276e
commit 213a7a87b4

View file

@ -135,18 +135,37 @@ static std::regex shVarName("[A-Za-z_][A-Za-z0-9_]*");
/** /**
* Write a JSON representation of store object metadata, such as the * Write a JSON representation of store object metadata, such as the
* hash and the references. * hash and the references.
*
* @note Do *not* use `ValidPathInfo::toJSON` because this function is
* subject to stronger stability requirements since it is used to
* prepare build environments. Perhaps someday we'll have a versionining
* mechanism to allow this to evolve again and get back in sync, but for
* now we must not change - not even extend - the behavior.
*/ */
static nlohmann::json pathInfoToJSON( static nlohmann::json pathInfoToJSON(
Store & store, Store & store,
const StorePathSet & storePaths) const StorePathSet & storePaths)
{ {
nlohmann::json::array_t jsonList = nlohmann::json::array(); using nlohmann::json;
nlohmann::json::array_t jsonList = json::array();
for (auto & storePath : storePaths) { for (auto & storePath : storePaths) {
auto info = store.queryPathInfo(storePath); auto info = store.queryPathInfo(storePath);
auto & jsonPath = jsonList.emplace_back( auto & jsonPath = jsonList.emplace_back(json::object());
info->toJSON(store, false, HashFormat::Nix32));
jsonPath["narHash"] = info->narHash.to_string(HashFormat::Nix32, true);
jsonPath["narSize"] = info->narSize;
{
auto & jsonRefs = jsonPath["references"] = json::array();
for (auto & ref : info->references)
jsonRefs.emplace_back(store.printStorePath(ref));
}
if (info->ca)
jsonPath["ca"] = renderContentAddress(info->ca);
// Add the path to the object whose metadata we are including. // Add the path to the object whose metadata we are including.
jsonPath["path"] = store.printStorePath(storePath); jsonPath["path"] = store.printStorePath(storePath);