nix-env -q --out-path: Support multiple outputs
We now print all output paths of a package, e.g.
  openssl-1.0.0i  bin=/nix/store/gq2mvh0wb9l90djvsagln3aqywqmr6vl-openssl-1.0.0i-bin;man=/nix/store/7zwf5r5hsdarl3n86dasvb4chm2xzw9n-openssl-1.0.0i-man;/nix/store/cj7xvk7fjp9q887359j75pw3pzjfmqf1-openssl-1.0.0i
or (in XML mode)
  <item attrPath="openssl" name="openssl-1.0.0i" system="x86_64-linux">
    <output name="bin" path="/nix/store/gq2mvh0wb9l90djvsagln3aqywqmr6vl-openssl-1.0.0i-bin" />
    <output name="man" path="/nix/store/7zwf5r5hsdarl3n86dasvb4chm2xzw9n-openssl-1.0.0i-man" />
    <output name="out" path="/nix/store/cj7xvk7fjp9q887359j75pw3pzjfmqf1-openssl-1.0.0i" />
  </item>
			
			
This commit is contained in:
		
							parent
							
								
									6c98e6a5de
								
							
						
					
					
						commit
						8eed07cda4
					
				
					 5 changed files with 94 additions and 45 deletions
				
			
		|  | @ -138,6 +138,7 @@ EvalState::EvalState() | |||
|     , sName(symbols.create("name")) | ||||
|     , sSystem(symbols.create("system")) | ||||
|     , sOverrides(symbols.create("__overrides")) | ||||
|     , sOutputs(symbols.create("outputs")) | ||||
|     , sOutputName(symbols.create("outputName")) | ||||
|     , sIgnoreNulls(symbols.create("__ignoreNulls")) | ||||
|     , baseEnv(allocEnv(128)) | ||||
|  |  | |||
|  | @ -93,7 +93,7 @@ public: | |||
|     SymbolTable symbols; | ||||
| 
 | ||||
|     const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, | ||||
|         sSystem, sOverrides, sOutputName, sIgnoreNulls; | ||||
|         sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls; | ||||
| 
 | ||||
|     /* If set, force copying files to the Nix store even if they
 | ||||
|        already exist there. */ | ||||
|  |  | |||
|  | @ -28,12 +28,42 @@ string DrvInfo::queryOutPath(EvalState & state) const | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| DrvInfo::Outputs DrvInfo::queryOutputs(EvalState & state) | ||||
| { | ||||
|     if (outputs.empty()) { | ||||
|         /* Get the ‘outputs’ list. */ | ||||
|         Bindings::iterator i = attrs->find(state.sOutputs); | ||||
| 
 | ||||
|         if (i == attrs->end()) | ||||
|             outputs["out"] = queryOutPath(state); | ||||
|         else { | ||||
|             state.forceList(*i->value); | ||||
| 
 | ||||
|             /* For each output... */ | ||||
|             for (unsigned int j = 0; j < i->value->list.length; ++j) { | ||||
|                 /* Evaluate the corresponding attribute set. */ | ||||
|                 string name = state.forceStringNoCtx(*i->value->list.elems[j]); | ||||
|                 Bindings::iterator out = attrs->find(state.symbols.create(name)); | ||||
|                 if (out == attrs->end()) continue; // FIXME: throw error?
 | ||||
|                 state.forceAttrs(*out->value); | ||||
| 
 | ||||
|                 /* And evaluate its ‘outPath’ attribute. */ | ||||
|                 Bindings::iterator outPath = out->value->attrs->find(state.sOutPath); | ||||
|                 if (outPath == out->value->attrs->end()) continue; // FIXME: throw error?
 | ||||
|                 PathSet context; | ||||
|                 outputs[name] = state.coerceToPath(*outPath->value, context); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return outputs; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| string DrvInfo::queryOutputName(EvalState & state) const | ||||
| { | ||||
|     if (outputName == "" && attrs) { | ||||
|         Bindings::iterator i = attrs->find(state.sOutputName); | ||||
|         PathSet context; | ||||
|         (string &) outputName = i != attrs->end() ? state.coerceToString(*i->value, context) : ""; | ||||
|         (string &) outputName = i != attrs->end() ? state.forceStringNoCtx(*i->value) : ""; | ||||
|     } | ||||
|     return outputName; | ||||
| } | ||||
|  |  | |||
|  | @ -25,10 +25,14 @@ typedef std::map<string, MetaValue> MetaInfo; | |||
| 
 | ||||
| struct DrvInfo | ||||
| { | ||||
| public: | ||||
|     typedef std::map<string, Path> Outputs; | ||||
| 
 | ||||
| private: | ||||
|     string drvPath; | ||||
|     string outPath; | ||||
|     string outputName; | ||||
|     Outputs outputs; | ||||
| 
 | ||||
|     bool metaInfoRead; | ||||
|     MetaInfo meta; | ||||
|  | @ -48,6 +52,7 @@ public: | |||
|     string queryDrvPath(EvalState & state) const; | ||||
|     string queryOutPath(EvalState & state) const; | ||||
|     string queryOutputName(EvalState & state) const; | ||||
|     Outputs queryOutputs(EvalState & state); | ||||
|     MetaInfo queryMetaInfo(EvalState & state) const; | ||||
|     MetaValue queryMetaInfo(EvalState & state, const string & name) const; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1041,12 +1041,15 @@ static void opQuery(Globals & globals, | |||
|                     columns.push_back(drvPath == "" ? "-" : drvPath); | ||||
|             } | ||||
| 
 | ||||
|             if (printOutPath) { | ||||
|                 string outPath = i->queryOutPath(globals.state); | ||||
|                 if (xmlOutput) { | ||||
|                     if (outPath != "") attrs["outPath"] = outPath; | ||||
|                 } else | ||||
|                     columns.push_back(outPath); | ||||
|             if (printOutPath && !xmlOutput) { | ||||
|                 DrvInfo::Outputs outputs = i->queryOutputs(globals.state); | ||||
|                 string s; | ||||
|                 foreach (DrvInfo::Outputs::iterator, j, outputs) { | ||||
|                     if (!s.empty()) s += ';'; | ||||
|                     if (j->first != "out") { s += j->first; s += "="; } | ||||
|                     s += j->second; | ||||
|                 } | ||||
|                 columns.push_back(s); | ||||
|             } | ||||
| 
 | ||||
|             if (printDescription) { | ||||
|  | @ -1059,9 +1062,19 @@ static void opQuery(Globals & globals, | |||
|                     columns.push_back(descr); | ||||
|             } | ||||
| 
 | ||||
|             if (xmlOutput) | ||||
|                 if (printMeta) { | ||||
|             if (xmlOutput) { | ||||
|                 if (printOutPath || printMeta) { | ||||
|                     XMLOpenElement item(xml, "item", attrs); | ||||
|                     if (printOutPath) { | ||||
|                         DrvInfo::Outputs outputs = i->queryOutputs(globals.state); | ||||
|                         foreach (DrvInfo::Outputs::iterator, j, outputs) { | ||||
|                             XMLAttrs attrs2; | ||||
|                             attrs2["name"] = j->first; | ||||
|                             attrs2["path"] = j->second; | ||||
|                             xml.writeEmptyElement("output", attrs2); | ||||
|                         } | ||||
|                     } | ||||
|                     if (printMeta) { | ||||
|                         MetaInfo meta = i->queryMetaInfo(globals.state); | ||||
|                         for (MetaInfo::iterator j = meta.begin(); j != meta.end(); ++j) { | ||||
|                             XMLAttrs attrs2; | ||||
|  | @ -1085,9 +1098,9 @@ static void opQuery(Globals & globals, | |||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 else | ||||
|                 } else | ||||
|                     xml.writeEmptyElement("item", attrs); | ||||
|             else | ||||
|             } else | ||||
|                 table.push_back(columns); | ||||
| 
 | ||||
|             cout.flush(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue