Skip to content

Commit bd771b9

Browse files
committed
fix: prereleases in tilde ranges & API touchups
1 parent 4692410 commit bd771b9

File tree

2 files changed

+52
-35
lines changed

2 files changed

+52
-35
lines changed

src/lake/Lake/Util/Version.lean

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -397,17 +397,19 @@ public instance : ToString Comparator := ⟨Comparator.toString⟩
397397
end Comparator
398398

399399
public structure VerComparator where
400-
ver : StdVer
401-
op : Comparator
402-
deriving Repr
400+
private innerMk ::
401+
private ver : StdVer
402+
private op : Comparator
403+
private includePrereleases : Bool := false
404+
deriving Repr
403405

404406
namespace VerComparator
405407

406-
/-- A version comparator that matches any version (i.e., `≥0.0.0`). -/
407-
def any : VerComparator :=
408+
/-- A version comparator that matches any non-prerelease version (i.e., `*`, `≥0.0.0`). -/
409+
public def wild : VerComparator :=
408410
{op := .ge, ver := .ofSemVerCore {}}
409411

410-
instance : Inhabited VerComparator := ⟨.any
412+
public instance : Inhabited VerComparator := ⟨.wild
411413

412414
def parseM (s : String) : EStateM String s.ValidPos VerComparator := do
413415
let op ← Comparator.parseM s
@@ -418,28 +420,34 @@ def parseM (s : String) : EStateM String s.ValidPos VerComparator := do
418420
runVerParse s parseM
419421

420422
public def test (self : VerComparator) (ver : StdVer) : Bool :=
421-
match self.ver.specialDescr, ver.specialDescr with
422-
| _, "" =>
423-
match self.op with
424-
| .lt => ver < self.ver
425-
| .le => ver ≤ self.ver
426-
| .gt => ver > self.ver
427-
| .ge => ver ≥ self.ver
428-
| .eq => ver = self.ver
429-
| .ne => ver ≠ self.ver
430-
| "", _ =>
431-
false
432-
| selfDescr, verDescr =>
433-
if self.ver.toSemVerCore = ver.toSemVerCore then
434-
match self.op with
435-
| .lt => verDescr < selfDescr
436-
| .le => verDescr ≤ selfDescr
437-
| .gt => verDescr > selfDescr
438-
| .ge => verDescr ≥ selfDescr
439-
| .eq => verDescr = selfDescr
440-
| .ne => verDescr ≠ selfDescr
441-
else
423+
let fullCheck op selfVer ver :=
424+
match op with
425+
| .lt => ver < selfVer
426+
| .le => ver ≤ selfVer
427+
| .gt => ver > selfVer
428+
| .ge => ver ≥ selfVer
429+
| .eq => ver = selfVer
430+
| .ne => ver ≠ selfVer
431+
let {op, ver := selfVer, includePrereleases} := self
432+
if includePrereleases then
433+
fullCheck op selfVer ver
434+
else
435+
match selfVer.specialDescr, ver.specialDescr with
436+
| _, "" =>
437+
fullCheck op selfVer ver
438+
| "", _ =>
442439
false
440+
| selfDescr, verDescr =>
441+
if selfVer.toSemVerCore = ver.toSemVerCore then
442+
match op with
443+
| .lt => verDescr < selfDescr
444+
| .le => verDescr ≤ selfDescr
445+
| .gt => verDescr > selfDescr
446+
| .ge => verDescr ≥ selfDescr
447+
| .eq => verDescr = selfDescr
448+
| .ne => verDescr ≠ selfDescr
449+
else
450+
false
443451

444452
public protected def toString (self : VerComparator) : String :=
445453
s!"{self.op}{self.ver}"
@@ -526,7 +534,7 @@ where
526534
@[inline] appendRange ands minVer maxVer (specialDescr := "") :=
527535
let minVer := StdVer.mk minVer specialDescr
528536
let maxVer := StdVer.ofSemVerCore maxVer
529-
ands.push {op := .ge, ver := minVer} |>.push {op := .lt, ver := maxVer}
537+
ands.push {op := .ge, ver := minVer} |>.push {op := .lt, ver := maxVer, includePrereleases := true}
530538
parseWild (s : String) ands : EStateM String s.ValidPos _ := do
531539
let cs ← parseVerComponents s
532540
if (← get).get?.any (· == '-') then
@@ -551,7 +559,7 @@ where
551559
if you want to fix a specific version, use '=' before the full version; \
552560
otherwise, use '≥' to support it and future versions"
553561
| _, _, _ =>
554-
return ands.push .any
562+
return ands.push .wild
555563
parseTilde (s : String) ands : EStateM String s.ValidPos _ := do
556564
let cs ← parseVerComponents s
557565
let specialDescr ← parseSpecialDescr s

