diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-02-14 17:35:10 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-02-14 17:35:10 +0000 |
commit | 8992fce3da844e3cfc7cbc563cbf5313980c16dd (patch) | |
tree | af637cfba0fccea836877d43cd950f7aab93f164 | |
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).
-rw-r--r-- | src/libstore/build.hh | 5 | ||||
-rw-r--r-- | src/libstore/misc.cc | 9 | ||||
-rw-r--r-- | src/nix-env/main.cc | 39 | ||||
-rw-r--r-- | src/nix-store/main.cc | 9 |
4 files changed, 52 insertions, 10 deletions
diff --git a/src/libstore/build.hh b/src/libstore/build.hh index 2c6bcf9f2..45997ebb2 100644 --- a/src/libstore/build.hh +++ b/src/libstore/build.hh @@ -28,4 +28,9 @@ Derivation derivationFromPath(const Path & drvPath); void computeFSClosure(const Path & storePath, PathSet & paths, bool flipDirection = false); +/* Return the path corresponding to the output identifier `id' in the + given derivation. */ +Path findOutput(const Derivation & drv, string id); + + #endif /* !__BUILD_H */ diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc index 5f20ee277..f3cc98bf4 100644 --- a/src/libstore/misc.cc +++ b/src/libstore/misc.cc @@ -27,3 +27,12 @@ void computeFSClosure(const Path & storePath, i != references.end(); ++i) computeFSClosure(*i, paths, flipDirection); } + + + Path findOutput(const Derivation & drv, string id) +{ + for (DerivationOutputs::const_iterator i = drv.outputs.begin(); + i != drv.outputs.end(); ++i) + if (i->first == id) return i->second.path; + throw Error(format("derivation has no output `%1%'") % id); +} diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index a250413ab..bab1f7fe1 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: diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc index fa7960c38..a93956ab7 100644 --- a/src/nix-store/main.cc +++ b/src/nix-store/main.cc @@ -23,15 +23,6 @@ static int rootNr = 0; static bool indirectRoot = false; -static Path findOutput(const Derivation & drv, string id) -{ - for (DerivationOutputs::const_iterator i = drv.outputs.begin(); - i != drv.outputs.end(); ++i) - if (i->first == id) return i->second.path; - throw Error(format("derivation has no output `%1%'") % id); -} - - static Path fixPath(Path path) { path = absPath(path); |