-
Notifications
You must be signed in to change notification settings - Fork 0
/
semver.l
88 lines (73 loc) · 2.02 KB
/
semver.l
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# semver.l
#
# The MIT License (MIT)
#
# Copyright (c) 2017-2020 Alexander Williams, Unscramble <license@unscramble.jp>
#
# Semver 2.0.0 compliant: https://semver.org/spec/v2.0.0.html#semantic-versioning-specification-semver
(load (pack (car (file)) "module.l"))
### internal
# http://stackoverflow.com/a/827656
# a <=> b :=
# if a < b then return -1
# if a = b then return 0
# if a > b then return 1
[de <=> (A B)
(cond
((< A B) NIL)
((= A B) 0)
((> A B) T) ]
# unused alternative
# [de <=> @
# (if (pass =)
# 0
# (pass >) ]
[de semver-internal-cmp-versions (V1 V2)
(list
(<=> (car V1) (car V2))
(<=> (cadr V1) (cadr V2))
(<=> (caddr V1) (caddr V2)) ]
[de semver-internal-cmp-lists (A B C)
(if (= A B)
0
(<> B C) ]
[de semver-internal-cmp-range (A B Max)
(or (and A (not B))
(and A (not Max)) ]
[de semver-internal-to-string (L)
(glue "." L) ]
# pre-release and build metadata
# https://semver.org/spec/v2.0.0.html#spec-item-9
# https://semver.org/spec/v2.0.0.html#spec-item-10
[de semver-internal-to-version (S)
(clip (split (chop S) '. '- 'v '+)) ]
### public
# public api
# https://semver.org/spec/v2.0.0.html#spec-item-1
[de semver-cmp (V1 V2)
(semver-internal-cmp-versions V1 V2) ]
# version number format
# https://semver.org/spec/v2.0.0.html#spec-item-2
[de semver-format (S)
(let R (mapcar format (head 3 (semver-internal-to-version S)))
(when (full R) R) ]
[de semver-compare (V1 V2)
(if (= V1 V2)
0
(let (A (semver-format V1)
B (semver-format V2)
R (sort (list A B)) )
(semver-internal-cmp-lists A B (cadr R)) ]
# precedence
# https://semver.org/spec/v2.0.0.html#spec-item-11
[de semver-sort (L S?)
(let V (sort (mapcar semver-format L))
(if S?
(mapcar semver-internal-to-string V)
V ]
[de semver-satisfies (Ver Min Max)
(when Ver
(or (nor Min Max)
(let (A (semver-compare Ver Min)
B (semver-compare Ver Max) )
(semver-internal-cmp-range A B Max) ]