Make StorePathsCommand a subclass of InstallablesCommand
This allows commands like 'nix path-info', 'nix copy', 'nix verify' etc. to work on arbitrary installables. E.g. to copy geeqie to a binary cache: $ nix copy -r --to file:///tmp/binary-cache nixpkgs.geeqie Or to get the closure size of thunderbird: $ nix path-info -S nixpkgs.thunderbird
This commit is contained in:
		
							parent
							
								
									c769841bc4
								
							
						
					
					
						commit
						7ee81f3887
					
				
					 2 changed files with 33 additions and 24 deletions
				
			
		| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
#include "command.hh"
 | 
					#include "command.hh"
 | 
				
			||||||
#include "store-api.hh"
 | 
					#include "store-api.hh"
 | 
				
			||||||
 | 
					#include "derivations.hh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace nix {
 | 
					namespace nix {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,23 +99,32 @@ void StoreCommand::run()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
StorePathsCommand::StorePathsCommand()
 | 
					StorePathsCommand::StorePathsCommand()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    expectArgs("paths", &storePaths);
 | 
					 | 
				
			||||||
    mkFlag('r', "recursive", "apply operation to closure of the specified paths", &recursive);
 | 
					    mkFlag('r', "recursive", "apply operation to closure of the specified paths", &recursive);
 | 
				
			||||||
    mkFlag(0, "all", "apply operation to the entire store", &all);
 | 
					    mkFlag(0, "all", "apply operation to the entire store", &all);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void StorePathsCommand::run(ref<Store> store)
 | 
					void StorePathsCommand::run(ref<Store> store)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    Paths storePaths;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (all) {
 | 
					    if (all) {
 | 
				
			||||||
        if (storePaths.size())
 | 
					        if (installables.size())
 | 
				
			||||||
            throw UsageError("‘--all’ does not expect arguments");
 | 
					            throw UsageError("‘--all’ does not expect arguments");
 | 
				
			||||||
        for (auto & p : store->queryAllValidPaths())
 | 
					        for (auto & p : store->queryAllValidPaths())
 | 
				
			||||||
            storePaths.push_back(p);
 | 
					            storePaths.push_back(p);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        for (auto & storePath : storePaths)
 | 
					        for (auto & i : installables) {
 | 
				
			||||||
            storePath = store->followLinksToStorePath(storePath);
 | 
					            for (auto & path : i->toBuildable()) {
 | 
				
			||||||
 | 
					                if (isDerivation(path)) {
 | 
				
			||||||
 | 
					                    Derivation drv = store->derivationFromPath(path);
 | 
				
			||||||
 | 
					                    for (auto & output : drv.outputs)
 | 
				
			||||||
 | 
					                        storePaths.push_back(output.second.path);
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                    storePaths.push_back(path);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (recursive) {
 | 
					        if (recursive) {
 | 
				
			||||||
            PathSet closure;
 | 
					            PathSet closure;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,26 +44,6 @@ private:
 | 
				
			||||||
    std::shared_ptr<Store> _store;
 | 
					    std::shared_ptr<Store> _store;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* A command that operates on zero or more store paths. */
 | 
					 | 
				
			||||||
struct StorePathsCommand : public StoreCommand
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Paths storePaths;
 | 
					 | 
				
			||||||
    bool recursive = false;
 | 
					 | 
				
			||||||
    bool all = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    StorePathsCommand();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    using StoreCommand::run;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    virtual void run(ref<Store> store, Paths storePaths) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void run(ref<Store> store) override;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct Installable
 | 
					struct Installable
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    virtual std::string what() = 0;
 | 
					    virtual std::string what() = 0;
 | 
				
			||||||
| 
						 | 
					@ -115,6 +95,25 @@ private:
 | 
				
			||||||
    Value * vSourceExpr = 0;
 | 
					    Value * vSourceExpr = 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* A command that operates on zero or more store paths. */
 | 
				
			||||||
 | 
					struct StorePathsCommand : public InstallablesCommand
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool recursive = false;
 | 
				
			||||||
 | 
					    bool all = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    StorePathsCommand();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    using StoreCommand::run;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    virtual void run(ref<Store> store, Paths storePaths) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void run(ref<Store> store) override;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef std::map<std::string, ref<Command>> Commands;
 | 
					typedef std::map<std::string, ref<Command>> Commands;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* An argument parser that supports multiple subcommands,
 | 
					/* An argument parser that supports multiple subcommands,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue