Skip to content

Commit 7273295

Browse files
committed
It works... more or less...
1 parent 4157744 commit 7273295

File tree

2 files changed

+186
-38
lines changed

2 files changed

+186
-38
lines changed

semver.sh

Lines changed: 125 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,34 @@ get_labels()
2424

2525
}
2626

27+
get_major()
28+
{
29+
echo "$1" | grep -E -o "^$_num_part"
30+
}
31+
32+
get_minor()
33+
{
34+
min=$(echo "$1" | grep -E -o "^$_num_part.$_num_part")
35+
min=${min#*.}
36+
37+
if [ -z "$min" ]; then
38+
echo -n 0
39+
else
40+
echo -n $min
41+
fi
42+
}
43+
44+
strip_metadata()
45+
{
46+
echo -n ${1%%+*}
47+
}
48+
2749
semver_eq()
2850
{
29-
[ "$1" = "$2" ] && return 0 || return 1
51+
ver1=$(strip_metadata $1)
52+
ver2=$(strip_metadata $2)
53+
54+
[ "$ver1" = "$ver2" ] && return 0 || return 1
3055
}
3156

3257
semver_lt()
@@ -92,7 +117,7 @@ regex_match()
92117
local string="$1"
93118
local regexp="$2"
94119
local bre="$(eval "echo '$regexp' | sed 's/\\([(){}]\\)/\\\\\\1/g'")"
95-
local match="$(eval "echo '$string' | grep --extended-regexp --line-regexp '$regexp'")";
120+
local match="$(eval "echo '$string' | grep -E -x '$regexp'")";
96121

97122
for i in $(seq 0 9); do
98123
unset "MATCHED_VER_$i"
@@ -107,9 +132,9 @@ regex_match()
107132
local part
108133
local i=1
109134
for part in $(echo $string); do
110-
local ver="$(eval "echo '$part' | grep --extended-regexp --only-matching '$RE_VER'")";
111-
local num="$(eval "echo '$part' | grep -E -o '$RE_NUM' | head -n1")";
112-
local lab="$(eval "echo '$part' | grep -E -o '\-$RE_LAB' | cut -c 2-")";
135+
local ver="$(eval "echo '$part' | grep -E -o '$RE_VER' | head -n 1 ")";
136+
local num="$(eval "echo '$part' | grep -E -o '$RE_NUM' | head -n 1 ")";
137+
local lab="$(eval "echo '$part' | grep -E -o '\-$RE_LAB' | cut -c 2- ")";
113138

114139
if [ -n "$ver" ]; then
115140
eval "MATCHED_VER_$i='$ver'"
@@ -125,8 +150,8 @@ regex_match()
125150
resolve_rule()
126151
{
127152
# Specific version
128-
if regex_match "$1" "$RE_VER"; then
129-
echo "specific $MATCHED_VER_1"
153+
if regex_match "$1" "[v=]?$RE_VER"; then
154+
echo "eq $MATCHED_VER_1"
130155

131156
# Greater than
132157
elif regex_match "$1" ">$RE_VER"; then
@@ -160,7 +185,7 @@ resolve_rule()
160185
elif regex_match "$1" "~$RE_VER"; then
161186
echo "tilde $MATCHED_VER_1"
162187
elif regex_match "$1" "$RE_NUM(\.[x*])+"; then
163-
echo "tilde $MATCHED_VER_1"
188+
echo "tilde $MATCHED_NUM_1"
164189

165190
# Caret
166191
elif regex_match "$1" "\^$RE_VER"; then
@@ -172,3 +197,95 @@ resolve_rule()
172197

173198
return 0
174199
}
200+
201+
# Rules
202+
rule_eq()
203+
{
204+
semver_eq $2 $1 && return 0 || return 1;
205+
}
206+
207+
rule_le()
208+
{
209+
semver_le $2 $1 && return 0 || return 1;
210+
}
211+
212+
rule_lt()
213+
{
214+
semver_lt $2 $1 && return 0 || return 1;
215+
}
216+
217+
rule_ge()
218+
{
219+
semver_ge $2 $1 && return 0 || return 1;
220+
}
221+
222+
rule_gt()
223+
{
224+
semver_gt $2 $1 && return 0 || return 1;
225+
}
226+
227+
rule_gt_lt()
228+
{
229+
if semver_gt $3 $1 && semver_lt $3 $2; then
230+
return 0
231+
else
232+
return 1
233+
fi
234+
}
235+
236+
rule_gt_le()
237+
{
238+
if semver_gt $3 $1 && semver_le $3 $2; then
239+
return 0
240+
else
241+
return 1
242+
fi
243+
}
244+
245+
rule_ge_lt()
246+
{
247+
if semver_ge $3 $1 && semver_lt $3 $2; then
248+
return 0
249+
else
250+
return 1
251+
fi
252+
}
253+
254+
rule_ge_le()
255+
{
256+
if semver_ge $3 $1 && semver_le $3 $2; then
257+
return 0
258+
else
259+
return 1
260+
fi
261+
}
262+
263+
rule_tilde()
264+
{
265+
ver1=$(get_version "$1")
266+
maj2=$(get_major "$2")
267+
min2=$(get_minor "$2")
268+
269+
if semver_ge "$3" "$maj2"".$min2"".0-0" && semver_le; then
270+
return 0
271+
else
272+
return 1
273+
fi
274+
}
275+
276+
while getopts r: o; do
277+
case "$o" in
278+
r) rule="rule_$(resolve_rule $OPTARG)";;
279+
esac
280+
done
281+
282+
shift $(( $OPTIND-1 ))
283+
284+
for ver in $@; do
285+
if [ -z "$rule" ] || $rule "$ver"; then
286+
if semver_lt "$max" "$ver"; then
287+
max="$ver"
288+
echo $ver
289+
fi
290+
fi
291+
done

