forked from lix-project/lix
7d14f5c331
This allows commands like "nix verify --all" or "nix path-info --all" to work on S3 caches. Unfortunately, this requires some ugly hackery: when querying the contents of the bucket, we don't want to have to read every .narinfo file. But the S3 bucket keys only include the hash part of each store path, not the name part. So as a special exception queryAllValidPaths() can now return store paths *without* the name part, and queryPathInfo() accepts such store paths (returning a ValidPathInfo object containing the full name).
77 lines
2.2 KiB
C++
77 lines
2.2 KiB
C++
#include "command.hh"
|
|
#include "progress-bar.hh"
|
|
#include "shared.hh"
|
|
#include "store-api.hh"
|
|
|
|
#include <iomanip>
|
|
#include <algorithm>
|
|
|
|
using namespace nix;
|
|
|
|
struct CmdPathInfo : StorePathsCommand
|
|
{
|
|
bool showSize = false;
|
|
bool showClosureSize = false;
|
|
|
|
CmdPathInfo()
|
|
{
|
|
mkFlag('s', "size", "print size of the NAR dump of each path", &showSize);
|
|
mkFlag('S', "closure-size", "print sum size of the NAR dumps of the closure of each path", &showClosureSize);
|
|
}
|
|
|
|
std::string name() override
|
|
{
|
|
return "path-info";
|
|
}
|
|
|
|
std::string description() override
|
|
{
|
|
return "query information about store paths";
|
|
}
|
|
|
|
Examples examples() override
|
|
{
|
|
return {
|
|
Example{
|
|
"To show the closure sizes of every path in the current NixOS system closure, sorted by size:",
|
|
"nix path-info -rS /run/current-system | sort -nk2"
|
|
},
|
|
Example{
|
|
"To check the existence of a path in a binary cache:",
|
|
"nix path-info -r /nix/store/7qvk5c91...-geeqie-1.1 --store https://cache.nixos.org/"
|
|
},
|
|
};
|
|
}
|
|
|
|
void run(ref<Store> store, Paths storePaths) override
|
|
{
|
|
size_t pathLen = 0;
|
|
for (auto & storePath : storePaths)
|
|
pathLen = std::max(pathLen, storePath.size());
|
|
|
|
for (auto storePath : storePaths) {
|
|
auto info = store->queryPathInfo(storePath);
|
|
storePath = info->path; // FIXME: screws up padding
|
|
|
|
std::cout << storePath << std::string(std::max(0, (int) pathLen - (int) storePath.size()), ' ');
|
|
|
|
if (showSize) {
|
|
std::cout << '\t' << std::setw(11) << info->narSize;
|
|
}
|
|
|
|
if (showClosureSize) {
|
|
size_t totalSize = 0;
|
|
PathSet closure;
|
|
store->computeFSClosure(storePath, closure, false, false);
|
|
for (auto & p : closure)
|
|
totalSize += store->queryPathInfo(p)->narSize;
|
|
std::cout << '\t' << std::setw(11) << totalSize;
|
|
}
|
|
|
|
std::cout << std::endl;
|
|
}
|
|
}
|
|
};
|
|
|
|
static RegisterCommand r1(make_ref<CmdPathInfo>());
|