From a1d310b6b5c710215265c1cd0d5893248ed50f92 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 4 Aug 2008 13:44:46 +0000 Subject: [PATCH] * `nix-store --realise': print what paths will be built/downloaded, just like nix-env. * `nix-store --realise': --dry-run option. --- src/libmain/shared.cc | 29 +++++++++++++++++++++++++++++ src/libmain/shared.hh | 2 ++ src/nix-env/nix-env.cc | 27 +++------------------------ src/nix-store/nix-store.cc | 29 ++++++++++++++++------------- 4 files changed, 50 insertions(+), 37 deletions(-) diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 5a8f600e8d..fd16dece7d 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -4,6 +4,7 @@ #include "globals.hh" #include "store-api.hh" #include "util.hh" +#include "misc.hh" #include #include @@ -49,6 +50,34 @@ void printGCWarning() } +void printMissing(const PathSet & paths) +{ + unsigned long long downloadSize; + PathSet willBuild, willSubstitute, unknown; + queryMissing(paths, willBuild, willSubstitute, unknown, downloadSize); + + if (!willBuild.empty()) { + printMsg(lvlInfo, format("the following derivations will be built:")); + foreach (PathSet::iterator, i, willBuild) + printMsg(lvlInfo, format(" %1%") % *i); + } + + if (!willSubstitute.empty()) { + printMsg(lvlInfo, format("the following paths will be downloaded/copied (%.2f MiB):") % + (downloadSize / (1024.0 * 1024.0))); + foreach (PathSet::iterator, i, willSubstitute) + printMsg(lvlInfo, format(" %1%") % *i); + } + + if (!unknown.empty()) { + printMsg(lvlInfo, format("don't know how to build the following paths%1%:") + % (readOnlyMode ? " (may be caused by read-only store access)" : "")); + foreach (PathSet::iterator, i, unknown) + printMsg(lvlInfo, format(" %1%") % *i); + } +} + + static void setLogType(string lt) { if (lt == "pretty") logType = ltPretty; diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh index 95d80bacda..c432dc5f7b 100644 --- a/src/libmain/shared.hh +++ b/src/libmain/shared.hh @@ -26,6 +26,8 @@ namespace nix { Path makeRootName(const Path & gcRoot, int & counter); void printGCWarning(); +void printMissing(const PathSet & paths); + unsigned long long getIntArg(const string & opt, Strings::iterator & i, const Strings::iterator & end); diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index c3fe2d0896..2f2f263f54 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -531,8 +531,8 @@ static void queryInstSources(EvalState & state, static void printMissing(EvalState & state, const DrvInfos & elems) { - PathSet targets, willBuild, willSubstitute, unknown; - for (DrvInfos::const_iterator i = elems.begin(); i != elems.end(); ++i) { + PathSet targets; + foreach (DrvInfos::const_iterator, i, elems) { Path drvPath = i->queryDrvPath(state); if (drvPath != "") targets.insert(drvPath); @@ -540,28 +540,7 @@ static void printMissing(EvalState & state, const DrvInfos & elems) targets.insert(i->queryOutPath(state)); } - unsigned long long downloadSize; - queryMissing(targets, willBuild, willSubstitute, unknown, downloadSize); - - if (!willBuild.empty()) { - printMsg(lvlInfo, format("the following derivations will be built:")); - foreach (PathSet::iterator, i, willBuild) - printMsg(lvlInfo, format(" %1%") % *i); - } - - if (!willSubstitute.empty()) { - printMsg(lvlInfo, format("the following paths will be downloaded/copied (%.2f MiB):") % - (downloadSize / (1024.0 * 1024.0))); - foreach (PathSet::iterator, i, willSubstitute) - printMsg(lvlInfo, format(" %1%") % *i); - } - - if (!unknown.empty()) { - printMsg(lvlInfo, format("don't know how to build the following paths%1%:") - % (readOnlyMode ? " (may be caused by read-only store access)" : "")); - foreach (PathSet::iterator, i, unknown) - printMsg(lvlInfo, format(" %1%") % *i); - } + printMissing(targets); } diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index b59ff27bb3..0030745b46 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -77,23 +77,26 @@ static Path realisePath(const Path & path) /* Realise the given paths. */ static void opRealise(Strings opFlags, Strings opArgs) { - if (!opFlags.empty()) throw UsageError("unknown flag"); + bool dryRun = false; + + foreach (Strings::iterator, i, opFlags) + if (*i == "--dry-run") dryRun = true; + else throw UsageError(format("unknown flag `%1%'") % *i); - for (Strings::iterator i = opArgs.begin(); - i != opArgs.end(); ++i) + foreach (Strings::iterator, i, opArgs) *i = followLinksToStorePath(*i); - if (opArgs.size() > 1) { - PathSet drvPaths; - for (Strings::iterator i = opArgs.begin(); - i != opArgs.end(); ++i) - if (isDerivation(*i)) - drvPaths.insert(*i); - store->buildDerivations(drvPaths); - } + printMissing(PathSet(opArgs.begin(), opArgs.end())); + + if (dryRun) return; + + /* Build all derivations at the same time to exploit parallelism. */ + PathSet drvPaths; + foreach (Strings::iterator, i, opArgs) + if (isDerivation(*i)) drvPaths.insert(*i); + store->buildDerivations(drvPaths); - for (Strings::iterator i = opArgs.begin(); - i != opArgs.end(); ++i) + foreach (Strings::iterator, i,opArgs) cout << format("%1%\n") % realisePath(*i); }