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:
Eelco Dolstra 2017-07-14 17:10:13 +02:00
parent 3908d3929c
commit fdc9da034f
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
3 changed files with 29 additions and 28 deletions

View file

@ -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());
}

View file

@ -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,11 +218,15 @@ 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)
@ -228,15 +234,6 @@ PathSet InstallablesCommand::toStorePaths(ref<Store> store, ToStorePathsMode mod
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;
}

View file

@ -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);