Avoid a call to derivationFromPath()
This doesn't work in read-only mode, ensuring that operations like nix path-info --store https://cache.nixos.org -S nixpkgs.hello (asking for the closure size of nixpkgs.hello in cache.nixos.org) work when nixpkgs.hello doesn't exist in the local store.
This commit is contained in:
		
							parent
							
								
									3908d3929c
								
							
						
					
					
						commit
						fdc9da034f
					
				
					 3 changed files with 29 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -44,11 +44,14 @@ private:
 | 
			
		|||
    std::shared_ptr<Store> _store;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct Whence { std::string outputName; Path drvPath; };
 | 
			
		||||
typedef std::map<Path, Whence> Buildables;
 | 
			
		||||
 | 
			
		||||
struct Installable
 | 
			
		||||
{
 | 
			
		||||
    virtual std::string what() = 0;
 | 
			
		||||
 | 
			
		||||
    virtual PathSet toBuildable()
 | 
			
		||||
    virtual Buildables toBuildable()
 | 
			
		||||
    {
 | 
			
		||||
        throw Error("argument ‘%s’ cannot be built", what());
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,9 +67,9 @@ struct InstallableStoreDrv : Installable
 | 
			
		|||
 | 
			
		||||
    std::string what() override { return storePath; }
 | 
			
		||||
 | 
			
		||||
    PathSet toBuildable() override
 | 
			
		||||
    Buildables toBuildable() override
 | 
			
		||||
    {
 | 
			
		||||
        return {storePath};
 | 
			
		||||
        return {{storePath, {}}};
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -81,9 +81,9 @@ struct InstallableStorePath : Installable
 | 
			
		|||
 | 
			
		||||
    std::string what() override { return storePath; }
 | 
			
		||||
 | 
			
		||||
    PathSet toBuildable() override
 | 
			
		||||
    Buildables toBuildable() override
 | 
			
		||||
    {
 | 
			
		||||
        return {storePath};
 | 
			
		||||
        return {{storePath, {}}};
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +97,7 @@ struct InstallableExpr : Installable
 | 
			
		|||
 | 
			
		||||
    std::string what() override { return text; }
 | 
			
		||||
 | 
			
		||||
    PathSet toBuildable() override
 | 
			
		||||
    Buildables toBuildable() override
 | 
			
		||||
    {
 | 
			
		||||
        auto state = installables.getEvalState();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -110,10 +110,11 @@ struct InstallableExpr : Installable
 | 
			
		|||
        DrvInfos drvs;
 | 
			
		||||
        getDerivations(*state, *v, "", autoArgs, drvs, false);
 | 
			
		||||
 | 
			
		||||
        PathSet res;
 | 
			
		||||
        Buildables res;
 | 
			
		||||
 | 
			
		||||
        for (auto & i : drvs)
 | 
			
		||||
            res.insert(i.queryDrvPath());
 | 
			
		||||
        for (auto & drv : drvs)
 | 
			
		||||
            for (auto & output : drv.queryOutputs())
 | 
			
		||||
                res.emplace(output.second, Whence{output.first, drv.queryDrvPath()});
 | 
			
		||||
 | 
			
		||||
        return res;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -137,7 +138,7 @@ struct InstallableAttrPath : Installable
 | 
			
		|||
 | 
			
		||||
    std::string what() override { return attrPath; }
 | 
			
		||||
 | 
			
		||||
    PathSet toBuildable() override
 | 
			
		||||
    Buildables toBuildable() override
 | 
			
		||||
    {
 | 
			
		||||
        auto state = installables.getEvalState();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -150,10 +151,11 @@ struct InstallableAttrPath : Installable
 | 
			
		|||
        DrvInfos drvs;
 | 
			
		||||
        getDerivations(*state, *v, "", autoArgs, drvs, false);
 | 
			
		||||
 | 
			
		||||
        PathSet res;
 | 
			
		||||
        Buildables res;
 | 
			
		||||
 | 
			
		||||
        for (auto & i : drvs)
 | 
			
		||||
            res.insert(i.queryDrvPath());
 | 
			
		||||
        for (auto & drv : drvs)
 | 
			
		||||
            for (auto & output : drv.queryOutputs())
 | 
			
		||||
                res.emplace(output.second, Whence{output.first, drv.queryDrvPath()});
 | 
			
		||||
 | 
			
		||||
        return res;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -216,27 +218,22 @@ std::vector<std::shared_ptr<Installable>> InstallablesCommand::parseInstallables
 | 
			
		|||
 | 
			
		||||
PathSet InstallablesCommand::toStorePaths(ref<Store> store, ToStorePathsMode mode)
 | 
			
		||||
{
 | 
			
		||||
    PathSet buildables;
 | 
			
		||||
    if (mode != DryRun)
 | 
			
		||||
        settings.readOnlyMode = true;
 | 
			
		||||
 | 
			
		||||
    for (auto & i : installables) {
 | 
			
		||||
        auto b = i->toBuildable();
 | 
			
		||||
        buildables.insert(b.begin(), b.end());
 | 
			
		||||
    }
 | 
			
		||||
    PathSet outPaths, buildables;
 | 
			
		||||
 | 
			
		||||
    for (auto & i : installables)
 | 
			
		||||
        for (auto & b : i->toBuildable()) {
 | 
			
		||||
            outPaths.insert(b.first);
 | 
			
		||||
            buildables.insert(b.second.drvPath != "" ? b.second.drvPath : b.first);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    if (mode == DryRun)
 | 
			
		||||
        printMissing(store, buildables);
 | 
			
		||||
    else if (mode == Build)
 | 
			
		||||
        store->buildPaths(buildables);
 | 
			
		||||
 | 
			
		||||
    PathSet outPaths;
 | 
			
		||||
    for (auto & path : buildables)
 | 
			
		||||
        if (isDerivation(path)) {
 | 
			
		||||
            Derivation drv = store->derivationFromPath(path);
 | 
			
		||||
            for (auto & output : drv.outputs)
 | 
			
		||||
                outPaths.insert(output.second.path);
 | 
			
		||||
        } else
 | 
			
		||||
            outPaths.insert(path);
 | 
			
		||||
 | 
			
		||||
    return outPaths;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,8 @@ struct CmdLog : InstallablesCommand
 | 
			
		|||
        subs.push_front(store);
 | 
			
		||||
 | 
			
		||||
        for (auto & inst : installables) {
 | 
			
		||||
            for (auto & path : inst->toBuildable()) {
 | 
			
		||||
            for (auto & b : inst->toBuildable()) {
 | 
			
		||||
                auto path = b.second.drvPath != "" ? b.second.drvPath : b.first;
 | 
			
		||||
                bool found = false;
 | 
			
		||||
                for (auto & sub : subs) {
 | 
			
		||||
                    auto log = sub->getBuildLog(path);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue