parent
							
								
									3fe9767dd3
								
							
						
					
					
						commit
						b095c06139
					
				
					 6 changed files with 37 additions and 1 deletions
				
			
		| 
						 | 
					@ -126,6 +126,17 @@ if builtins ? getEnv then builtins.getEnv "PATH" else ""</programlisting>
 | 
				
			||||||
  </varlistentry>
 | 
					  </varlistentry>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <varlistentry><term><function>builtins.splitVersion</function>
 | 
				
			||||||
 | 
					  <replaceable>s</replaceable></term>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <listitem><para>Split a string representing a version into its
 | 
				
			||||||
 | 
					    components, by the same version splitting logic underlying the
 | 
				
			||||||
 | 
					    version comparison in <link linkend="ssec-version-comparisons">
 | 
				
			||||||
 | 
					    <command>nix-env -u</command></link>.</para></listitem>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </varlistentry>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <varlistentry><term><function>builtins.concatLists</function>
 | 
					  <varlistentry><term><function>builtins.concatLists</function>
 | 
				
			||||||
  <replaceable>lists</replaceable></term>
 | 
					  <replaceable>lists</replaceable></term>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@ bool DrvName::matches(DrvName & n)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static string nextComponent(string::const_iterator & p,
 | 
					string nextComponent(string::const_iterator & p,
 | 
				
			||||||
    const string::const_iterator end)
 | 
					    const string::const_iterator end)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* Skip any dots and dashes (component separators). */
 | 
					    /* Skip any dots and dashes (component separators). */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,8 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef list<DrvName> DrvNames;
 | 
					typedef list<DrvName> DrvNames;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					string nextComponent(string::const_iterator & p,
 | 
				
			||||||
 | 
					    const string::const_iterator end);
 | 
				
			||||||
int compareVersions(const string & v1, const string & v2);
 | 
					int compareVersions(const string & v1, const string & v2);
 | 
				
			||||||
DrvNames drvNamesFromArgs(const Strings & opArgs);
 | 
					DrvNames drvNamesFromArgs(const Strings & opArgs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1961,6 +1961,26 @@ static void prim_compareVersions(EvalState & state, const Pos & pos, Value * * a
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void prim_splitVersion(EvalState & state, const Pos & pos, Value * * args, Value & v)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    string version = state.forceStringNoCtx(*args[0], pos);
 | 
				
			||||||
 | 
					    auto iter = version.cbegin();
 | 
				
			||||||
 | 
					    Strings components;
 | 
				
			||||||
 | 
					    while (iter != version.cend()) {
 | 
				
			||||||
 | 
					        auto component = nextComponent(iter, version.cend());
 | 
				
			||||||
 | 
					        if (component.empty())
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        components.emplace_back(std::move(component));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    state.mkList(v, components.size());
 | 
				
			||||||
 | 
					    unsigned int n = 0;
 | 
				
			||||||
 | 
					    for (auto & component : components) {
 | 
				
			||||||
 | 
					        auto listElem = v.listElems()[n++] = state.allocValue();
 | 
				
			||||||
 | 
					        mkString(*listElem, std::move(component));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*************************************************************
 | 
					/*************************************************************
 | 
				
			||||||
 * Networking
 | 
					 * Networking
 | 
				
			||||||
 *************************************************************/
 | 
					 *************************************************************/
 | 
				
			||||||
| 
						 | 
					@ -2196,6 +2216,7 @@ void EvalState::createBaseEnv()
 | 
				
			||||||
    // Versions
 | 
					    // Versions
 | 
				
			||||||
    addPrimOp("__parseDrvName", 1, prim_parseDrvName);
 | 
					    addPrimOp("__parseDrvName", 1, prim_parseDrvName);
 | 
				
			||||||
    addPrimOp("__compareVersions", 2, prim_compareVersions);
 | 
					    addPrimOp("__compareVersions", 2, prim_compareVersions);
 | 
				
			||||||
 | 
					    addPrimOp("__splitVersion", 1, prim_splitVersion);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Derivations
 | 
					    // Derivations
 | 
				
			||||||
    addPrimOp("derivationStrict", 1, prim_derivationStrict);
 | 
					    addPrimOp("derivationStrict", 1, prim_derivationStrict);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								tests/lang/eval-okay-splitversion.exp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/lang/eval-okay-splitversion.exp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					[ "1" "2" "3" ]
 | 
				
			||||||
							
								
								
									
										1
									
								
								tests/lang/eval-okay-splitversion.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/lang/eval-okay-splitversion.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					builtins.splitVersion "1.2.3"
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue