Skip to content

Commit 4157744

Browse files
committed
Rules resolving
1 parent a26274c commit 4157744

File tree

3 files changed

+148
-21
lines changed

3 files changed

+148
-21
lines changed

VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0.1.0-dev

semver.sh

Lines changed: 86 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
#/usr/bin/env sh
22

3+
_num_part='([0-9]|[1-9][0-9]*)'
4+
_lab_part='([0-9]|[1-9][0-9]*|[0-9]*[a-zA-Z-][a-zA-Z0-9-]*)'
5+
_met_part='([0-9A-Za-z-]+)'
6+
7+
RE_NUM="$_num_part(\.$_num_part)*"
8+
RE_LAB="$_lab_part(\.$_lab_part)*"
9+
RE_MET="$_met_part(\.$_met_part)*"
10+
RE_VER="$RE_NUM(-$RE_LAB)?(\+$RE_MET)?"
11+
12+
313
get_version()
414
{
515
echo -n ${1%%-*}
@@ -81,18 +91,84 @@ regex_match()
8191
{
8292
local string="$1"
8393
local regexp="$2"
84-
local sed_re="$(eval "echo '$regexp' | sed 's/(/\\\(/g' | sed 's/)/\\\)/g'")"
94+
local bre="$(eval "echo '$regexp' | sed 's/\\([(){}]\\)/\\\\\\1/g'")"
95+
local match="$(eval "echo '$string' | grep --extended-regexp --line-regexp '$regexp'")";
96+
97+
for i in $(seq 0 9); do
98+
unset "MATCHED_VER_$i"
99+
unset "MATCHED_NUM_$i"
100+
unset "MATCHED_LAB_$i"
101+
done
102+
103+
if [ -z "$match" ]; then
104+
return 1
105+
fi
106+
107+
local part
108+
local i=1
109+
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-")";
113+
114+
if [ -n "$ver" ]; then
115+
eval "MATCHED_VER_$i='$ver'"
116+
eval "MATCHED_NUM_$i='$num'"
117+
eval "MATCHED_LAB_$i='$lab'"
118+
i=$(( i + 1 ))
119+
fi
120+
done
121+
122+
return 0
123+
}
124+
125+
resolve_rule()
126+
{
127+
# Specific version
128+
if regex_match "$1" "$RE_VER"; then
129+
echo "specific $MATCHED_VER_1"
130+
131+
# Greater than
132+
elif regex_match "$1" ">$RE_VER"; then
133+
echo "gt $MATCHED_VER_1"
134+
135+
# Less than
136+
elif regex_match "$1" "<$RE_VER"; then
137+
echo "lt $MATCHED_VER_1"
138+
139+
# Greater than or equal to
140+
elif regex_match "$1" ">=$RE_VER"; then
141+
echo "ge $MATCHED_VER_1"
142+
143+
# Less than or equal to
144+
elif regex_match "$1" "<=$RE_VER"; then
145+
echo "le $MATCHED_VER_1"
146+
147+
# Ranges
148+
elif regex_match "$1" "$RE_VER - $RE_VER"; then
149+
echo "ge_le $MATCHED_VER_1 $MATCHED_VER_2"
150+
elif regex_match "$1" ">$RE_VER <$RE_VER"; then
151+
echo "gt_lt $MATCHED_VER_1 $MATCHED_VER_2"
152+
elif regex_match "$1" ">$RE_VER <=$RE_VER"; then
153+
echo "gt_le $MATCHED_VER_1 $MATCHED_VER_2"
154+
elif regex_match "$1" ">=$RE_VER <$RE_VER"; then
155+
echo "ge_lt $MATCHED_VER_1 $MATCHED_VER_2"
156+
elif regex_match "$1" ">=$RE_VER <=$RE_VER"; then
157+
echo "ge_le $MATCHED_VER_1 $MATCHED_VER_2"
158+
159+
# Tilde
160+
elif regex_match "$1" "~$RE_VER"; then
161+
echo "tilde $MATCHED_VER_1"
162+
elif regex_match "$1" "$RE_NUM(\.[x*])+"; then
163+
echo "tilde $MATCHED_VER_1"
164+
165+
# Caret
166+
elif regex_match "$1" "\^$RE_VER"; then
167+
echo "caret $MATCHED_VER_1"
85168

86-
if [ -z "$(eval "echo '$string' | sed --posix 's/$sed_re//'")" ]; then
87-
for i in $(seq 0 3); do
88-
local group="$(eval "echo '$string' | sed --posix 's/$sed_re/\\$i/'")"
89-
eval "REGEX_MATCHED_GROUP_$i='$group'"
90-
done
91-
return 0
92169
else
93-
for i in $(seq 0 3); do
94-
eval "REGEX_MATCHED_GROUP_$i=''"
95-
done
96170
return 1
97171
fi
172+
173+
return 0
98174
}

tests.sh

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,19 +110,69 @@ describe 'semver_ge'
110110
assert $? 0
111111

112112
describe 'regex_match'
113-
regex_match '1.2.3 - 5.6.7' '(.*) - (.*)'
114-
assert $? 0
115-
assert "$REGEX_MATCHED_GROUP_0" "1.2.3 - 5.6.7"
116-
assert "$REGEX_MATCHED_GROUP_1" "1.2.3"
117-
assert "$REGEX_MATCHED_GROUP_2" "5.6.7"
118-
assert "$REGEX_MATCHED_GROUP_3" ""
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"
119121

120122
regex_match '1.2.3 - 5.6.7' '5.6.7'
121-
assert $? 1
122-
assert "$REGEX_MATCHED_GROUP_0" ""
123-
assert "$REGEX_MATCHED_GROUP_1" ""
124-
assert "$REGEX_MATCHED_GROUP_2" ""
125-
assert "$REGEX_MATCHED_GROUP_3" ""
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"
127+
128+
describe 'reslove_rule'
129+
RET=$(resolve_rule '1.2.3')
130+
assert "$RET" "specific 1.2.3" "Specific (1.2.3)"
131+
132+
RET=$(resolve_rule '1')
133+
assert "$RET" "specific 1" "Specific (1)"
134+
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)"
137+
138+
RET=$(resolve_rule '>1.2.3')
139+
assert "$RET" "gt 1.2.3" "Greater than (>1.2.3)"
140+
141+
RET=$(resolve_rule '<1.2.3')
142+
assert "$RET" "lt 1.2.3" "Less than (<1.2.3)"
143+
144+
RET=$(resolve_rule '>=1.2.3')
145+
assert "$RET" "ge 1.2.3" "Greater than or equal to (>=1.2.3)"
146+
147+
RET=$(resolve_rule '<=1.2.3')
148+
assert "$RET" "le 1.2.3" "Less than or equal to (<=1.2.3)"
149+
150+
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)"
152+
153+
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)"
155+
156+
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)"
158+
159+
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)"
161+
162+
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)"
164+
165+
RET=$(resolve_rule '~1.2.3')
166+
assert "$RET" "tilde 1.2.3" "Tilde (~1.2.3)"
167+
168+
RET=$(resolve_rule '1.2.x')
169+
assert "$RET" "tilde 1.2" "Wildcard (1.2.x)"
170+
171+
RET=$(resolve_rule '1.*')
172+
assert "$RET" "tilde 1" "Wildcard (1.*)"
173+
174+
RET=$(resolve_rule '^1.2.3')
175+
assert "$RET" "caret 1.2.3" "Caret (^1.2.3)"
126176

127177

128178
# Summary

0 commit comments

Comments
 (0)