* `nix-store --realise': print what paths will be built/downloaded,

just like nix-env.
* `nix-store --realise': --dry-run option.
This commit is contained in:
Eelco Dolstra 2008-08-04 13:44:46 +00:00
parent 42043953c3
commit a1d310b6b5
4 changed files with 50 additions and 37 deletions

View File

@ -4,6 +4,7 @@
#include "globals.hh" #include "globals.hh"
#include "store-api.hh" #include "store-api.hh"
#include "util.hh" #include "util.hh"
#include "misc.hh"
#include <iostream> #include <iostream>
#include <cctype> #include <cctype>
@ -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) static void setLogType(string lt)
{ {
if (lt == "pretty") logType = ltPretty; if (lt == "pretty") logType = ltPretty;

View File

@ -26,6 +26,8 @@ namespace nix {
Path makeRootName(const Path & gcRoot, int & counter); Path makeRootName(const Path & gcRoot, int & counter);
void printGCWarning(); void printGCWarning();
void printMissing(const PathSet & paths);
unsigned long long getIntArg(const string & opt, unsigned long long getIntArg(const string & opt,
Strings::iterator & i, const Strings::iterator & end); Strings::iterator & i, const Strings::iterator & end);

View File

@ -531,8 +531,8 @@ static void queryInstSources(EvalState & state,
static void printMissing(EvalState & state, const DrvInfos & elems) static void printMissing(EvalState & state, const DrvInfos & elems)
{ {
PathSet targets, willBuild, willSubstitute, unknown; PathSet targets;
for (DrvInfos::const_iterator i = elems.begin(); i != elems.end(); ++i) { foreach (DrvInfos::const_iterator, i, elems) {
Path drvPath = i->queryDrvPath(state); Path drvPath = i->queryDrvPath(state);
if (drvPath != "") if (drvPath != "")
targets.insert(drvPath); targets.insert(drvPath);
@ -540,28 +540,7 @@ static void printMissing(EvalState & state, const DrvInfos & elems)
targets.insert(i->queryOutPath(state)); targets.insert(i->queryOutPath(state));
} }
unsigned long long downloadSize; printMissing(targets);
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);
}
} }

View File

@ -77,23 +77,26 @@ static Path realisePath(const Path & path)
/* Realise the given paths. */ /* Realise the given paths. */
static void opRealise(Strings opFlags, Strings opArgs) 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(); foreach (Strings::iterator, i, opArgs)
i != opArgs.end(); ++i)
*i = followLinksToStorePath(*i); *i = followLinksToStorePath(*i);
if (opArgs.size() > 1) { printMissing(PathSet(opArgs.begin(), opArgs.end()));
PathSet drvPaths;
for (Strings::iterator i = opArgs.begin(); if (dryRun) return;
i != opArgs.end(); ++i)
if (isDerivation(*i)) /* Build all derivations at the same time to exploit parallelism. */
drvPaths.insert(*i); PathSet drvPaths;
store->buildDerivations(drvPaths); foreach (Strings::iterator, i, opArgs)
} if (isDerivation(*i)) drvPaths.insert(*i);
store->buildDerivations(drvPaths);
for (Strings::iterator i = opArgs.begin(); foreach (Strings::iterator, i,opArgs)
i != opArgs.end(); ++i)
cout << format("%1%\n") % realisePath(*i); cout << format("%1%\n") % realisePath(*i);
} }