aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/names.cc2
-rw-r--r--src/libexpr/names.hh2
-rw-r--r--src/libexpr/primops.cc21
3 files changed, 24 insertions, 1 deletions
diff --git a/src/libexpr/names.cc b/src/libexpr/names.cc
index 6d78d2116..382088c78 100644
--- a/src/libexpr/names.cc
+++ b/src/libexpr/names.cc
@@ -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)
{
/* Skip any dots and dashes (component separators). */
diff --git a/src/libexpr/names.hh b/src/libexpr/names.hh
index 9667fc96f..13c3093e7 100644
--- a/src/libexpr/names.hh
+++ b/src/libexpr/names.hh
@@ -24,6 +24,8 @@ private:
typedef list<DrvName> DrvNames;
+string nextComponent(string::const_iterator & p,
+ const string::const_iterator end);
int compareVersions(const string & v1, const string & v2);
DrvNames drvNamesFromArgs(const Strings & opArgs);
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 466fd13e8..ca97b2b28 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -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
*************************************************************/
@@ -2196,6 +2216,7 @@ void EvalState::createBaseEnv()
// Versions
addPrimOp("__parseDrvName", 1, prim_parseDrvName);
addPrimOp("__compareVersions", 2, prim_compareVersions);
+ addPrimOp("__splitVersion", 1, prim_splitVersion);
// Derivations
addPrimOp("derivationStrict", 1, prim_derivationStrict);