tests.sh

Lines changed: 61 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@ describe 'get_labels'
6262
RET=$(get_labels 1.2.3.4-1.2.3.4.a.b.c-def)
6363
assert "$RET" "1.2.3.4.a.b.c-def"
6464

65+
describe 'get_major'
66+
RET=$(get_major 1.2.3.4)
67+
assert "$RET" "1"
68+
69+
describe 'get_minor'
70+
RET=$(get_minor 1.2.3.4)
71+
assert "$RET" "2"
72+
73+
RET=$(get_minor 1)
74+
assert "$RET" "0"
75+
6576
describe 'semver_eq'
6677
semver_eq 1.2.3 1.2.3
6778
assert $? 0
@@ -110,69 +121,89 @@ describe 'semver_ge'
110121
assert $? 0
111122

112123
describe 'regex_match'
113-
regex_match "1.22.333 - 1.2.3-3.2.1-7.8.0-abc-def+1.2.3" "$RE_VER - $RE_VER"
114-
assert $? 0 "Exit code should be 0 when match"
115-
assert "$MATCHED_VER_1" "1.22.333" "Should set MATCHED_VER_1"
116-
assert "$MATCHED_VER_2" "1.2.3-3.2.1-7.8.0-abc-def+1.2.3" "Should set MATCHED_VER_2"
117-
assert "$MATCHED_NUM_1" "1.22.333" "Should set MATCHED_NUM_1"
118-
assert "$MATCHED_NUM_2" "1.2.3" "Should set MATCHED_NUM_2"
119-
assert "$MATCHED_LAB_1" "" "Should set MATCHED_LAB_1"
120-
assert "$MATCHED_LAB_2" "3.2.1-7.8.0-abc-def" "Should set MATCHED_LAB_2"
124+
regex_match "1.22.333 - 1.2.3-3.2.1-a.b.c-def+011.a.1" "$RE_VER - $RE_VER"
125+
assert $? 0 "Exit code should be 0 when match"
126+
assert "$MATCHED_VER_1" "1.22.333" "Should set MATCHED_VER_1"
127+
assert "$MATCHED_VER_2" "1.2.3-3.2.1-a.b.c-def+011.a.1" "Should set MATCHED_VER_2"
128+
assert "$MATCHED_NUM_1" "1.22.333" "Should set MATCHED_NUM_1"
129+
assert "$MATCHED_NUM_2" "1.2.3" "Should set MATCHED_NUM_2"
130+
assert "$MATCHED_LAB_1" "" "Should set MATCHED_LAB_1"
131+
assert "$MATCHED_LAB_2" "3.2.1-a.b.c-def" "Should set MATCHED_LAB_2"
121132

122133
regex_match '1.2.3 - 5.6.7' '5.6.7'
123-
assert $? 1 "Exit code should be 1 when don't match"
124-
assert "$MATCHED_VER_1" "" "When don't match MATCHED_VER_x should be empty"
125-
assert "$MATCHED_VER_1" "" "When don't match MATCHED_NUM_x should be empty"
126-
assert "$MATCHED_LAB_1" "" "When don't match MATCHED_LAB_x should be empty"
134+
assert $? 1 "Exit code should be 1 when don't match"
135+
assert "$MATCHED_VER_1" "" "When don't match MATCHED_VER_x should be empty"
136+
assert "$MATCHED_VER_1" "" "When don't match MATCHED_NUM_x should be empty"
137+
assert "$MATCHED_LAB_1" "" "When don't match MATCHED_LAB_x should be empty"
127138

128139
describe 'reslove_rule'
129-
RET=$(resolve_rule '1.2.3')
130-
assert "$RET" "specific 1.2.3" "Specific (1.2.3)"
140+
RET=$(resolve_rule 'v1.2.3')
141+
assert "$RET" "eq 1.2.3" "Specific (v1.2.3)"
131142

132143
RET=$(resolve_rule '1')
133-
assert "$RET" "specific 1" "Specific (1)"
144+
assert "$RET" "eq 1" "Specific (1)"
134145

135-
RET=$(resolve_rule '1.2.3-a.2-c')
136-
assert "$RET" "specific 1.2.3-a.2-c" "Specific (1.2.3-a.2-c)"
146+
RET=$(resolve_rule '=1.2.3-a.2-c')
147+
assert "$RET" "eq 1.2.3-a.2-c" "Specific (=1.2.3-a.2-c)"
137148

138149
RET=$(resolve_rule '>1.2.3')
139-
assert "$RET" "gt 1.2.3" "Greater than (>1.2.3)"
150+
assert "$RET" "gt 1.2.3" "Greater than (>1.2.3)"
140151

141152
RET=$(resolve_rule '<1.2.3')
142-
assert "$RET" "lt 1.2.3" "Less than (<1.2.3)"
153+
assert "$RET" "lt 1.2.3" "Less than (<1.2.3)"
143154

144155
RET=$(resolve_rule '>=1.2.3')
145-
assert "$RET" "ge 1.2.3" "Greater than or equal to (>=1.2.3)"
156+
assert "$RET" "ge 1.2.3" "Greater than or equal to (>=1.2.3)"
146157

147158
RET=$(resolve_rule '<=1.2.3')
148-
assert "$RET" "le 1.2.3" "Less than or equal to (<=1.2.3)"
159+
assert "$RET" "le 1.2.3" "Less than or equal to (<=1.2.3)"
149160

150161
RET=$(resolve_rule '1.2.3 - 4.5.6')
151-
assert "$RET" "ge_le 1.2.3 4.5.6" "Range (1.2.3 - 4.5.6)"
162+
assert "$RET" "ge_le 1.2.3 4.5.6" "Range (1.2.3 - 4.5.6)"
152163

153164
RET=$(resolve_rule '>1.2.3 <4.5.6')
154-
assert "$RET" "gt_lt 1.2.3 4.5.6" "Range (>1.2.3 <4.5.6)"
165+
assert "$RET" "gt_lt 1.2.3 4.5.6" "Range (>1.2.3 <4.5.6)"
155166

156167
RET=$(resolve_rule '>1.2.3 <=4.5.6')
157-
assert "$RET" "gt_le 1.2.3 4.5.6" "Range (>1.2.3 <=4.5.6)"
168+
assert "$RET" "gt_le 1.2.3 4.5.6" "Range (>1.2.3 <=4.5.6)"
158169

159170
RET=$(resolve_rule '>=1.2.3 <4.5.6')
160-
assert "$RET" "ge_lt 1.2.3 4.5.6" "Range (>=1.2.3 <4.5.6)"
171+
assert "$RET" "ge_lt 1.2.3 4.5.6" "Range (>=1.2.3 <4.5.6)"
161172

162173
RET=$(resolve_rule '>=1.2.3 <=4.5.6')
163-
assert "$RET" "ge_le 1.2.3 4.5.6" "Range (>=1.2.3 <=4.5.6)"
174+
assert "$RET" "ge_le 1.2.3 4.5.6" "Range (>=1.2.3 <=4.5.6)"
164175

165176
RET=$(resolve_rule '~1.2.3')
166-
assert "$RET" "tilde 1.2.3" "Tilde (~1.2.3)"
177+
assert "$RET" "tilde 1.2.3" "Tilde (~1.2.3)"
167178

168179
RET=$(resolve_rule '1.2.x')
169-
assert "$RET" "tilde 1.2" "Wildcard (1.2.x)"
180+
assert "$RET" "tilde 1.2" "Wildcard (1.2.x)"
170181

171182
RET=$(resolve_rule '1.*')
172-
assert "$RET" "tilde 1" "Wildcard (1.*)"
183+
assert "$RET" "tilde 1" "Wildcard (1.*)"
173184

174185
RET=$(resolve_rule '^1.2.3')
175-
assert "$RET" "caret 1.2.3" "Caret (^1.2.3)"
186+
assert "$RET" "caret 1.2.3" "Caret (^1.2.3)"
187+
188+
describe "rule_eq"
189+
rule_eq '1.2.3' '1.2.3'
190+
assert $? 0
191+
192+
rule_eq '1.2.3-abc+abc' '1.2.3-abc+xyz'
193+
assert $? 0
194+
195+
rule_eq '1.2.3-a' '1.2.3-b'
196+
assert $? 1
197+
198+
describe "rule_tilde"
199+
rule_tilde '1.2.3' '1.2.2'
200+
assert $? 1
201+
202+
rule_tilde '1.2.3' '1.2.3-0'
203+
assert $? 0
204+
205+
rule_tilde '1.2.3' '1.3.0-0'
206+
assert $? 1
176207

177208

178209
# Summary

0 commit comments

Comments
 (0)