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.
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #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>());
 |