* `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:
		
							parent
							
								
									42043953c3
								
							
						
					
					
						commit
						a1d310b6b5
					
				
					 4 changed files with 50 additions and 37 deletions
				
			
		|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue