diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-10-03T19·35-0400 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-10-03T19·35-0400 |
commit | 2bbc4a214ee998816921cefb2d69f30d5f277d12 (patch) | |
tree | c0df3ee463f1797c011a4852c6fa7f8322ff3297 | |
parent | 2e90a5a2a7646f4ab36202d6a149518ccb6f750e (diff) |
nix-env: Support ‘--repair’ flag
-rw-r--r-- | src/libstore/build.cc | 6 | ||||
-rw-r--r-- | src/nix-env/nix-env.cc | 4 | ||||
-rw-r--r-- | src/nix-env/user-env.cc | 4 |
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; |