1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-26 12:10:59 +01:00

added state options and state locations into drv

This commit is contained in:
Wouter den Breejen 2007-05-16 10:16:10 +00:00
parent b712f0f019
commit 4c63f18dcc
7 changed files with 120 additions and 14 deletions

View file

@ -393,9 +393,9 @@ static Expr prim_derivationStrict(EvalState & state, const ATermVector & args)
//state vars
bool enableState = false;
bool disableState = false;
string shareState = "none";
string syncState = "all";
StringSet dirs;
for (ATermMap::const_iterator i = attrs.begin(); i != attrs.end(); ++i) {
string key = aterm2String(i->key);
@ -424,10 +424,61 @@ static Expr prim_derivationStrict(EvalState & state, const ATermVector & args)
}
//state variables
else if(key == "dirs") { }
else if(key == "stateDirs") {
enableState = true;
value = evalExpr(state, value);
ATermList list = evalList(state, value);
printMsg(lvlError, format("DIRS `%1%'") % value);
printMsg(lvlError, format("DIRS `%1%'") % list);
for (ATermIterator j(list); j; ++j){
Expr v = evalExpr(state, *j);
printMsg(lvlError, format("DIRS2 `%1%'") % v);
ATermMap stateDirattrs;
queryAllAttrs(evalExpr(state, v), stateDirattrs, true);
DerivationStateOutputDir dir = DerivationStateOutputDir();
for (ATermMap::const_iterator k = stateDirattrs.begin(); k != stateDirattrs.end(); ++k) {
string statekey = aterm2String(k->key);
ATerm statevalue;
Expr statepos;
ATerm staterhs = k->value;
if (!matchAttrRHS(staterhs, statevalue, statepos)) abort();
startNest(nest, lvlVomit, format("processing statedir attribute `%1%'") % statekey);
try {
string s = coerceToString(state, statevalue, context, true);
printMsg(lvlError, format("DIRS4 `%1%'") % s);
if (statekey == "dir") { dir.path = s; }
else if (statekey == "type") { dir.type = s; }
else if (statekey == "interval") { dir.interval = s; }
else throw EvalError(format("invalid subattirbute `%1%' for attribute dirs") % statekey);
}
catch (Error & e) {
e.addPrefix(format("while evaluating the state derivation attribute `%1%' at %2%:\n") % key % showPos(statepos));
e.addPrefix(format("while instantiating the derivation named `%1%' at %2%:\n") % drvName % showPos(posDrvName));
throw;
}
}
drv.stateOutputDirs[dir.path] = dir;
//Expr e = queryAttr(v, "dir");
//printMsg(lvlError, format("DIRS3 `%1%'") % e);
}
}
else if(key == "shareState") { string s = coerceToString(state, value, context, true); shareState = s; }
else if(key == "synchronization") { string s = coerceToString(state, value, context, true); syncState = s; }
else if(key == "enableState") { bool b = evalBool(state, value); enableState = b; }
else if(key == "enableState") { bool b = evalBool(state, value); disableState = true; }
/* All other attributes are passed to the builder through
the environment. */
@ -521,7 +572,10 @@ static Expr prim_derivationStrict(EvalState & state, const ATermVector & args)
/* Add the state path based on the outPath */
//hash h = ....
drv.env["statepath"] = outPath;
drv.stateOutputs["statepath"] = DerivationStateOutput(outPath, outputHashAlgo, outputHash, enableState, shareState, syncState, dirs);
string enableStateS = "false";
if(enableState && disableState == false)
enableStateS = "true";
drv.stateOutputs["stateOptions"] = DerivationStateOutput(outPath, outputHashAlgo, outputHash, enableStateS, shareState, syncState);
/* Write the resulting term into the Nix store directory. */
Path drvPath = writeDerivation(drv, drvName);