diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 0440af95f..339445aa0 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -480,8 +480,12 @@ void Store::pathInfoToJSON(JSONPlaceholder & jsonOut, const PathSet & storePaths if (info->ca != "") jsonPath.attr("ca", info->ca); - if (showClosureSize) - jsonPath.attr("closureSize", getClosureSize(storePath)); + std::pair closureSizes; + + if (showClosureSize) { + closureSizes = getClosureSize(storePath); + jsonPath.attr("closureSize", closureSizes.first); + } if (includeImpureInfo) { @@ -500,6 +504,17 @@ void Store::pathInfoToJSON(JSONPlaceholder & jsonOut, const PathSet & storePaths jsonSigs.elem(sig); } + auto narInfo = std::dynamic_pointer_cast( + std::shared_ptr(info)); + + if (narInfo) { + if (narInfo->fileHash) + jsonPath.attr("downloadHash", narInfo->fileHash.to_string()); + if (narInfo->fileSize) + jsonPath.attr("downloadSize", narInfo->fileSize); + if (showClosureSize) + jsonPath.attr("closureDownloadSize", closureSizes.second); + } } } catch (InvalidPath &) { @@ -509,14 +524,20 @@ void Store::pathInfoToJSON(JSONPlaceholder & jsonOut, const PathSet & storePaths } -unsigned long long Store::getClosureSize(const Path & storePath) +std::pair Store::getClosureSize(const Path & storePath) { - unsigned long long totalSize = 0; + uint64_t totalNarSize = 0, totalDownloadSize = 0; PathSet closure; computeFSClosure(storePath, closure, false, false); - for (auto & p : closure) - totalSize += queryPathInfo(p)->narSize; - return totalSize; + for (auto & p : closure) { + auto info = queryPathInfo(p); + totalNarSize += info->narSize; + auto narInfo = std::dynamic_pointer_cast( + std::shared_ptr(info)); + if (narInfo) + totalDownloadSize += narInfo->fileSize; + } + return {totalNarSize, totalDownloadSize}; } diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh index 586d35e84..3247a6767 100644 --- a/src/libstore/store-api.hh +++ b/src/libstore/store-api.hh @@ -495,7 +495,7 @@ public: /* Return the size of the closure of the specified path, that is, the sum of the size of the NAR serialisation of each path in the closure. */ - unsigned long long getClosureSize(const Path & storePath); + std::pair getClosureSize(const Path & storePath); /* Optimise the disk space usage of the Nix store by hard-linking files with the same contents. */ diff --git a/src/nix/path-info.cc b/src/nix/path-info.cc index f7610ab08..ca02a4c92 100644 --- a/src/nix/path-info.cc +++ b/src/nix/path-info.cc @@ -84,7 +84,7 @@ struct CmdPathInfo : StorePathsCommand, MixJSON std::cout << '\t' << std::setw(11) << info->narSize; if (showClosureSize) - std::cout << '\t' << std::setw(11) << store->getClosureSize(storePath); + std::cout << '\t' << std::setw(11) << store->getClosureSize(storePath).first; if (showSigs) { std::cout << '\t';