* 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).
			
			
This commit is contained in:
		
							parent
							
								
									e446d342b7
								
							
						
					
					
						commit
						8992fce3da
					
				
					 4 changed files with 52 additions and 10 deletions
				
			
		|  | @ -28,4 +28,9 @@ Derivation derivationFromPath(const Path & drvPath); | ||||||
| void computeFSClosure(const Path & storePath, | void computeFSClosure(const Path & storePath, | ||||||
|     PathSet & paths, bool flipDirection = false); |     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 */ | #endif /* !__BUILD_H */ | ||||||
|  |  | ||||||
|  | @ -27,3 +27,12 @@ void computeFSClosure(const Path & storePath, | ||||||
|          i != references.end(); ++i) |          i != references.end(); ++i) | ||||||
|         computeFSClosure(*i, paths, flipDirection); |         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); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| #include "names.hh" | #include "names.hh" | ||||||
| #include "globals.hh" | #include "globals.hh" | ||||||
| #include "build.hh" | #include "build.hh" | ||||||
|  | #include "gc.hh" | ||||||
| #include "shared.hh" | #include "shared.hh" | ||||||
| #include "parser.hh" | #include "parser.hh" | ||||||
| #include "eval.hh" | #include "eval.hh" | ||||||
|  | @ -226,6 +227,12 @@ static void createUserEnv(EvalState & state, const UserEnvElems & elems, | ||||||
|             )); |             )); | ||||||
|         manifest = ATinsert(manifest, t); |         manifest = ATinsert(manifest, t); | ||||||
|         inputs = ATinsert(inputs, makeStr(toATerm(i->second.outPath))); |         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); |         references.insert(i->second.outPath); | ||||||
|         if (drvPath != "") references.insert(drvPath); |         if (drvPath != "") references.insert(drvPath); | ||||||
|     } |     } | ||||||
|  | @ -270,7 +277,11 @@ static void queryInstSources(EvalState & state, | ||||||
|     const InstallSourceInfo & instSource, const Strings & args, |     const InstallSourceInfo & instSource, const Strings & args, | ||||||
|     UserEnvElems & elems) |     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
 |         /* Get the available user environment elements from the
 | ||||||
|            derivations specified in a Nix expression, including only |            derivations specified in a Nix expression, including only | ||||||
|  | @ -333,6 +344,32 @@ static void queryInstSources(EvalState & state, | ||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|         case srcStorePaths: |         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; |             break; | ||||||
| 
 | 
 | ||||||
|         case srcProfile: |         case srcProfile: | ||||||
|  |  | ||||||
|  | @ -23,15 +23,6 @@ static int rootNr = 0; | ||||||
| static bool indirectRoot = false; | 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) | static Path fixPath(Path path) | ||||||
| { | { | ||||||
|     path = absPath(path); |     path = absPath(path); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue