aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/primops.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-07-19 15:36:15 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-07-19 15:36:15 +0000
commit4f3725b167cc0080c570a814e28c6181ef5c7f52 (patch)
tree0e3bc97c8e207cdb0de3403a0430909debe5c043 /src/libexpr/primops.cc
parente10b830251af37951109113d88ddf203ae95645c (diff)
* Better error messages (especially wrt types).
Diffstat (limited to 'src/libexpr/primops.cc')
-rw-r--r--src/libexpr/primops.cc40
1 files changed, 20 insertions, 20 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 4cd180fd6..0dd73a016 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -26,19 +26,19 @@ static Expr primImport(EvalState & state, const ATermVector & args)
Nix expression created at the derivation's output path. */
if (a && evalString(state, a) == "derivation") {
a = queryAttr(arg, "drvPath");
- if (!a) throw Error("bad derivation in import");
+ if (!a) throw EvalError("bad derivation in import");
Path drvPath = evalPath(state, a);
buildDerivations(singleton<PathSet>(drvPath));
a = queryAttr(arg, "outPath");
- if (!a) throw Error("bad derivation in import");
+ if (!a) throw EvalError("bad derivation in import");
path = evalPath(state, a);
}
}
if (path == "")
- throw Error("path or derivation expected in import");
+ throw TypeError("`import' requires a path or derivation as its argument");
return evalFile(state, path);
}
@@ -133,11 +133,11 @@ static void processBinding(EvalState & state, Expr e, Derivation & drv,
if (a && evalString(state, a) == "derivation") {
a = queryAttr(e, "drvPath");
- if (!a) throw Error("derivation name missing");
+ if (!a) throw EvalError("derivation name missing");
Path drvPath = evalPath(state, a);
a = queryAttr(e, "outPath");
- if (!a) throw Error("output path missing");
+ if (!a) throw EvalError("output path missing");
/* !!! supports only single output path */
Path outPath = evalPath(state, a);
@@ -148,7 +148,7 @@ static void processBinding(EvalState & state, Expr e, Derivation & drv,
else if (a && evalString(state, a) == "storePath") {
a = queryAttr(e, "outPath");
- if (!a) throw Error("output path missing");
+ if (!a) throw EvalError("output path missing");
/* !!! supports only single output path */
Path outPath = evalPath(state, a);
@@ -156,7 +156,7 @@ static void processBinding(EvalState & state, Expr e, Derivation & drv,
ss.push_back(outPath);
}
- else throw Error("invalid derivation attribute");
+ else throw TypeError("attribute sets in derivations must either be derivations or store paths");
}
else if (matchPath(e, s)) {
@@ -171,7 +171,7 @@ static void processBinding(EvalState & state, Expr e, Derivation & drv,
else {
if (isDerivation(srcPath))
- throw Error(format("file names are not allowed to end in `%1%'")
+ throw EvalError(format("file names are not allowed to end in `%1%'")
% drvExtension);
Path dstPath;
if (state.srcToStore[srcPath] != "")
@@ -200,14 +200,14 @@ static void processBinding(EvalState & state, Expr e, Derivation & drv,
Strings ss2;
processBinding(state, evalExpr(state, e1), drv, ss2);
if (ss2.size() != 1)
- throw Error("left-hand side of `~' operator cannot be a list");
+ throw TypeError("left-hand side of `~' operator cannot be a list");
e2 = evalExpr(state, e2);
if (!(matchStr(e2, s) || matchPath(e2, s)))
- throw Error("right-hand side of `~' operator must be a path or string");
+ throw TypeError("right-hand side of `~' operator must be a path or string");
ss.push_back(canonPath(ss2.front() + "/" + aterm2String(s)));
}
- else throw Error("invalid derivation attribute");
+ else throw TypeError(format("%1% is not allowed as a derivation argument") % showType(e));
}
@@ -240,7 +240,7 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
/* Figure out the name already (for stack backtraces). */
Expr eDrvName = attrs.get(toATerm("name"));
if (!eDrvName)
- throw Error("required attribute `name' missing");
+ throw EvalError("required attribute `name' missing");
ATerm posDrvName;
if (!matchAttrRHS(eDrvName, eDrvName, posDrvName)) abort();
string drvName = evalString(state, eDrvName);
@@ -291,16 +291,16 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
else if (key == "outputHashMode") {
if (s == "recursive") outputHashRecursive = true;
else if (s == "flat") outputHashRecursive = false;
- else throw Error(format("invalid value `%1%' for `outputHashMode' attribute") % s);
+ else throw EvalError(format("invalid value `%1%' for `outputHashMode' attribute") % s);
}
}
}
/* Do we have all required attributes? */
if (drv.builder == "")
- throw Error("required attribute `builder' missing");
+ throw EvalError("required attribute `builder' missing");
if (drv.platform == "")
- throw Error("required attribute `system' missing");
+ throw EvalError("required attribute `system' missing");
/* If an output hash was given, check it. */
if (outputHash == "")
@@ -308,7 +308,7 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
else {
HashType ht = parseHashType(outputHashAlgo);
if (ht == htUnknown)
- throw Error(format("unknown hash algorithm `%1%'") % outputHashAlgo);
+ throw EvalError(format("unknown hash algorithm `%1%'") % outputHashAlgo);
Hash h;
if (outputHash.size() == Hash(ht).hashSize * 2)
/* hexadecimal representation */
@@ -326,7 +326,7 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
alphanumerics and some other characters appear. */
checkStoreName(drvName);
if (isDerivation(drvName))
- throw Error(format("derivation names are not allowed to end in `%1%'")
+ throw EvalError(format("derivation names are not allowed to end in `%1%'")
% drvExtension);
/* !!! the name should not end in the derivation extension (.drv).
@@ -457,7 +457,7 @@ static Expr primIsNull(EvalState & state, const ATermVector & args)
static Path findDependency(Path dir, string dep)
{
- if (dep[0] == '/') throw Error(
+ if (dep[0] == '/') throw EvalError(
format("illegal absolute dependency `%1%'") % dep);
Path p = canonPath(dir + "/" + dep);
@@ -515,7 +515,7 @@ static Expr primDependencyClosure(EvalState & state, const ATermVector & args)
/* Get the start set. */
Expr startSet = queryAttr(attrs, "startSet");
- if (!startSet) throw Error("attribute `startSet' required");
+ if (!startSet) throw EvalError("attribute `startSet' required");
ATermList startSet2 = evalList(state, startSet);
Path pivot;
@@ -538,7 +538,7 @@ static Expr primDependencyClosure(EvalState & state, const ATermVector & args)
}
Expr scanner = queryAttr(attrs, "scanner");
- if (!scanner) throw Error("attribute `scanner' required");
+ if (!scanner) throw EvalError("attribute `scanner' required");
/* Construct the dependency closure by querying the dependency of
each path in `workSet', adding the dependencies to