1+ #! /usr/bin/env bash
2+
3+ # Find 2 latest versions that appropriate to requested version
4+ find_latest_versions () {
5+ local requested_version=$1
6+ local version_list=${! 2}
7+
8+ # Version prefix such as "tags/v"
9+ local prefix_regex=${3:- ' ' }
10+
11+ # Version number part separator such as "." in "1.0.0"
12+ local separator=${4:- " ." }
13+ local escaped_separator=${separator// ./ \\ .}
14+
15+ local suffix_regex=${5:- ' ' }
16+
17+ # Format and sort version list
18+ local version_regex=" ${prefix_regex} \\ K[0-9]+(${escaped_separator} [0-9]+){0,2}${suffix_regex} $"
19+ version_list=" $( printf " %s\n" " ${version_list[@]} " | grep -oP $version_regex | tr -d ' ' | tr $separator ' .' | sort -rV) "
20+
21+ if [ " ${requested_version} " = " latest" ]; then
22+ echo " $( echo " ${version_list} " | head -n 2) "
23+ else
24+ # Try to get latest matching version
25+
26+ set +e
27+ local regex=" ^"
28+
29+ # Get major version or exit
30+ local major=" $( echo " ${requested_version} " | grep -oE ' ^[0-9]+' ) "
31+ if [ $major != ' ' ]; then
32+ regex=" ${regex}${major} "
33+ else
34+ echo " Invalid version \" ${requested_version} \" . Use \" latest\" or MAJOR[.MINOR][.PATCH]"
35+ return 1
36+ fi
37+
38+ # Get minor number or accept any
39+ local minor=" $( echo " ${requested_version} " | grep -oP ' ^[0-9]+\.\K[0-9]+' ) "
40+ regex=" ${regex} $( [ " $minor " != ' ' ] && echo " ${escaped_separator}${minor} " || echo " (${escaped_separator} [0-9]+)?" ) "
41+
42+
43+ # Get patch number or accept any
44+ local patch=" $( echo " ${requested_version} " | grep -oP ' ^[0-9]+\.[0-9]+\.\K[0-9]+' ) "
45+ regex=" ${regex} $( [ " $patch " != ' ' ] && echo " ${escaped_separator}${patch} " || echo " (${escaped_separator} [0-9]+)?" ) "
46+ set -e
47+
48+ echo " $( echo " ${version_list} " | grep -E -m 2 " ^${regex} $" ) "
49+ fi
50+ }
0 commit comments