forked from lix-project/lix
* Allow the system attribute of derivations to be queried in
`nix-env -q'. * Queries can now be combined, e.g., `nix-env -q --status --system'.
This commit is contained in:
parent
b584253af4
commit
593bc23d8b
|
@ -28,6 +28,7 @@ typedef void (* Operation) (Globals & globals,
|
||||||
struct DrvInfo
|
struct DrvInfo
|
||||||
{
|
{
|
||||||
string name;
|
string name;
|
||||||
|
string system;
|
||||||
Path drvPath;
|
Path drvPath;
|
||||||
Path outPath;
|
Path outPath;
|
||||||
Hash drvHash;
|
Hash drvHash;
|
||||||
|
@ -56,6 +57,12 @@ bool parseDerivation(EvalState & state, Expr e, DrvInfo & drv)
|
||||||
if (!a) throw badTerm("derivation name missing", e);
|
if (!a) throw badTerm("derivation name missing", e);
|
||||||
drv.name = evalString(state, a);
|
drv.name = evalString(state, a);
|
||||||
|
|
||||||
|
a = queryAttr(e, "system");
|
||||||
|
if (!a)
|
||||||
|
drv.system = "unknown";
|
||||||
|
else
|
||||||
|
drv.system = evalString(state, a);
|
||||||
|
|
||||||
a = queryAttr(e, "drvPath");
|
a = queryAttr(e, "drvPath");
|
||||||
if (!a) throw badTerm("derivation path missing", e);
|
if (!a) throw badTerm("derivation path missing", e);
|
||||||
drv.drvPath = evalPath(state, a);
|
drv.drvPath = evalPath(state, a);
|
||||||
|
@ -181,11 +188,13 @@ void createUserEnv(EvalState & state, const DrvInfos & drvs,
|
||||||
"Attrs(["
|
"Attrs(["
|
||||||
"Bind(\"type\", Str(\"derivation\"), NoPos), "
|
"Bind(\"type\", Str(\"derivation\"), NoPos), "
|
||||||
"Bind(\"name\", Str(<str>), NoPos), "
|
"Bind(\"name\", Str(<str>), NoPos), "
|
||||||
|
"Bind(\"system\", Str(<str>), NoPos), "
|
||||||
"Bind(\"drvPath\", Path(<str>), NoPos), "
|
"Bind(\"drvPath\", Path(<str>), NoPos), "
|
||||||
"Bind(\"drvHash\", Str(<str>), NoPos), "
|
"Bind(\"drvHash\", Str(<str>), NoPos), "
|
||||||
"Bind(\"outPath\", Path(<str>), NoPos)"
|
"Bind(\"outPath\", Path(<str>), NoPos)"
|
||||||
"])",
|
"])",
|
||||||
i->second.name.c_str(),
|
i->second.name.c_str(),
|
||||||
|
i->second.system.c_str(),
|
||||||
i->second.drvPath.c_str(),
|
i->second.drvPath.c_str(),
|
||||||
((string) i->second.drvHash).c_str(),
|
((string) i->second.drvHash).c_str(),
|
||||||
i->second.outPath.c_str());
|
i->second.outPath.c_str());
|
||||||
|
@ -454,14 +463,19 @@ static bool cmpDrvByName(const DrvInfo & a, const DrvInfo & b)
|
||||||
static void opQuery(Globals & globals,
|
static void opQuery(Globals & globals,
|
||||||
Strings opFlags, Strings opArgs)
|
Strings opFlags, Strings opArgs)
|
||||||
{
|
{
|
||||||
enum { qName, qDrvPath, qStatus } query = qName;
|
bool printStatus = false;
|
||||||
|
bool printName = true;
|
||||||
|
bool printSystem = false;
|
||||||
|
bool printDrvPath = false;
|
||||||
|
|
||||||
enum { sInstalled, sAvailable } source = sInstalled;
|
enum { sInstalled, sAvailable } source = sInstalled;
|
||||||
|
|
||||||
for (Strings::iterator i = opFlags.begin();
|
for (Strings::iterator i = opFlags.begin();
|
||||||
i != opFlags.end(); ++i)
|
i != opFlags.end(); ++i)
|
||||||
if (*i == "--name") query = qName;
|
if (*i == "--status" || *i == "-s") printStatus = true;
|
||||||
else if (*i == "--expr") query = qDrvPath;
|
else if (*i == "--no-name") printName = false;
|
||||||
else if (*i == "--status" || *i == "-s") query = qStatus;
|
else if (*i == "--system") printSystem = true;
|
||||||
|
else if (*i == "--expr") printDrvPath = true;
|
||||||
else if (*i == "--installed") source = sInstalled;
|
else if (*i == "--installed") source = sInstalled;
|
||||||
else if (*i == "--available" || *i == "-a") source = sAvailable;
|
else if (*i == "--available" || *i == "-a") source = sAvailable;
|
||||||
else throw UsageError(format("unknown flag `%1%'") % *i);
|
else throw UsageError(format("unknown flag `%1%'") % *i);
|
||||||
|
@ -490,44 +504,43 @@ static void opQuery(Globals & globals,
|
||||||
for (DrvInfos::iterator i = drvs.begin(); i != drvs.end(); ++i)
|
for (DrvInfos::iterator i = drvs.begin(); i != drvs.end(); ++i)
|
||||||
drvs2.push_back(i->second);
|
drvs2.push_back(i->second);
|
||||||
sort(drvs2.begin(), drvs2.end(), cmpDrvByName);
|
sort(drvs2.begin(), drvs2.end(), cmpDrvByName);
|
||||||
|
|
||||||
|
/* We only need to know the installed paths when we are querying
|
||||||
|
the status of the derivation. */
|
||||||
|
PathSet installedPaths; /* output paths of installed drvs */
|
||||||
|
|
||||||
/* Perform the specified query on the derivations. */
|
if (printStatus) {
|
||||||
switch (query) {
|
DrvInfos installed;
|
||||||
|
queryInstalled(globals.state, installed, globals.profile);
|
||||||
case qName: {
|
|
||||||
for (DrvInfoList::iterator i = drvs2.begin(); i != drvs2.end(); ++i)
|
|
||||||
cout << format("%1%\n") % i->name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case qDrvPath: {
|
for (DrvInfos::iterator i = installed.begin();
|
||||||
for (DrvInfoList::iterator i = drvs2.begin(); i != drvs2.end(); ++i)
|
i != installed.end(); ++i)
|
||||||
cout << format("%1%\n") % i->drvPath;
|
installedPaths.insert(i->second.outPath);
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
case qStatus: {
|
|
||||||
DrvInfos installed;
|
|
||||||
queryInstalled(globals.state, installed, globals.profile);
|
|
||||||
|
|
||||||
PathSet installedPaths; /* output paths of installed drvs */
|
|
||||||
for (DrvInfos::iterator i = installed.begin();
|
|
||||||
i != installed.end(); ++i)
|
|
||||||
installedPaths.insert(i->second.outPath);
|
|
||||||
|
|
||||||
for (DrvInfoList::iterator i = drvs2.begin(); i != drvs2.end(); ++i) {
|
/* Print the desired columns. */
|
||||||
Substitutes subs = querySubstitutes(i->drvPath);
|
for (DrvInfoList::iterator i = drvs2.begin(); i != drvs2.end(); ++i) {
|
||||||
cout << format("%1%%2%%3% %4%\n")
|
|
||||||
% (installedPaths.find(i->outPath)
|
Strings columns;
|
||||||
!= installedPaths.end() ? 'I' : '-')
|
|
||||||
% (isValidPath(i->outPath) ? 'P' : '-')
|
|
||||||
% (subs.size() > 0 ? 'S' : '-')
|
|
||||||
% i->name;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: abort();
|
if (printStatus) {
|
||||||
|
Substitutes subs = querySubstitutes(i->drvPath);
|
||||||
|
columns.push_back(
|
||||||
|
(string) (installedPaths.find(i->outPath)
|
||||||
|
!= installedPaths.end() ? "I" : "-")
|
||||||
|
+ (isValidPath(i->outPath) ? "P" : "-")
|
||||||
|
+ (subs.size() > 0 ? "S" : "-"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (printName) columns.push_back(i->name);
|
||||||
|
|
||||||
|
if (printSystem) columns.push_back(i->system);
|
||||||
|
|
||||||
|
if (printDrvPath) columns.push_back(i->drvPath);
|
||||||
|
|
||||||
|
for (Strings::iterator j = columns.begin(); j != columns.end(); ++j)
|
||||||
|
cout << *j << " ";
|
||||||
|
cout << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue