mirror of
https://github.com/NixOS/nix
synced 2025-06-28 22:01:15 +02:00
* Implemented Eelco V.'s `nix-env -I' command to specify the default
path of the Nix expression to be used with the import, upgrade, and query commands. For instance, $ nix-env -I ~/nixpkgs/pkgs/system/i686-linux.nix $ nix-env --query --available [aka -qa] sylpheed-0.9.7 bison-1.875 pango-1.2.5 subversion-0.35.1 ... $ nix-env -i sylpheed $ nix-env -u subversion There can be only one default at a time. * If the path to a Nix expression is a symlink, follow the symlink prior to resolving relative path references in the expression.
This commit is contained in:
parent
f83c5e3e5f
commit
4a373a3e9a
7 changed files with 87 additions and 43 deletions
|
@ -11,6 +11,7 @@
|
|||
struct Globals
|
||||
{
|
||||
Path linkPath;
|
||||
Path nixExprPath;
|
||||
EvalState state;
|
||||
};
|
||||
|
||||
|
@ -106,12 +107,26 @@ void loadDerivations(EvalState & state, Path nePath, DrvInfos & drvs)
|
|||
}
|
||||
|
||||
|
||||
static Path getHomeDir()
|
||||
{
|
||||
Path homeDir(getenv("HOME"));
|
||||
if (homeDir == "") throw Error("HOME environment variable not set");
|
||||
return homeDir;
|
||||
}
|
||||
|
||||
|
||||
static Path getLinksDir()
|
||||
{
|
||||
return canonPath(nixStateDir + "/links");
|
||||
}
|
||||
|
||||
|
||||
static Path getDefNixExprPath()
|
||||
{
|
||||
return getHomeDir() + "/.nix-defexpr";
|
||||
}
|
||||
|
||||
|
||||
void queryInstalled(EvalState & state, DrvInfos & drvs,
|
||||
const Path & userEnv)
|
||||
{
|
||||
|
@ -410,13 +425,11 @@ static void opInstall(Globals & globals,
|
|||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flags `%1%'") % opFlags.front());
|
||||
if (opArgs.size() < 1) throw UsageError("Nix file expected");
|
||||
|
||||
Path nePath = opArgs.front();
|
||||
DrvNames drvNames = drvNamesFromArgs(
|
||||
Strings(++opArgs.begin(), opArgs.end()));
|
||||
DrvNames drvNames = drvNamesFromArgs(opArgs);
|
||||
|
||||
installDerivations(globals.state, nePath, drvNames, globals.linkPath);
|
||||
installDerivations(globals.state, globals.nixExprPath,
|
||||
drvNames, globals.linkPath);
|
||||
}
|
||||
|
||||
|
||||
|
@ -492,11 +505,10 @@ static void opUpgrade(Globals & globals,
|
|||
throw UsageError(format("unknown flags `%1%'") % opFlags.front());
|
||||
if (opArgs.size() < 1) throw UsageError("Nix file expected");
|
||||
|
||||
Path nePath = opArgs.front();
|
||||
DrvNames drvNames = drvNamesFromArgs(
|
||||
Strings(++opArgs.begin(), opArgs.end()));
|
||||
DrvNames drvNames = drvNamesFromArgs(opArgs);
|
||||
|
||||
upgradeDerivations(globals.state, nePath, drvNames, globals.linkPath);
|
||||
upgradeDerivations(globals.state, globals.nixExprPath,
|
||||
drvNames, globals.linkPath);
|
||||
}
|
||||
|
||||
|
||||
|
@ -547,7 +559,7 @@ static void opQuery(Globals & globals,
|
|||
else if (*i == "--expr" || *i == "-e") query = qDrvPath;
|
||||
else if (*i == "--status" || *i == "-s") query = qStatus;
|
||||
else if (*i == "--installed") source = sInstalled;
|
||||
else if (*i == "--available" || *i == "-f") source = sAvailable;
|
||||
else if (*i == "--available" || *i == "-a") source = sAvailable;
|
||||
else throw UsageError(format("unknown flag `%1%'") % *i);
|
||||
|
||||
/* Obtain derivation information from the specified source. */
|
||||
|
@ -560,10 +572,7 @@ static void opQuery(Globals & globals,
|
|||
break;
|
||||
|
||||
case sAvailable: {
|
||||
if (opArgs.size() < 1) throw UsageError("Nix file expected");
|
||||
Path nePath = opArgs.front();
|
||||
opArgs.pop_front();
|
||||
loadDerivations(globals.state, nePath, drvs);
|
||||
loadDerivations(globals.state, globals.nixExprPath, drvs);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -611,20 +620,31 @@ static void opSwitchProfile(Globals & globals,
|
|||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flags `%1%'") % opFlags.front());
|
||||
if (opArgs.size() > 1)
|
||||
throw UsageError(format("--profile takes at most one argument"));
|
||||
throw UsageError(format("`--profile' takes at most one argument"));
|
||||
|
||||
string linkPath =
|
||||
Path linkPath =
|
||||
opArgs.size() == 0 ? globals.linkPath : opArgs.front();
|
||||
Path linkPathFinal = getHomeDir() + "/.nix-userenv";
|
||||
|
||||
string homeDir(getenv("HOME"));
|
||||
if (homeDir == "") throw Error("HOME environment variable not set");
|
||||
|
||||
string linkPathFinal = homeDir + "/.nix-userenv";
|
||||
|
||||
switchLink(linkPathFinal, linkPath);
|
||||
}
|
||||
|
||||
|
||||
static void opDefaultExpr(Globals & globals,
|
||||
Strings opFlags, Strings opArgs)
|
||||
{
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flags `%1%'") % opFlags.front());
|
||||
if (opArgs.size() != 1)
|
||||
throw UsageError(format("`--import' takes exactly one argument"));
|
||||
|
||||
Path defNixExpr = opArgs.front();
|
||||
Path defNixExprLink = getDefNixExprPath();
|
||||
|
||||
switchLink(defNixExprLink, defNixExpr);
|
||||
}
|
||||
|
||||
|
||||
void run(Strings args)
|
||||
{
|
||||
/* Use a higher default verbosity (lvlInfo). */
|
||||
|
@ -635,6 +655,7 @@ void run(Strings args)
|
|||
|
||||
Globals globals;
|
||||
globals.linkPath = getLinksDir() + "/current";
|
||||
globals.nixExprPath = getDefNixExprPath();
|
||||
|
||||
for (Strings::iterator i = args.begin(); i != args.end(); ++i) {
|
||||
string arg = *i;
|
||||
|
@ -649,12 +670,20 @@ void run(Strings args)
|
|||
op = opUpgrade;
|
||||
else if (arg == "--query" || arg == "-q")
|
||||
op = opQuery;
|
||||
else if (arg == "--import" || arg == "-I") /* !!! bad name */
|
||||
op = opDefaultExpr;
|
||||
else if (arg == "--link" || arg == "-l") {
|
||||
++i;
|
||||
if (i == args.end()) throw UsageError(
|
||||
format("`%1%' requires an argument") % arg);
|
||||
globals.linkPath = absPath(*i);
|
||||
}
|
||||
else if (arg == "--file" || arg == "-f") {
|
||||
++i;
|
||||
if (i == args.end()) throw UsageError(
|
||||
format("`%1%' requires an argument") % arg);
|
||||
globals.nixExprPath = absPath(*i);
|
||||
}
|
||||
else if (arg == "--profile" || arg == "-p")
|
||||
op = opSwitchProfile;
|
||||
else if (arg[0] == '-')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue