diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-02-14T17·35+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-02-14T17·35+0000 |
commit | 8992fce3da844e3cfc7cbc563cbf5313980c16dd (patch) | |
tree | af637cfba0fccea836877d43cd950f7aab93f164 /src/nix-env/main.cc | |
parent | e446d342b77e0babb200afd6b6275df2c70cfaee (diff) |
* It is now possible to add store derivations or paths directly to a
user environment, e.g., $ nix-env -i /nix/store/z58v41v21xd3ywrqk1vmvdwlagjx7f10-aterm-2.3.1.drv or $ nix-env -i /nix/store/hsyj5pbn0d9iz7q0aj0fga7cpaadvp1l-aterm-2.3.1 This is useful because it allows Nix expressions to be bypassed entirely. For instance, if only a nix-pull manifest is provided, plus the top-level path of some component, it can be installed without having to supply the Nix expression (e.g., for obfuscation, or to be independent of Nix expression language changes or context dependencies).
Diffstat (limited to 'src/nix-env/main.cc')
-rw-r--r-- | src/nix-env/main.cc | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index a250413ab1ad..bab1f7fe1434 100644 --- a/src/nix-env/main.cc +++ b/src/nix-env/main.cc @@ -2,6 +2,7 @@ #include "names.hh" #include "globals.hh" #include "build.hh" +#include "gc.hh" #include "shared.hh" #include "parser.hh" #include "eval.hh" @@ -226,6 +227,12 @@ static void createUserEnv(EvalState & state, const UserEnvElems & elems, )); manifest = ATinsert(manifest, t); inputs = ATinsert(inputs, makeStr(toATerm(i->second.outPath))); + + /* This is only necessary when installing store paths, e.g., + `nix-env -i /nix/store/abcd...-foo'. */ + addTempRoot(i->second.outPath); + ensurePath(i->second.outPath); + references.insert(i->second.outPath); if (drvPath != "") references.insert(drvPath); } @@ -270,7 +277,11 @@ static void queryInstSources(EvalState & state, const InstallSourceInfo & instSource, const Strings & args, UserEnvElems & elems) { - switch (instSource.type) { + InstallSourceType type = instSource.type; + if (type == srcUnknown && args.size() > 0 && args.front()[0] == '/') + type = srcStorePaths; + + switch (type) { /* Get the available user environment elements from the derivations specified in a Nix expression, including only @@ -333,6 +344,32 @@ static void queryInstSources(EvalState & state, break; case srcStorePaths: + + for (Strings::const_iterator i = args.begin(); + i != args.end(); ++i) + { + assertStorePath(*i); + + UserEnvElem elem; + string name = baseNameOf(*i); + unsigned int dash = name.find('-'); + if (dash != string::npos) + name = string(name, dash + 1); + + if (isDerivation(*i)) { + elem.drvPath = *i; + elem.outPath = findOutput(derivationFromPath(*i), "out"); + if (name.size() >= drvExtension.size() && + string(name, name.size() - drvExtension.size()) == drvExtension) + name = string(name, 0, name.size() - drvExtension.size()); + } + else elem.outPath = *i; + + elem.name = name; + + elems[elem.outPath] = elem; + } + break; case srcProfile: |