mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-27 00:06:16 +02:00
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…
Reference in a new issue