mirror of
https://github.com/NixOS/nix
synced 2025-06-25 06:31:14 +02:00
Refactor option handling
This commit is contained in:
parent
5bed74d1b0
commit
47e185847e
10 changed files with 503 additions and 531 deletions
|
@ -52,24 +52,17 @@ struct Globals
|
|||
{
|
||||
InstallSourceInfo instSource;
|
||||
Path profile;
|
||||
EvalState state;
|
||||
std::shared_ptr<EvalState> state;
|
||||
bool dryRun;
|
||||
bool preserveInstalled;
|
||||
bool removeAll;
|
||||
string forceName;
|
||||
bool prebuiltOnly;
|
||||
Globals(const Strings & searchPath) : state(searchPath) { }
|
||||
};
|
||||
|
||||
|
||||
typedef void (* Operation) (Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs);
|
||||
|
||||
|
||||
void printHelp()
|
||||
{
|
||||
showManPage("nix-env");
|
||||
}
|
||||
Strings opFlags, Strings opArgs);
|
||||
|
||||
|
||||
static string needArg(Strings::iterator & i,
|
||||
|
@ -467,11 +460,11 @@ static void installDerivations(Globals & globals,
|
|||
|
||||
/* Get the set of user environment elements to be installed. */
|
||||
DrvInfos newElems, newElemsTmp;
|
||||
queryInstSources(globals.state, globals.instSource, args, newElemsTmp, true);
|
||||
queryInstSources(*globals.state, globals.instSource, args, newElemsTmp, true);
|
||||
|
||||
/* If --prebuilt-only is given, filter out source-only packages. */
|
||||
foreach (DrvInfos::iterator, i, newElemsTmp)
|
||||
if (!globals.prebuiltOnly || isPrebuilt(globals.state, *i))
|
||||
if (!globals.prebuiltOnly || isPrebuilt(*globals.state, *i))
|
||||
newElems.push_back(*i);
|
||||
|
||||
StringSet newNames;
|
||||
|
@ -494,7 +487,7 @@ static void installDerivations(Globals & globals,
|
|||
/* Add in the already installed derivations, unless they have
|
||||
the same name as a to-be-installed element. */
|
||||
if (!globals.removeAll) {
|
||||
DrvInfos installedElems = queryInstalled(globals.state, profile);
|
||||
DrvInfos installedElems = queryInstalled(*globals.state, profile);
|
||||
|
||||
foreach (DrvInfos::iterator, i, installedElems) {
|
||||
DrvName drvName(i->name);
|
||||
|
@ -510,18 +503,17 @@ static void installDerivations(Globals & globals,
|
|||
printMsg(lvlInfo, format("installing `%1%'") % i->name);
|
||||
}
|
||||
|
||||
printMissing(globals.state, newElems);
|
||||
printMissing(*globals.state, newElems);
|
||||
|
||||
if (globals.dryRun) return;
|
||||
|
||||
if (createUserEnv(globals.state, allElems,
|
||||
if (createUserEnv(*globals.state, allElems,
|
||||
profile, settings.envKeepDerivations, lockToken)) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void opInstall(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opInstall(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); ) {
|
||||
string arg = *i++;
|
||||
|
@ -553,11 +545,11 @@ static void upgradeDerivations(Globals & globals,
|
|||
while (true) {
|
||||
string lockToken = optimisticLockProfile(globals.profile);
|
||||
|
||||
DrvInfos installedElems = queryInstalled(globals.state, globals.profile);
|
||||
DrvInfos installedElems = queryInstalled(*globals.state, globals.profile);
|
||||
|
||||
/* Fetch all derivations from the input file. */
|
||||
DrvInfos availElems;
|
||||
queryInstSources(globals.state, globals.instSource, args, availElems, false);
|
||||
queryInstSources(*globals.state, globals.instSource, args, availElems, false);
|
||||
|
||||
/* Go through all installed derivations. */
|
||||
DrvInfos newElems;
|
||||
|
@ -582,7 +574,7 @@ static void upgradeDerivations(Globals & globals,
|
|||
foreach (DrvInfos::iterator, j, availElems) {
|
||||
DrvName newName(j->name);
|
||||
if (newName.name == drvName.name) {
|
||||
int d = comparePriorities(globals.state, *i, *j);
|
||||
int d = comparePriorities(*globals.state, *i, *j);
|
||||
if (d == 0) d = compareVersions(drvName.version, newName.version);
|
||||
if ((upgradeType == utLt && d < 0) ||
|
||||
(upgradeType == utLeq && d <= 0) ||
|
||||
|
@ -591,10 +583,10 @@ static void upgradeDerivations(Globals & globals,
|
|||
{
|
||||
int d2 = -1;
|
||||
if (bestElem != availElems.end()) {
|
||||
d2 = comparePriorities(globals.state, *bestElem, *j);
|
||||
d2 = comparePriorities(*globals.state, *bestElem, *j);
|
||||
if (d2 == 0) d2 = compareVersions(bestName.version, newName.version);
|
||||
}
|
||||
if (d2 < 0 && (!globals.prebuiltOnly || isPrebuilt(globals.state, *j))) {
|
||||
if (d2 < 0 && (!globals.prebuiltOnly || isPrebuilt(*globals.state, *j))) {
|
||||
bestElem = j;
|
||||
bestName = newName;
|
||||
}
|
||||
|
@ -618,18 +610,17 @@ static void upgradeDerivations(Globals & globals,
|
|||
}
|
||||
}
|
||||
|
||||
printMissing(globals.state, newElems);
|
||||
printMissing(*globals.state, newElems);
|
||||
|
||||
if (globals.dryRun) return;
|
||||
|
||||
if (createUserEnv(globals.state, newElems,
|
||||
if (createUserEnv(*globals.state, newElems,
|
||||
globals.profile, settings.envKeepDerivations, lockToken)) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void opUpgrade(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opUpgrade(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
UpgradeType upgradeType = utLt;
|
||||
for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); ) {
|
||||
|
@ -655,8 +646,7 @@ static void setMetaFlag(EvalState & state, DrvInfo & drv,
|
|||
}
|
||||
|
||||
|
||||
static void opSetFlag(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opSetFlag(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
||||
|
@ -671,7 +661,7 @@ static void opSetFlag(Globals & globals,
|
|||
while (true) {
|
||||
string lockToken = optimisticLockProfile(globals.profile);
|
||||
|
||||
DrvInfos installedElems = queryInstalled(globals.state, globals.profile);
|
||||
DrvInfos installedElems = queryInstalled(*globals.state, globals.profile);
|
||||
|
||||
/* Update all matching derivations. */
|
||||
foreach (DrvInfos::iterator, i, installedElems) {
|
||||
|
@ -680,7 +670,7 @@ static void opSetFlag(Globals & globals,
|
|||
if (j->matches(drvName)) {
|
||||
printMsg(lvlInfo, format("setting flag on `%1%'") % i->name);
|
||||
j->hits++;
|
||||
setMetaFlag(globals.state, *i, flagName, flagValue);
|
||||
setMetaFlag(*globals.state, *i, flagName, flagValue);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -688,14 +678,13 @@ static void opSetFlag(Globals & globals,
|
|||
checkSelectorUse(selectors);
|
||||
|
||||
/* Write the new user environment. */
|
||||
if (createUserEnv(globals.state, installedElems,
|
||||
if (createUserEnv(*globals.state, installedElems,
|
||||
globals.profile, settings.envKeepDerivations, lockToken)) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void opSet(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opSet(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); ) {
|
||||
string arg = *i++;
|
||||
|
@ -704,7 +693,7 @@ static void opSet(Globals & globals,
|
|||
}
|
||||
|
||||
DrvInfos elems;
|
||||
queryInstSources(globals.state, globals.instSource, opArgs, elems, true);
|
||||
queryInstSources(*globals.state, globals.instSource, opArgs, elems, true);
|
||||
|
||||
if (elems.size() != 1)
|
||||
throw Error("--set requires exactly one derivation");
|
||||
|
@ -715,7 +704,7 @@ static void opSet(Globals & globals,
|
|||
PathSet paths = singleton<PathSet>(drv.queryDrvPath());
|
||||
printMissing(*store, paths);
|
||||
if (globals.dryRun) return;
|
||||
store->buildPaths(paths, globals.state.repair ? bmRepair : bmNormal);
|
||||
store->buildPaths(paths, globals.state->repair ? bmRepair : bmNormal);
|
||||
}
|
||||
else {
|
||||
printMissing(*store, singleton<PathSet>(drv.queryOutPath()));
|
||||
|
@ -735,7 +724,7 @@ static void uninstallDerivations(Globals & globals, Strings & selectors,
|
|||
while (true) {
|
||||
string lockToken = optimisticLockProfile(profile);
|
||||
|
||||
DrvInfos installedElems = queryInstalled(globals.state, profile);
|
||||
DrvInfos installedElems = queryInstalled(*globals.state, profile);
|
||||
DrvInfos newElems;
|
||||
|
||||
foreach (DrvInfos::iterator, i, installedElems) {
|
||||
|
@ -756,14 +745,13 @@ static void uninstallDerivations(Globals & globals, Strings & selectors,
|
|||
|
||||
if (globals.dryRun) return;
|
||||
|
||||
if (createUserEnv(globals.state, newElems,
|
||||
if (createUserEnv(*globals.state, newElems,
|
||||
profile, settings.envKeepDerivations, lockToken)) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void opUninstall(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opUninstall(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
||||
|
@ -887,15 +875,14 @@ static void queryJSON(Globals & globals, vector<DrvInfo> & elems)
|
|||
cout << "null";
|
||||
} else {
|
||||
PathSet context;
|
||||
printValueAsJSON(globals.state, true, *v, cout, context);
|
||||
printValueAsJSON(*globals.state, true, *v, cout, context);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void opQuery(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opQuery(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
Strings remaining;
|
||||
string attrPath;
|
||||
|
@ -916,7 +903,7 @@ static void opQuery(Globals & globals,
|
|||
|
||||
settings.readOnlyMode = true; /* makes evaluation a bit faster */
|
||||
|
||||
for (Strings::iterator i = args.begin(); i != args.end(); ) {
|
||||
for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); ) {
|
||||
string arg = *i++;
|
||||
if (arg == "--status" || arg == "-s") printStatus = true;
|
||||
else if (arg == "--no-name") printName = false;
|
||||
|
@ -932,10 +919,9 @@ static void opQuery(Globals & globals,
|
|||
else if (arg == "--json") jsonOutput = true;
|
||||
else if (arg == "--attr-path" || arg == "-P") printAttrPath = true;
|
||||
else if (arg == "--attr" || arg == "-A")
|
||||
attrPath = needArg(i, args, arg);
|
||||
else if (arg[0] == '-')
|
||||
attrPath = needArg(i, opFlags, arg);
|
||||
else
|
||||
throw UsageError(format("unknown flag `%1%'") % arg);
|
||||
else remaining.push_back(arg);
|
||||
}
|
||||
|
||||
|
||||
|
@ -943,16 +929,16 @@ static void opQuery(Globals & globals,
|
|||
DrvInfos availElems, installedElems;
|
||||
|
||||
if (source == sInstalled || compareVersions || printStatus)
|
||||
installedElems = queryInstalled(globals.state, globals.profile);
|
||||
installedElems = queryInstalled(*globals.state, globals.profile);
|
||||
|
||||
if (source == sAvailable || compareVersions)
|
||||
loadDerivations(globals.state, globals.instSource.nixExprPath,
|
||||
loadDerivations(*globals.state, globals.instSource.nixExprPath,
|
||||
globals.instSource.systemFilter, globals.instSource.autoArgs,
|
||||
attrPath, availElems);
|
||||
|
||||
DrvInfos elems_ = filterBySelector(globals.state,
|
||||
DrvInfos elems_ = filterBySelector(*globals.state,
|
||||
source == sInstalled ? installedElems : availElems,
|
||||
remaining, false);
|
||||
opArgs, false);
|
||||
|
||||
DrvInfos & otherElems(source == sInstalled ? availElems : installedElems);
|
||||
|
||||
|
@ -1173,8 +1159,7 @@ static void opQuery(Globals & globals,
|
|||
}
|
||||
|
||||
|
||||
static void opSwitchProfile(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opSwitchProfile(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
||||
|
@ -1222,8 +1207,7 @@ static void switchGeneration(Globals & globals, int dstGen)
|
|||
}
|
||||
|
||||
|
||||
static void opSwitchGeneration(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opSwitchGeneration(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
||||
|
@ -1238,8 +1222,7 @@ static void opSwitchGeneration(Globals & globals,
|
|||
}
|
||||
|
||||
|
||||
static void opRollback(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opRollback(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
||||
|
@ -1250,8 +1233,7 @@ static void opRollback(Globals & globals,
|
|||
}
|
||||
|
||||
|
||||
static void opListGenerations(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opListGenerations(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
||||
|
@ -1288,8 +1270,7 @@ static void deleteGeneration2(Globals & globals, unsigned int gen)
|
|||
}
|
||||
|
||||
|
||||
static void opDeleteGenerations(Globals & globals,
|
||||
Strings args, Strings opFlags, Strings opArgs)
|
||||
static void opDeleteGenerations(Globals & globals, Strings opFlags, Strings opArgs)
|
||||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag `%1%'") % opFlags.front());
|
||||
|
@ -1348,110 +1329,115 @@ static void opDeleteGenerations(Globals & globals,
|
|||
}
|
||||
|
||||
|
||||
void run(Strings args)
|
||||
int main(int argc, char * * argv)
|
||||
{
|
||||
Strings opFlags, opArgs, remaining;
|
||||
Operation op = 0;
|
||||
return handleExceptions(argv[0], [&]() {
|
||||
initNix();
|
||||
|
||||
/* FIXME: hack. */
|
||||
Strings searchPath;
|
||||
Strings args2;
|
||||
for (Strings::iterator i = args.begin(); i != args.end(); ) {
|
||||
string arg = *i++;
|
||||
if (!parseSearchPathArg(arg, i, args.end(), searchPath))
|
||||
args2.push_back(arg);
|
||||
}
|
||||
args = args2;
|
||||
Strings opFlags, opArgs, searchPath;
|
||||
std::map<string, string> autoArgs_;
|
||||
Operation op = 0;
|
||||
bool repair = false;
|
||||
string file;
|
||||
|
||||
Globals globals(searchPath);
|
||||
Globals globals;
|
||||
|
||||
globals.instSource.type = srcUnknown;
|
||||
globals.instSource.nixExprPath = getDefNixExprPath();
|
||||
globals.instSource.systemFilter = "*";
|
||||
globals.instSource.type = srcUnknown;
|
||||
globals.instSource.nixExprPath = getDefNixExprPath();
|
||||
globals.instSource.systemFilter = "*";
|
||||
|
||||
globals.dryRun = false;
|
||||
globals.preserveInstalled = false;
|
||||
globals.removeAll = false;
|
||||
globals.prebuiltOnly = false;
|
||||
globals.dryRun = false;
|
||||
globals.preserveInstalled = false;
|
||||
globals.removeAll = false;
|
||||
globals.prebuiltOnly = false;
|
||||
|
||||
for (Strings::iterator i = args.begin(); i != args.end(); ) {
|
||||
string arg = *i++;
|
||||
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
|
||||
Operation oldOp = op;
|
||||
|
||||
Operation oldOp = op;
|
||||
if (*arg == "--help")
|
||||
showManPage("nix-env");
|
||||
else if (*arg == "--version")
|
||||
printVersion("nix-env");
|
||||
else if (*arg == "--install" || *arg == "-i")
|
||||
op = opInstall;
|
||||
else if (parseAutoArgs(arg, end, autoArgs_))
|
||||
;
|
||||
else if (parseSearchPathArg(arg, end, searchPath))
|
||||
;
|
||||
else if (*arg == "--force-name") // undocumented flag for nix-install-package
|
||||
globals.forceName = getArg(*arg, arg, end);
|
||||
else if (*arg == "--uninstall" || *arg == "-e")
|
||||
op = opUninstall;
|
||||
else if (*arg == "--upgrade" || *arg == "-u")
|
||||
op = opUpgrade;
|
||||
else if (*arg == "--set-flag")
|
||||
op = opSetFlag;
|
||||
else if (*arg == "--set")
|
||||
op = opSet;
|
||||
else if (*arg == "--query" || *arg == "-q")
|
||||
op = opQuery;
|
||||
else if (*arg == "--profile" || *arg == "-p")
|
||||
globals.profile = absPath(getArg(*arg, arg, end));
|
||||
else if (*arg == "--file" || *arg == "-f")
|
||||
file = getArg(*arg, arg, end);
|
||||
else if (*arg == "--switch-profile" || *arg == "-S")
|
||||
op = opSwitchProfile;
|
||||
else if (*arg == "--switch-generation" || *arg == "-G")
|
||||
op = opSwitchGeneration;
|
||||
else if (*arg == "--rollback")
|
||||
op = opRollback;
|
||||
else if (*arg == "--list-generations")
|
||||
op = opListGenerations;
|
||||
else if (*arg == "--delete-generations")
|
||||
op = opDeleteGenerations;
|
||||
else if (*arg == "--dry-run") {
|
||||
printMsg(lvlInfo, "(dry run; not doing anything)");
|
||||
globals.dryRun = true;
|
||||
}
|
||||
else if (*arg == "--system-filter")
|
||||
globals.instSource.systemFilter = getArg(*arg, arg, end);
|
||||
else if (*arg == "--prebuilt-only" || *arg == "-b")
|
||||
globals.prebuiltOnly = true;
|
||||
else if (*arg == "--repair")
|
||||
repair = true;
|
||||
else if (*arg != "" && arg->at(0) == '-') {
|
||||
opFlags.push_back(*arg);
|
||||
if (*arg == "--from-profile" || *arg == "--atr" || *arg == "-A") /* !!! hack */
|
||||
opFlags.push_back(getArg(*arg, arg, end));
|
||||
}
|
||||
else
|
||||
opArgs.push_back(*arg);
|
||||
|
||||
if (arg == "--install" || arg == "-i")
|
||||
op = opInstall;
|
||||
else if (parseOptionArg(arg, i, args.end(),
|
||||
globals.state, globals.instSource.autoArgs))
|
||||
;
|
||||
else if (arg == "--force-name") // undocumented flag for nix-install-package
|
||||
globals.forceName = needArg(i, args, arg);
|
||||
else if (arg == "--uninstall" || arg == "-e")
|
||||
op = opUninstall;
|
||||
else if (arg == "--upgrade" || arg == "-u")
|
||||
op = opUpgrade;
|
||||
else if (arg == "--set-flag")
|
||||
op = opSetFlag;
|
||||
else if (arg == "--set")
|
||||
op = opSet;
|
||||
else if (arg == "--query" || arg == "-q")
|
||||
op = opQuery;
|
||||
else if (arg == "--profile" || arg == "-p")
|
||||
globals.profile = absPath(needArg(i, args, arg));
|
||||
else if (arg == "--file" || arg == "-f")
|
||||
globals.instSource.nixExprPath = lookupFileArg(globals.state, needArg(i, args, arg));
|
||||
else if (arg == "--switch-profile" || arg == "-S")
|
||||
op = opSwitchProfile;
|
||||
else if (arg == "--switch-generation" || arg == "-G")
|
||||
op = opSwitchGeneration;
|
||||
else if (arg == "--rollback")
|
||||
op = opRollback;
|
||||
else if (arg == "--list-generations")
|
||||
op = opListGenerations;
|
||||
else if (arg == "--delete-generations")
|
||||
op = opDeleteGenerations;
|
||||
else if (arg == "--dry-run") {
|
||||
printMsg(lvlInfo, "(dry run; not doing anything)");
|
||||
globals.dryRun = true;
|
||||
}
|
||||
else if (arg == "--system-filter")
|
||||
globals.instSource.systemFilter = needArg(i, args, arg);
|
||||
else if (arg == "--prebuilt-only" || arg == "-b")
|
||||
globals.prebuiltOnly = true;
|
||||
else if (arg == "--repair")
|
||||
globals.state.repair = true;
|
||||
else {
|
||||
remaining.push_back(arg);
|
||||
if (arg[0] == '-') {
|
||||
opFlags.push_back(arg);
|
||||
if (arg == "--from-profile") { /* !!! hack */
|
||||
if (i != args.end()) opFlags.push_back(*i++);
|
||||
}
|
||||
} else opArgs.push_back(arg);
|
||||
if (oldOp && oldOp != op)
|
||||
throw UsageError("only one operation may be specified");
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
if (!op) throw UsageError("no operation specified");
|
||||
|
||||
globals.state = std::shared_ptr<EvalState>(new EvalState(searchPath));
|
||||
globals.state->repair = repair;
|
||||
|
||||
if (file != "")
|
||||
globals.instSource.nixExprPath = lookupFileArg(*globals.state, file);
|
||||
|
||||
evalAutoArgs(*globals.state, autoArgs_, globals.instSource.autoArgs);
|
||||
|
||||
if (globals.profile == "")
|
||||
globals.profile = getEnv("NIX_PROFILE", "");
|
||||
|
||||
if (globals.profile == "") {
|
||||
Path profileLink = getHomeDir() + "/.nix-profile";
|
||||
globals.profile = pathExists(profileLink)
|
||||
? absPath(readLink(profileLink), dirOf(profileLink))
|
||||
: canonPath(settings.nixStateDir + "/profiles/default");
|
||||
}
|
||||
|
||||
if (oldOp && oldOp != op)
|
||||
throw UsageError("only one operation may be specified");
|
||||
}
|
||||
store = openStore();
|
||||
|
||||
if (!op) throw UsageError("no operation specified");
|
||||
op(globals, opFlags, opArgs);
|
||||
|
||||
if (globals.profile == "")
|
||||
globals.profile = getEnv("NIX_PROFILE", "");
|
||||
|
||||
if (globals.profile == "") {
|
||||
Path profileLink = getHomeDir() + "/.nix-profile";
|
||||
globals.profile = pathExists(profileLink)
|
||||
? absPath(readLink(profileLink), dirOf(profileLink))
|
||||
: canonPath(settings.nixStateDir + "/profiles/default");
|
||||
}
|
||||
|
||||
store = openStore();
|
||||
|
||||
op(globals, remaining, opFlags, opArgs);
|
||||
|
||||
globals.state.printStats();
|
||||
globals.state->printStats();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
string programId = "nix-env";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue