From 7d82fd16e94aa07f53fa41f188ec33dea7399a99 Mon Sep 17 00:00:00 2001 From: Wouter den Breejen Date: Tue, 9 Oct 2007 21:12:02 +0000 Subject: [PATCH] Merged R9433 --- src/libexpr/primops.cc | 57 +++++++++++++++++++------------------ src/libstore/gc.cc | 38 +++++++++++++++++++------ src/libstore/local-store.cc | 21 ++++++++++---- src/libutil/util.cc | 5 ++-- 4 files changed, 76 insertions(+), 45 deletions(-) diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 17118364b..0e1bd72af 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -903,36 +903,37 @@ static Expr prim_hasAttr(EvalState & state, const ATermVector & args) } -/* takes - * param: list of { attr="attr"; value=value } - * returns an attribute set - * */ +/* Builds an attribute set from a list specifying (name, value) + pairs. To be precise, a list [{name = "name1"; value = value1;} + ... {name = "nameN"; value = valueN;}] is transformed to {name1 = + value1; ... nameN = valueN;}. */ static Expr prim_listToAttrs(EvalState & state, const ATermVector & args) { - try { - ATermMap res = ATermMap(); - - ATermList list; - list = evalList(state, args[0]); - for (ATermIterator i(list); i; ++i){ - // *i should now contain a pointer to the list item expression - ATermList attrs; - Expr evaledExpr = evalExpr(state, *i); - if (matchAttrs(evaledExpr, attrs)){ - Expr e = evalExpr(state, makeSelect(evaledExpr, toATerm("attr"))); - string attr = evalStringNoCtx(state,e); - Expr r = makeSelect(evaledExpr, toATerm("value")); - res.set(toATerm(attr), makeAttrRHS(r, makeNoPos())); - } - else { - throw EvalError(format("passed list item is a %s (value: %s). Set { attr=\"name\"; value=nix expr; } expected.") % showType(evaledExpr) % showValue(evaledExpr)); - } - } // for - return makeAttrs(res); - } catch (Error & e) { - e.addPrefix(format("in `listToAttrs':\n")); - throw; - } + try { + ATermMap res = ATermMap(); + ATermList list; + list = evalList(state, args[0]); + for (ATermIterator i(list); i; ++i){ + // *i should now contain a pointer to the list item expression + ATermList attrs; + Expr evaledExpr = evalExpr(state, *i); + if (matchAttrs(evaledExpr, attrs)){ + Expr e = evalExpr(state, makeSelect(evaledExpr, toATerm("name"))); + string attr = evalStringNoCtx(state,e); + Expr r = makeSelect(evaledExpr, toATerm("value")); + res.set(toATerm(attr), makeAttrRHS(r, makeNoPos())); + } + else + throw TypeError(format("list element in `listToAttrs' is %s, expected a set { name = \"\"; value = ; }") + % showType(evaledExpr)); + } + + return makeAttrs(res); + + } catch (Error & e) { + e.addPrefix(format("in `listToAttrs':\n")); + throw; + } } static Expr prim_removeAttrs(EvalState & state, const ATermVector & args) diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 66a89f6a0..8288a7e14 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -456,11 +456,12 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete, /* Find the roots. Since we've grabbed the GC lock, the set of permanent roots cannot increase now. */ - Roots rootMap = ignoreLiveness ? Roots() : nix::findRoots(true); //TODO Also find state roots? TODO include sharing of state. + Roots rootMap = ignoreLiveness ? Roots() : nix::findRoots(true); //TODO Also find state roots --> nah ? TODO include sharing of state. PathSet roots; for (Roots::iterator i = rootMap.begin(); i != rootMap.end(); ++i) roots.insert(i->second); + /* Add additional roots returned by the program specified by the NIX_ROOT_FINDER environment variable. This is typically used @@ -479,7 +480,7 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete, PathSet livePaths; for (PathSet::const_iterator i = roots.begin(); i != roots.end(); ++i){ printMsg(lvlError, format("CHECK '%1%'") % *i); - computeFSClosure(canonPath(*i), livePaths, true, false, 0); //TODO !!!!!!!!!!!!!!!!!!!!!!!!!!! WE (MAY) ALSO NEED TO DELETE STATE?? + computeFSClosure(canonPath(*i), livePaths, true, false, 0); //TODO !!!!!!!!!! ALSO STATEPATHS TRUE??? } @@ -487,15 +488,36 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete, for (PathSet::iterator i = livePaths.begin(); i != livePaths.end(); ++i) { - printMsg(lvlError, format("CHECK2 '%1%'") % *i); - /* Note that the deriver need not be valid (e.g., if we + if (store->isStateComponent(*i)){ + printMsg(lvlError, format("CHECK-STATE-STORE '%1%'") % *i); + //we select ALL state Derivations here + PathSet derivers = store->queryDerivers(*i, "*", "*"); + + for (PathSet::const_iterator j = derivers.begin(); j != derivers.end(); ++j) + // We send each drv to computeFSClosure + if (*j != "" && store->isValidPath(*j)) + computeFSClosure(*j, livePaths, true, false, 0); //TODO !!!!!!!!!! ALSO STATEPATHS TRUE??? + } + else if (store->isValidPath(*i)){ + printMsg(lvlError, format("CHECK-STORE '%1%'") % *i); + Path deriver = store->queryDeriver(*i); + printMsg(lvlError, format("CHECK-STORE DRV '%1%'") % deriver); + + /* Note that the deriver need not be valid (e.g., if we previously ran the collector with `gcKeepDerivations' turned off). */ - Path deriver = store->queryDeriver(*i); - if (deriver != "" && store->isValidPath(deriver)) - computeFSClosure(deriver, livePaths, true, false, 0); //TODO !!!!!!!!!!!!!!!!!!!!!!!!!!! WE (MAY) ALSO NEED TO KEEP STATE + if (deriver != "" && store->isValidPath(deriver)) + computeFSClosure(deriver, livePaths, true, false, 0); //TODO !!!!!!!!!! ALSO STATEPATHS TRUE??? + } + + //else if (store->isValidStatePath(*i)){ + + else + throw Error(format("path `%1%' is not a valid state/store path") % *i); } } + + printMsg(lvlError, format("STAGE X")); if (gcKeepOutputs) { /* Hmz, identical to storePathRequisites in nix-store. */ @@ -619,7 +641,7 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete, /* Okay, it's safe to delete. */ try { unsigned long long freed; - deleteFromStore(*i, freed); + //deleteFromStore(*i, freed); //TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PUT BACK ON bytesFreed += freed; } catch (PathInUse & e) { printMsg(lvlError, format("warning: %1%") % e.msg()); diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 9dfeaf99b..34eed5275 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -745,9 +745,18 @@ static Path queryDeriver(const Transaction & txn, const Path & storePath) bool b = nixDB.queryString(txn, dbDerivers, storePath, deriver); - Derivation drv = derivationFromPathTxn(txn, deriver); - if (isStateDrv(drv)) - throw Error(format("This deriver `%1%' is a state deriver, u should use queryDerivers instead of queryDeriver") % deriver); + /* Note that the deriver need not be valid (e.g., if we + previously ran the garbage collector with `gcKeepDerivations' + turned off). */ + if(deriver == ""){ + printMsg(lvlTalkative, format("WARNING: Path '%1%' has no deriver anymore") % storePath); + return ""; + } + + //TODO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //Derivation drv = derivationFromPathTxn(txn, deriver); //We cant do this (at this point) since the drv might not exist .... + //if (isStateDrv(drv)) + // throw Error(format("This deriver `%1%' is a state deriver, u should use queryDerivers instead of queryDeriver") % deriver); if (b) return deriver; @@ -876,9 +885,9 @@ Hash LocalStore::queryPathHash(const Path & path) return queryHash(noTxn, path); } -Path queryStatePathDrvTxn(const Transaction & txn, const Path & statePath) -{ - string s; +Path queryStatePathDrvTxn(const Transaction & txn, const Path & statePath) //TODO !!!!!!!!!!!!!!!!!!!!!! A STATEPATH CAN HAVE MORE THEN JUST ONE DRV!!!!!!!!!!!!!!!!!!!!!!! +{ //SOLUTION: make dbValidStatePaths :: statepath --> storepath + string s; //query includes username and identifier ....?? nixDB.queryString(txn, dbValidStatePaths, statePath, s); return s; } diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 4a1ff59ea..4f44f2ed8 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -371,9 +371,8 @@ void writeStringToFile(const Path & path, const string & s) LogType logType = ltPretty; -Verbosity verbosity = lvlInfo; -//Verbosity verbosity = lvlDebug; -//Verbosity verbosity = lvlVomit; +Verbosity verbosity = lvlInfo; //Default +//Verbosity verbosity = lvlVomit; //Debugging static int nestingLevel = 0;