|
7 | 7 | # old=<major>.<minor>.<patch>[-<name>[.<id>]] |
8 | 8 | # new=<major>.<minor>.<patch>[-<name>[.<id>]] |
9 | 9 |
|
| 10 | +declare -A pre=( |
| 11 | + [alpha]=1 |
| 12 | + [beta]=2 |
| 13 | + [rc]=3 |
| 14 | + [0]="" |
| 15 | + [1]="alpha" |
| 16 | + [2]="beta" |
| 17 | + [3]="rc" |
| 18 | +) |
| 19 | + |
10 | 20 | [[ ! "$old" =~ ^$regex$ ]] && exit 1 |
11 | 21 |
|
12 | 22 | IFS='.-' read -r -a old <<< "$old" |
| 23 | +[ -v 'old[3]' ] && old[3]="${pre[${old[3]}]}" |
13 | 24 |
|
14 | 25 | valid=0 # 0 means "not valid", other values are for "reason" debugging |
15 | 26 | declare -a ver |
16 | 27 | if [[ "$new" =~ ^$regex$ ]]; then |
17 | 28 |
|
18 | 29 | IFS='.-' read -r -a ver <<< "$new" |
| 30 | + [ -v 'ver[3]' ] && ver[3]="${pre[${ver[3]}]}" |
19 | 31 | for i in $(seq 0 $level); do |
20 | | - if [ $i == 3 ]; then |
21 | | - # same pre-release |
22 | | - if [ "${ver[3]}" == "${old[3]}" ]; then |
| 32 | + if [[ $i == 3 ]]; then |
| 33 | + # same pre-release name |
| 34 | + if [[ ${ver[3]} == ${old[3]} ]]; then |
23 | 35 | continue |
24 | 36 | # left pre-release stage |
25 | | - elif [ ${#ver[3]} == 0 ]; then |
| 37 | + elif [[ ${ver[3]} == 0 ]]; then |
26 | 38 | valid=1 |
27 | 39 | break |
28 | | - # entered pre-release stage (ko because we know the first part is equal -> check for if!) |
29 | | - elif [ ${#ver[3]} == 0 ]; then |
| 40 | + # entered pre-release stage (ko; we know the part before is equal!) |
| 41 | + # eg: 1.0.0 --> 1.0.0-alpha is bad |
| 42 | + elif [[ ${old[3]} == 0 ]]; then |
30 | 43 | break |
31 | | - # a "grater" pre-release: "a(alpha)" > "b(eta)" > "r(c)"? |
32 | | - elif [[ "${ver[3]}" > "${old[3]}" ]]; then |
| 44 | + # a "grater" pre-release? |
| 45 | + elif [[ ${ver[3]} -gt ${old[3]} ]]; then |
33 | 46 | valid=2 |
34 | 47 | break |
35 | 48 | fi |
36 | 49 | elif [[ ${ver[$i]} -gt ${old[$i]} ]]; then |
37 | | - valid=2 |
38 | | - break |
| 50 | + valid=2 |
| 51 | + break |
39 | 52 | elif [[ ${ver[$i]} -lt ${old[$i]} ]]; then |
40 | | - break |
| 53 | + break |
41 | 54 | fi |
42 | 55 | done |
43 | 56 |
|
44 | 57 | fi |
45 | 58 |
|
| 59 | +step() { |
| 60 | + ver[$1]=$(( ${ver[$1]}+1 )) |
| 61 | +} |
| 62 | + |
46 | 63 | # if ver should should be generated |
47 | 64 | if [ $valid == 0 ]; then |
48 | | - ver=(${old[@]}) |
49 | | - if [[ $level == 4 ]]; then |
50 | | - ver[$level]=$(( ${ver[$level]}+1 )) |
51 | | - elif [[ $level == 3 ]]; then |
52 | | - # if we increase pre-release name we also reset the id |
53 | | - ver=(${ver[@]::4}) |
54 | | - if [ "${ver[3]}" == "alpha" ]; then |
55 | | - ver[3]="beta" |
56 | | - elif [ "${ver[3]}" == "beta" ]; then |
57 | | - ver[3]="rc" |
58 | | - elif [ "${ver[3]}" == "rc" ]; then |
59 | | - ver=(${ver[@]::3}) # leave pre-release stage |
60 | | - ver[2]=$(( ${ver[2]}+1 )) |
61 | | - fi |
62 | | - else |
63 | | - ver=(${ver[@]::3}) # no pre-release |
64 | | - ver[$level]=$(( ${ver[$level]}+1 )) |
65 | | - # if we increase major/minor we want to also reset minor/patch |
66 | | - [[ $level == 0 ]] && ver[1]=0 |
67 | | - [[ $level == 0 ]] || [[ $level == 1 ]] && ver[2]=0 |
| 65 | + ver=(${old[@]}) |
| 66 | + step "$level" |
| 67 | + if [[ $level == 3 ]]; then |
| 68 | + # if no name was found increase patch as well |
| 69 | + if [[ ! -v "pre[${ver[3]}]" ]]; then |
| 70 | + ver[3]=1 |
| 71 | + step 2 |
| 72 | + # if we just got in alpha increase patch as well |
| 73 | + elif [[ ${ver[3]} == 1 ]]; then |
| 74 | + step 2 |
68 | 75 | fi |
| 76 | + # if we just got in alpha increase patch as well |
| 77 | + elif [[ $level == 4 ]] && [[ ! -v 'ver[3]' ]]; then |
| 78 | + step 2 |
| 79 | + fi |
| 80 | + for i in $(seq $(( level+1 )) 4); do |
| 81 | + # reset all parts after the one increased |
| 82 | + ver[$i]=0 |
| 83 | + done |
69 | 84 | fi |
70 | 85 |
|
71 | | -echo "version=${ver[0]}.${ver[1]}.${ver[2]}${ver[3]:+-${ver[3]}}${ver[4]:+.${ver[4]}}" |
| 86 | +# fix: bash is ***... it thinks ver[3] is missing? |
| 87 | +ver=(${ver[@]}) |
| 88 | +ver[3]="${pre[${ver[3]}]}" |
| 89 | + |
| 90 | +echo "version=${ver[0]}.${ver[1]}.${ver[2]}${ver[3]:+-${ver[3]}.${ver[4]:-0}}" |
0 commit comments