From 766ad5db3b2e8678b649375e59191978671c821e Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 14 Jul 2017 17:36:49 +0200 Subject: [PATCH] nix path-info: Show download sizes for binary cache stores E.g. $ nix path-info --json --store https://cache.nixos.org nixpkgs.thunderbird -S ... "downloadHash": "sha256:1jlixpzi225wwa0f4xdrwrqgi47ip1qpj9p06fyxxg07sfmyi4q0", "downloadSize": 43047620, "closureDownloadSize": 84745960 } ] --- src/libstore/store-api.cc | 35 ++++++++++++++++++++++++++++------- src/libstore/store-api.hh | 2 +- src/nix/path-info.cc | 2 +- 3 files changed, 30 insertions(+), 9 deletions(-) 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';