X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=src%2Fidentify-distros;h=b0f63acf3aaf30347299348ef8d39ed1876f373e;hb=c2fce05265f49c2e547f41102a37847cb10fdb45;hp=011ddb5d7f28d6c9d92a1c9d79917d84cb379e83;hpb=6314c835343decaa195019ed2d38a1cb0d5f6a69;p=distro-functions diff --git a/src/identify-distros b/src/identify-distros index 011ddb5..b0f63ac 100644 --- a/src/identify-distros +++ b/src/identify-distros @@ -14,115 +14,158 @@ # limitations under the License. distro-name() { - local x - if [[ -f /etc/fedora-release ]]; then - echo fedora - elif [[ -e /etc/os-release ]]; then - sed -rn 's/^ID=(.*)/\1/p' /etc/os-release - elif type -p lsb_release &>/dev/null; then - # well, this is more standard, but it's 2 ms vs 200 ms - x=$(lsb_release -si); echo ${x,,} - else - echo "unknown distro" - return 1 - fi + local x + if [[ -f /etc/fedora-release ]]; then + echo fedora + elif [[ -e /etc/os-release ]]; then + sed -rn 's/^ID=(.*)/\1/p' /etc/os-release + elif type -p lsb_release &>/dev/null; then + # well, this is more standard, but it's 2 ms vs 200 ms + x=$(lsb_release -si); echo ${x,,} + else + echo "unknown distro" + return 1 + fi } distro-name-compat() { - local x=$(distro-name) - case $x in - trisquel) - echo ubuntu - ;; - *) - echo $x - ;; - esac + local x=$(distro-name) + case $x in + trisquel) + echo ubuntu + ;; + *) + echo $x + ;; + esac } distro-name-ver() { - echo `distro-name``debian-archive` + echo $(distro-name)$(debian-archive) +} + +distro-num() { + # Subshell keeps environment clean. + ( . /etc/os-release + # in ubuntu the .x matters, trisquel it doesnt + if [[ $ID == ubuntu ]]; then + echo $VERSION_ID + else + echo ${VERSION_ID%%.*} + fi + ) } debian-archive() { - isdeb || return 0 - local archive expression pri name highpri shortest - local policy="${1:-$(apt-cache policy)}" - # a = archive - # n = codename - # o = origin - # c = component (licensing component) - # l = label (Debian{,-Security,-Updates}) - local d=$(distro-name) - # goto b for archive lines we are interested in, a for lines we arent - # print priority + archive name. priority is in - # the previous line from the archive line. - # case insensitive, because $d is lower and we are matching with first char upper - read -rd '' expression < ${#name} )); then - shortest=$name - fi - done < <(echo "$policy" | sed -rn "$expression" | sort -rn) - echo "$shortest" - + while read -r pri name; do + # in ubuntu, we get archives like flidas, flidas-updates, all the same pri, + # so just pick the shortest one. + if [[ ! $highpri ]]; then + highpri=$pri; + shortest=$name + continue + fi + if [[ $pri != $highpri ]]; then + break + fi + if (( ${#shortest} > ${#name} )); then + shortest=$name + fi + done < <(echo "$policy" | sed -rn "$expression" | sort -rn || [[ $? == 141 ]]) + echo "$shortest" } +# formatted for use in pfile() in package-manager-abstractions +positive-origins() { + isdeb || return 0 + local archive expression pri name highpri shortest + local policy="${1:-$(apt-cache policy)}" || return $? + # a = archive + # n = codename + # o = origin + # c = component (licensing component) + # l = label (Debian{,-Security,-Updates}) + read -rd '' expression < 0 )); then + if [[ ! $origins ]]; then + origins=$name + else + origins+=,$name + fi + fi + done < <(echo "$policy" | sed -rn "$expression" | sort -rn || [[ $? == 141 ]]) + echo $origins +} isdebian-testing() { - [[ $(debian-archive) == testing ]] + [[ $(debian-archive) == testing ]] } # I only do testing or stable. isdebian-stable() { - [[ $(debian-archive) == stable ]] + [[ $(debian-archive) == stable ]] } debian-codename() { - isdeb || return 0 - local policy="$(apt-cache policy)" - archive=$(debian-archive "$policy") - echo "$policy" | sed -rn "s/^.*a=$archive,n=([a-z]+).*/\1/p;T;q" + isdeb || return 0 + local policy="$(apt-cache policy)" || return $? + archive=$(debian-archive "$policy") + echo "$policy" | sed -rn "s/^.*a=$archive,n=([a-z]+).*/\1/p;T;q" || [[ $? == 141 ]] } debian-codename-compat() { - local n=$(debian-codename) - case $n in - flidas) - echo xenial - ;; - *) - echo $n - ;; - esac + local n=$(debian-codename) + case $n in + flidas) + echo xenial + ;; + etiona) + echo bionic + ;; + nabia) + echo focal + ;; + *) + echo $n + ;; + esac } isfedora() { - [[ $(distro-name) == fedora ]] + [[ $(distro-name) == fedora ]] } isdebian() { - [[ $(distro-name) == debian ]] + [[ $(distro-name) == debian ]] } isarch() { - [[ $(distro-name) == arch ]] + [[ $(distro-name) == arch ]] } isubuntu() { - [[ $(distro-name) == ubuntu ]] + [[ $(distro-name) == ubuntu ]] } istrisquel() { - [[ $(distro-name) == trisquel ]] + [[ $(distro-name) == trisquel ]] } # is debian/apt based isdeb() { command -v apt-get &>/dev/null; }