1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-25 10:41:16 +02:00

* Allow certain operations to succeed even if we don't have write

permission to the Nix store or database.  E.g., `nix-env -qa' will
  work, but `nix-env -qas' won't (the latter needs DB access).  The
  option `--readonly-mode' forces this mode; otherwise, it's only
  activated when the database cannot be opened.
This commit is contained in:
Eelco Dolstra 2004-10-25 14:38:23 +00:00
parent 3ade3e7721
commit f4d44a0026
9 changed files with 58 additions and 16 deletions

View file

@ -8,7 +8,7 @@
#include "nixexpr.hh"
typedef map<Path, PathSet> DrvPaths;
typedef map<Path, PathSet> DrvRoots;
typedef map<Path, Hash> DrvHashes;
struct EvalState;
@ -22,7 +22,7 @@ struct EvalState
{
ATermMap normalForms;
ATermMap primOps;
DrvPaths drvPaths;
DrvRoots drvRoots;
DrvHashes drvHashes; /* normalised derivation hashes */
Expr blackHole;

View file

@ -17,12 +17,12 @@ static Expr primImport(EvalState & state, const ATermVector & args)
static PathSet storeExprRootsCached(EvalState & state, const Path & nePath)
{
DrvPaths::iterator i = state.drvPaths.find(nePath);
if (i != state.drvPaths.end())
DrvRoots::iterator i = state.drvRoots.find(nePath);
if (i != state.drvRoots.end())
return i->second;
else {
PathSet paths = storeExprRoots(nePath);
state.drvPaths[nePath] = paths;
state.drvRoots[nePath] = paths;
return paths;
}
}
@ -61,6 +61,8 @@ static Path copyAtom(EvalState & state, const Path & srcPath)
Path drvPath = writeTerm(unparseStoreExpr(ne), "");
state.drvHashes[drvPath] = drvHash;
state.drvRoots[drvPath] = ne.closure.roots;
printMsg(lvlChatty, format("copied `%1%' -> closure `%2%'")
% srcPath % drvPath);
return drvPath;
@ -111,8 +113,14 @@ static void processBinding(EvalState & state, Expr e, StoreExpr & ne,
if (!a) throw Error("derivation hash missing");
Hash drvHash = parseHash(evalString(state, a));
state.drvHashes[drvPath] = drvHash;
a = queryAttr(e, "outPath");
if (!a) throw Error("output path missing");
PathSet drvRoots;
drvRoots.insert(evalPath(state, a));
state.drvHashes[drvPath] = drvHash;
state.drvRoots[drvPath] = drvRoots;
ss.push_back(addInput(state, drvPath, ne));
} else
throw Error("invalid derivation attribute");