about summary refs log tree commit diff
path: root/tvix
diff options
context:
space:
mode:
authorsterni <sternenseemann@systemli.org>2022-09-20T10·51+0200
committersterni <sternenseemann@systemli.org>2022-09-21T13·08+0000
commit834fe833e5dc1df6838cfa69c24a6f3b3c7a5c5b (patch)
treedc820a48acd4b34f9b5ae1a12dbc7f5ab83f2dfd /tvix
parent6e6edcce6ac38bf2ca088a7efeb73f5db0bee8a6 (diff)
fix(tvix/eval/versions): preserve the Number string exactly r/4947
This is relevant for builtins.splitVersion:

    nix-repl> builtins.splitVersion "unstable-2022-02-21"
    [ "unstable" "2022" "02" "21" ]

Change-Id: I0a0add178d95d5a82e112b41ed5f3ca5a19608f8
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6710
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Diffstat (limited to 'tvix')
-rw-r--r--tvix/eval/src/builtins/mod.rs3
-rw-r--r--tvix/eval/src/builtins/versions.rs8
2 files changed, 5 insertions, 6 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs
index 02457340dcd1..0b1fe540fed9 100644
--- a/tvix/eval/src/builtins/mod.rs
+++ b/tvix/eval/src/builtins/mod.rs
@@ -220,8 +220,7 @@ fn pure_builtins() -> Vec<Builtin> {
             let parts = s
                 .map(|s| {
                     Value::String(match s {
-                        // TODO(sterni): we should avoid converting back and forth here
-                        VersionPart::Number(n) => format!("{n}").into(),
+                        VersionPart::Number(n) => n.into(),
                         VersionPart::Word(w) => w.into(),
                     })
                 })
diff --git a/tvix/eval/src/builtins/versions.rs b/tvix/eval/src/builtins/versions.rs
index 60d4503c7e4b..33679ed4034b 100644
--- a/tvix/eval/src/builtins/versions.rs
+++ b/tvix/eval/src/builtins/versions.rs
@@ -6,7 +6,7 @@ use std::ops::RangeInclusive;
 #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)]
 pub enum VersionPart<'a> {
     Word(&'a str),
-    Number(u64),
+    Number(&'a str),
 }
 
 /// Type used to hold information about a VersionPart during creation
@@ -46,7 +46,7 @@ impl<'a> Iterator for VersionPartsIter<'a> {
             match cached_part {
                 InternalPart::Break => return None,
                 InternalPart::Number { range } => {
-                    return Some(VersionPart::Number(self.version[range].parse().unwrap()))
+                    return Some(VersionPart::Number(&self.version[range]))
                 }
                 InternalPart::Word { range } => {
                     return Some(VersionPart::Word(&self.version[range]))
@@ -61,7 +61,7 @@ impl<'a> Iterator for VersionPartsIter<'a> {
                 let cached_part = std::mem::replace(&mut self.cached_part, InternalPart::Break);
                 match cached_part {
                     InternalPart::Number { range } => {
-                        Some(VersionPart::Number(self.version[range].parse().unwrap()))
+                        Some(VersionPart::Number(&self.version[range]))
                     }
                     InternalPart::Word { range } => Some(VersionPart::Word(&self.version[range])),
                     InternalPart::Break => self.next(),
@@ -98,7 +98,7 @@ impl<'a> Iterator for VersionPartsIter<'a> {
                         self.next()
                     }
                     InternalPart::Number { range } => {
-                        Some(VersionPart::Number(self.version[range].parse().unwrap()))
+                        Some(VersionPart::Number(&self.version[range]))
                     }
                     InternalPart::Break => self.next(),
                 }