mirror of
https://github.com/NixOS/nix
synced 2025-06-27 12:41:15 +02:00
* `nix-env -qa --description' shows human-readable descriptions of
packages (provided that they have a `meta.description' attribute). E.g., $ ./src/nix-env/nix-env -qa --description gcc gcc-4.0.2 GNU Compiler Collection, 4.0.x (cross-compiler for sparc-linux) gcc-4.0.2 GNU Compiler Collection, 4.0.x (cross-compiler for mips-linux) gcc-4.0.2 GNU Compiler Collection, 4.0.x (cross-compiler for arm-linux) gcc-4.0.2 GNU Compiler Collection, 4.0.x
This commit is contained in:
parent
a33fb2d287
commit
37d1b1cafd
7 changed files with 79 additions and 25 deletions
|
@ -56,6 +56,7 @@ Expr evalFile(EvalState & state, const Path & path);
|
|||
string evalString(EvalState & state, Expr e);
|
||||
Path evalPath(EvalState & state, Expr e);
|
||||
ATermList evalList(EvalState & state, Expr e);
|
||||
ATerm coerceToString(Expr e);
|
||||
|
||||
/* Print statistics. */
|
||||
void printEvalStats(EvalState & state);
|
||||
|
|
|
@ -2,6 +2,49 @@
|
|||
#include "nixexpr-ast.hh"
|
||||
|
||||
|
||||
string DrvInfo::queryDrvPath(EvalState & state) const
|
||||
{
|
||||
if (drvPath == "") {
|
||||
Expr a = attrs.get("drvPath");
|
||||
(string &) drvPath = a ? evalPath(state, a) : "";
|
||||
}
|
||||
return drvPath;
|
||||
}
|
||||
|
||||
|
||||
string DrvInfo::queryOutPath(EvalState & state) const
|
||||
{
|
||||
if (outPath == "") {
|
||||
Expr a = attrs.get("outPath");
|
||||
if (!a) throw Error("output path missing");
|
||||
(string &) outPath = evalPath(state, a);
|
||||
}
|
||||
return outPath;
|
||||
}
|
||||
|
||||
|
||||
MetaInfo DrvInfo::queryMetaInfo(EvalState & state) const
|
||||
{
|
||||
MetaInfo meta;
|
||||
|
||||
Expr a = attrs.get("meta");
|
||||
if (!a) return meta; /* fine, empty meta information */
|
||||
|
||||
ATermMap attrs2;
|
||||
queryAllAttrs(evalExpr(state, a), attrs2);
|
||||
|
||||
for (ATermIterator i(attrs2.keys()); i; ++i) {
|
||||
ATerm s = coerceToString(evalExpr(state, attrs2.get(*i)));
|
||||
if (s)
|
||||
meta[aterm2String(*i)] = aterm2String(s);
|
||||
/* For future compatibility, ignore attribute values that are
|
||||
not strings. */
|
||||
}
|
||||
|
||||
return meta;
|
||||
}
|
||||
|
||||
|
||||
typedef set<Expr> Exprs;
|
||||
|
||||
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
#include "eval.hh"
|
||||
|
||||
|
||||
typedef map<string, string> MetaInfo;
|
||||
|
||||
|
||||
struct DrvInfo
|
||||
{
|
||||
private:
|
||||
|
@ -19,24 +22,9 @@ public:
|
|||
|
||||
ATermMap attrs;
|
||||
|
||||
string queryDrvPath(EvalState & state) const
|
||||
{
|
||||
if (drvPath == "") {
|
||||
Expr a = attrs.get("drvPath");
|
||||
(string &) drvPath = a ? evalPath(state, a) : "";
|
||||
}
|
||||
return drvPath;
|
||||
}
|
||||
|
||||
string queryOutPath(EvalState & state) const
|
||||
{
|
||||
if (outPath == "") {
|
||||
Expr a = attrs.get("outPath");
|
||||
if (!a) throw Error("output path missing");
|
||||
(string &) outPath = evalPath(state, a);
|
||||
}
|
||||
return outPath;
|
||||
}
|
||||
string queryDrvPath(EvalState & state) const;
|
||||
string queryOutPath(EvalState & state) const;
|
||||
MetaInfo queryMetaInfo(EvalState & state) const;
|
||||
|
||||
void setDrvPath(const string & s)
|
||||
{
|
||||
|
|
|
@ -390,14 +390,21 @@ static Expr primDirOf(EvalState & state, const ATermVector & args)
|
|||
}
|
||||
|
||||
|
||||
ATerm coerceToString(Expr e)
|
||||
{
|
||||
ATerm s;
|
||||
if (matchStr(e, s) || matchPath(e, s) || matchUri(e, s))
|
||||
return s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Convert the argument (which can be a path or a uri) to a string. */
|
||||
static Expr primToString(EvalState & state, const ATermVector & args)
|
||||
{
|
||||
Expr arg = evalExpr(state, args[0]);
|
||||
ATerm s;
|
||||
if (matchStr(arg, s) || matchPath(arg, s) || matchUri(arg, s))
|
||||
return makeStr(s);
|
||||
throw Error("cannot coerce value to string");
|
||||
ATerm s = coerceToString(evalExpr(state, args[0]));
|
||||
if (!s) throw Error("cannot coerce value to string");
|
||||
return makeStr(s);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue