about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-10-03T19·35-0400
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-10-03T19·35-0400
commit2bbc4a214ee998816921cefb2d69f30d5f277d12 (patch)
treec0df3ee463f1797c011a4852c6fa7f8322ff3297
parent2e90a5a2a7646f4ab36202d6a149518ccb6f750e (diff)
nix-env: Support ‘--repair’ flag
-rw-r--r--src/libstore/build.cc6
-rw-r--r--src/nix-env/nix-env.cc4
-rw-r--r--src/nix-env/user-env.cc4
3 files changed, 9 insertions, 5 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index b62991dff0f3..d05ff75064fe 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -1105,8 +1105,10 @@ void DerivationGoal::repairClosure()
         if (worker.store.pathContentsGood(*i)) continue;
         printMsg(lvlError, format("found corrupted or missing path `%1%' in the output closure of `%2%'") % *i % drvPath);
         Path drvPath2 = outputsToDrv[*i];
-        if (drvPath2 == "") throw Error(format("don't know how to repair corrupted or missing path `%1%'") % *i);
-        addWaitee(worker.makeDerivationGoal(drvPath2, true));
+        if (drvPath2 == "")
+            addWaitee(worker.makeSubstitutionGoal(*i, true));
+        else
+            addWaitee(worker.makeDerivationGoal(drvPath2, true));
     }
 
     if (waitees.empty()) {
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index dd2fa30481f7..d9b48e81c9fd 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -702,7 +702,7 @@ static void opSet(Globals & globals,
         PathSet paths = singleton<PathSet>(drv.queryDrvPath(globals.state));
         printMissing(*store, paths);
         if (globals.dryRun) return;
-        store->buildPaths(paths);
+        store->buildPaths(paths, globals.state.repair);
     }
     else {
         printMissing(*store, singleton<PathSet>(drv.queryOutPath(globals.state)));
@@ -1317,6 +1317,8 @@ void run(Strings args)
             globals.instSource.systemFilter = needArg(i, args, arg);
         else if (arg == "--prebuilt-only" || arg == "-b")
             globals.prebuiltOnly = true;
+        else if (arg == "--repair")
+            globals.state.repair = true;
         else {
             remaining.push_back(arg);
             if (arg[0] == '-') {
diff --git a/src/nix-env/user-env.cc b/src/nix-env/user-env.cc
index 510c5ca38179..d7de17901031 100644
--- a/src/nix-env/user-env.cc
+++ b/src/nix-env/user-env.cc
@@ -45,7 +45,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
             drvsToBuild.insert(i->queryDrvPath(state));
 
     debug(format("building user environment dependencies"));
-    store->buildPaths(drvsToBuild);
+    store->buildPaths(drvsToBuild, state.repair);
 
     /* Construct the whole top level derivation. */
     PathSet references;
@@ -132,7 +132,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
     
     /* Realise the resulting store expression. */
     debug("building user environment");
-    store->buildPaths(singleton<PathSet>(topLevelDrv.queryDrvPath(state)));
+    store->buildPaths(singleton<PathSet>(topLevelDrv.queryDrvPath(state)), state.repair);
 
     /* Switch the current user environment to the output path. */
     PathLocks lock;