#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 accessor) { auto st = accessor->stat(path); if (st.type == FSAccessor::Type::tMissing) throw Error("path '%1%' does not exist", path); if (st.type != FSAccessor::Type::tRegular) throw Error("path '%1%' is not a regular file", path); std::cout << accessor->readFile(path); } }; struct CmdCatStore : StoreCommand, MixCat { CmdCatStore() { expectArg("path", &path); } std::string description() override { return "print the contents of a store file on stdout"; } void run(ref store) override { cat(store->getFSAccessor()); } }; struct CmdCatNar : StoreCommand, MixCat { Path narPath; CmdCatNar() { expectArg("nar", &narPath); expectArg("path", &path); } std::string description() override { return "print the contents of a file inside a NAR file"; } void run(ref store) override { cat(makeNarAccessor(make_ref(readFile(narPath)))); } }; static auto r1 = registerCommand("cat-store"); static auto r2 = registerCommand("cat-nar");