#include "command.hh" #include "store-api.hh" #include "fs-accessor.hh" #include "nar-accessor.hh" #include "progress-bar.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); auto file = accessor->readFile(path); stopProgressBar(); writeFull(STDOUT_FILENO, file); } }; struct CmdCatStore : StoreCommand, MixCat { CmdCatStore() { expectArgs({ .label = "path", .handler = {&path}, .completer = completePath }); } std::string description() override { return "print the contents of a file in the Nix store on stdout"; } std::string doc() override { return #include "store-cat.md" ; } void run(ref store) override { cat(store->getFSAccessor()); } }; struct CmdCatNar : StoreCommand, MixCat { Path narPath; CmdCatNar() { expectArgs({ .label = "nar", .handler = {&narPath}, .completer = completePath }); expectArg("path", &path); } std::string description() override { return "print the contents of a file inside a NAR file on stdout"; } std::string doc() override { return #include "nar-cat.md" ; } void run(ref store) override { cat(makeNarAccessor(readFile(narPath))); } }; static auto rCmdCatStore = registerCommand2({"store", "cat"}); static auto rCmdCatNar = registerCommand2({"nar", "cat"});