lix/src/nix/cat.cc
Eelco Dolstra 00b2c05749 nix: Add commands to query contents of NARs / binary caches
For example,

  $ NIX_REMOTE=file:///my-cache nix ls-store -lR /nix/store/f4kbgl8shhyy76rkk3nbxr0lz8d2ip7q-binutils-2.23.1
  dr-xr-xr-x                    0 ./bin
  -r-xr-xr-x                30748 ./bin/addr2line
  -r-xr-xr-x                66973 ./bin/ar
  ...

Similarly, "nix ls-nar" lists the contents of a NAR file, "nix
cat-nar" extracts a file from a NAR file, and "nix cat-store" extract
a file from a Nix store.
2016-02-25 17:57:00 +01:00

75 lines
1.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "command.hh"
#include "store-api.hh"
#include "fs-accessor.hh"
#include "nar-accessor.hh"
using namespace nix;
struct MixCat : virtual Args
{
std::string path;
void cat(ref<FSAccessor> accessor)
{
auto st = accessor->stat(path);
if (st.type == FSAccessor::Type::tMissing)
throw Error(format("path %1% does not exist") % path);
if (st.type != FSAccessor::Type::tRegular)
throw Error(format("path %1% is not a regular file") % path);
std::cout << accessor->readFile(path);
}
};
struct CmdCatStore : StoreCommand, MixCat
{
CmdCatStore()
{
expectArg("path", &path);
}
std::string name() override
{
return "cat-store";
}
std::string description() override
{
return "print the contents of a store file on stdout";
}
void run(ref<Store> store) override
{
cat(store->getFSAccessor());
}
};
struct CmdCatNar : StoreCommand, MixCat
{
Path narPath;
CmdCatNar()
{
expectArg("nar", &narPath);
expectArg("path", &path);
}
std::string name() override
{
return "cat-nar";
}
std::string description() override
{
return "print the contents of a file inside a NAR file";
}
void run(ref<Store> store) override
{
cat(makeNarAccessor(make_ref<std::string>(readFile(narPath))));
}
};
static RegisterCommand r1(make_ref<CmdCatStore>());
static RegisterCommand r2(make_ref<CmdCatNar>());