From ad228d84e56aeb1b5f77ae3bd3f8272f00782a8c Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sun, 10 Sep 2017 15:58:30 +0200 Subject: nix build: Only download the requested derivation outputs Also some refactoring. --- src/nix/installables.cc | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) (limited to 'src/nix/installables.cc') diff --git a/src/nix/installables.cc b/src/nix/installables.cc index f3c7d3075fe8..76df05fa32d2 100644 --- a/src/nix/installables.cc +++ b/src/nix/installables.cc @@ -240,7 +240,17 @@ static std::vector> parseInstallables( return result; } -Buildables InstallablesCommand::toBuildables(ref store, RealiseMode mode) +std::shared_ptr parseInstallable( + SourceExprCommand & cmd, ref store, const std::string & installable, + bool useDefaultInstallables) +{ + auto installables = parseInstallables(cmd, store, {installable}, false); + assert(installables.size() == 1); + return installables.front(); +} + +Buildables toBuildables(ref store, RealiseMode mode, + std::vector> installables) { if (mode != Build) settings.readOnlyMode = true; @@ -251,8 +261,13 @@ Buildables InstallablesCommand::toBuildables(ref store, RealiseMode mode) for (auto & i : installables) { for (auto & b : i->toBuildables()) { - if (b.drvPath != "") - pathsToBuild.insert(b.drvPath); + if (b.drvPath != "") { + StringSet outputNames; + for (auto & output : b.outputs) + outputNames.insert(output.first); + pathsToBuild.insert( + b.drvPath + "!" + concatStringsSep(",", outputNames)); + } buildables.push_back(std::move(b)); } } @@ -265,17 +280,29 @@ Buildables InstallablesCommand::toBuildables(ref store, RealiseMode mode) return buildables; } -PathSet InstallablesCommand::toStorePaths(ref store, RealiseMode mode) +PathSet toStorePaths(ref store, RealiseMode mode, + std::vector> installables) { PathSet outPaths; - for (auto & b : toBuildables(store, mode)) + for (auto & b : toBuildables(store, mode, installables)) for (auto & output : b.outputs) outPaths.insert(output.second); return outPaths; } +Path toStorePath(ref store, RealiseMode mode, + std::shared_ptr installable) +{ + auto paths = toStorePaths(store, mode, {installable}); + + if (paths.size() != 1) + throw Error("argument '%s' should evaluate to one store path", installable->what()); + + return *paths.begin(); +} + void InstallablesCommand::prepare() { installables = parseInstallables(*this, getStore(), _installables, useDefaultInstallables()); @@ -283,9 +310,7 @@ void InstallablesCommand::prepare() void InstallableCommand::prepare() { - auto installables = parseInstallables(*this, getStore(), {_installable}, false); - assert(installables.size() == 1); - installable = installables.front(); + installable = parseInstallable(*this, getStore(), _installable, false); } } -- cgit 1.4.1