diff options
author | Shea Levy <shea@shealevy.com> | 2018-02-13T23·28-0500 |
---|---|---|
committer | Shea Levy <shea@shealevy.com> | 2018-02-14T14·55-0500 |
commit | b095c06139fa267e6050e4c95208c627cc6251b8 (patch) | |
tree | 3fb353d3eaa7334a127d5fe30cd6499abe002d16 /src/libexpr/primops.cc | |
parent | 3fe9767dd33499c2560d209dc13a01f5fcead1f0 (diff) |
Add splitVersion primop.
Fixes #1868.
Diffstat (limited to 'src/libexpr/primops.cc')
-rw-r--r-- | src/libexpr/primops.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 466fd13e8698..ca97b2b28bb6 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); |