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; std::shared_ptr<Store> _store;
}; };
struct Whence { std::string outputName; Path drvPath; };
typedef std::map<Path, Whence> Buildables;
struct Installable struct Installable
{ {
virtual std::string what() = 0; virtual std::string what() = 0;
virtual PathSet toBuildable() virtual Buildables toBuildable()
{ {
throw Error("argument %s cannot be built", what()); throw Error("argument %s cannot be built", what());
} }

View file

@ -67,9 +67,9 @@ struct InstallableStoreDrv : Installable
std::string what() override { return storePath; } 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; } 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; } std::string what() override { return text; }
PathSet toBuildable() override Buildables toBuildable() override
{ {
auto state = installables.getEvalState(); auto state = installables.getEvalState();
@ -110,10 +110,11 @@ struct InstallableExpr : Installable
DrvInfos drvs; DrvInfos drvs;
getDerivations(*state, *v, "", autoArgs, drvs, false); getDerivations(*state, *v, "", autoArgs, drvs, false);
PathSet res; Buildables res;
for (auto & i : drvs) for (auto & drv : drvs)
res.insert(i.queryDrvPath()); for (auto & output : drv.queryOutputs())
res.emplace(output.second, Whence{output.first, drv.queryDrvPath()});
return res; return res;
} }
@ -137,7 +138,7 @@ struct InstallableAttrPath : Installable
std::string what() override { return attrPath; } std::string what() override { return attrPath; }
PathSet toBuildable() override Buildables toBuildable() override
{ {
auto state = installables.getEvalState(); auto state = installables.getEvalState();
@ -150,10 +151,11 @@ struct InstallableAttrPath : Installable
DrvInfos drvs; DrvInfos drvs;
getDerivations(*state, *v, "", autoArgs, drvs, false); getDerivations(*state, *v, "", autoArgs, drvs, false);
PathSet res; Buildables res;
for (auto & i : drvs) for (auto & drv : drvs)
res.insert(i.queryDrvPath()); for (auto & output : drv.queryOutputs())
res.emplace(output.second, Whence{output.first, drv.queryDrvPath()});
return res; return res;
} }
@ -216,27 +218,22 @@ std::vector<std::shared_ptr<Installable>> InstallablesCommand::parseInstallables
PathSet InstallablesCommand::toStorePaths(ref<Store> store, ToStorePathsMode mode) PathSet InstallablesCommand::toStorePaths(ref<Store> store, ToStorePathsMode mode)
{ {
PathSet buildables; if (mode != DryRun)
settings.readOnlyMode = true;
for (auto & i : installables) { PathSet outPaths, buildables;
auto b = i->toBuildable();
buildables.insert(b.begin(), b.end()); 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) if (mode == DryRun)
printMissing(store, buildables); printMissing(store, buildables);
else if (mode == Build) else if (mode == Build)
store->buildPaths(buildables); 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; return outPaths;
} }

View file

@ -28,7 +28,8 @@ struct CmdLog : InstallablesCommand
subs.push_front(store); subs.push_front(store);
for (auto & inst : installables) { 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; bool found = false;
for (auto & sub : subs) { for (auto & sub : subs) {
auto log = sub->getBuildLog(path); auto log = sub->getBuildLog(path);