diff options
| author | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2025-12-22 03:12:06 -0800 |
|---|---|---|
| committer | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2025-12-22 03:12:06 -0800 |
| commit | 0c3d5a38c03c3ac22017c40aa08e38b3e3124275 (patch) | |
| tree | 0beef05024d53158e41fbf888a75cd5876d8648e /gbpm.sh | |
| parent | 224aa11c1854cf1742d30d2bd64a60ac78da3814 (diff) | |
| download | gbpm-0c3d5a38c03c3ac22017c40aa08e38b3e3124275.tar.gz gbpm-0c3d5a38c03c3ac22017c40aa08e38b3e3124275.tar.xz | |
improved match prioritisation
Diffstat (limited to 'gbpm.sh')
| -rwxr-xr-x | gbpm.sh | 38 |
1 files changed, 20 insertions, 18 deletions
@@ -113,33 +113,35 @@ cmd_get() { cmd_set() { [[ -n "${1}" ]] || _die 'set command requires an argument' - local dir dirs match match_start + local dir dirs bn prefix pri match match_pri _populate_dirs for dir in "${dirs[@]}"; do - [[ "${dir##*/}" == *"${1}"* ]] || continue - - match="${dir}" - - # exact match - if [[ "${dir##*/}" == "${1}" ]]; then - unset match_start - break + bn="${dir##*/}" + + [[ "${bn}" == *"${1}"* ]] || continue + + prefix="${bn%%${1}*}" + pri="${prefix//[^-]}" + pri="$((${#pri} * 4))" + if [[ "${prefix}" == @(|*-) ]]; then + case "${bn#*${1}}" in + '') ;; + -*) ((pri++)) ;; + *) ((pri += 2)) ;; + esac + else + ((pri += 3)) fi - # match from start of version is preferred. we assume the - # version is at the beginning of the directory name or - # immediately following a hyphen. this avoids unintuitive - # behaviour like `2.1' matching `3.2.1' over `2.1.0'. - if [[ "${dir##*/}" == "${1}"* || - "${dir##*/}" == *-"${1}"* ]]; then - match_start="${dir}" - fi + [[ "${pri}" -le "${match_pri:-${pri}}" ]] || continue + + match="${dir}" + match_pri="${pri}" done [[ -n "${match}" ]] || _die 'no matching version found' - [[ -n "${match_start}" ]] && match="${match_start}" _clear _add "${match}" |