tests/lake/tests/api/vers.lean

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,18 @@ https://doc.rust-lang.org/stable/cargo/reference/specifying-dependencies.html#co
5050
#eval checkMatch "=1.2.3" #["1.2.3"] #["1.0.0", "2.0.0"]
5151
#eval checkMatch "≠1.2.3" #["1.0.0", "2.0.0"] #["1.2.3"]
5252

53-
#eval checkMatch "<1.2.3-alpha.3" #["1.2.3-alpha.1"] #["1.2.3-alpha.3", "1.2.3-alpha.7", "1.0.0-alpha.9"]
54-
#eval checkMatch "≤1.2.3-alpha.3" #["1.2.3-alpha.1", "1.2.3-alpha.3"] #["1.2.3-alpha.7", "1.0.0-alpha.9"]
55-
#eval checkMatch ">1.2.3-alpha.3" #["1.2.3-alpha.7"] #["1.2.3-alpha.1", "1.2.3-alpha.3", "3.4.5-alpha.9"]
56-
#eval checkMatch "≥1.2.3-alpha.3" #["1.2.3-alpha.3", "1.2.3-alpha.7"] #["1.2.3-alpha.1", "3.4.5-alpha.9"]
57-
#eval checkMatch "=1.2.3-alpha.3" #["1.2.3-alpha.3"] #["1.2.3-alpha.1", "1.2.3-alpha.7", "3.4.5-alpha.9"]
58-
#eval checkMatch "≠1.2.3-alpha.3" #["1.2.3-alpha.1", "1.2.3-alpha.7"] #["1.2.3-alpha.3", "3.4.5-alpha.9"]
53+
#eval checkMatch "<1.2.3-alpha.3"
54+
#["1.2.3-alpha.1"] #["1.2.3", "1.2.3-alpha.7", "1.2.3-alpha.3", "1.0.0-alpha.9"]
55+
#eval checkMatch "≤1.2.3-alpha.3"
56+
#["1.2.3-alpha.1", "1.2.3-alpha.3"] #["1.2.3", "1.2.3-alpha.7", "1.0.0-alpha.9"]
57+
#eval checkMatch ">1.2.3-alpha.3"
58+
#["1.2.3-alpha.7", "1.2.3"] #["1.2.3-alpha.1", "1.2.3-alpha.3", "3.4.5-alpha.9"]
59+
#eval checkMatch "≥1.2.3-alpha.3"
60+
#["1.2.3-alpha.3", "1.2.3-alpha.7", "1.2.3"] #["1.2.3-alpha.1", "3.4.5-alpha.9"]
61+
#eval checkMatch "=1.2.3-alpha.3"
62+
#["1.2.3-alpha.3"] #["1.2.3-alpha.1", "1.2.3-alpha.7", "1.2.3", "3.4.5-alpha.9"]
63+
#eval checkMatch "≠1.2.3-alpha.3"
64+
#["1.2.3-alpha.1", "1.2.3-alpha.7", "1.2.3"] #["1.2.3-alpha.3", "3.4.5-alpha.9"]
5965

6066
/-!
6167
## Clauses
@@ -145,6 +151,9 @@ https://doc.rust-lang.org/stable/cargo/reference/specifying-dependencies.html#ti
145151
/-- error: invalid tilde range: incorrect number of components: got 4, expected 1-3 -/
146152
#guard_msgs in #eval runParse "~1.2.3.4"
147153

154+
#eval checkMatch "~1.2.3-beta.2"
155+
#["1.2.3-beta.2", "1.2.3-beta.7", "1.2.3"] #["1.2.4-alpha.3", "1.2.4"]
156+
148157
/-! ## Wildcard Ranges
149158
150159
Lake supports both the `*` (Rust and Node) and the `x`/`X` (Node) form of wildcard versions.

0 commit comments

Comments
 (0)