various fixes and flidas support
[distro-functions] / src / identify-distros
index f75cb0f36b3b936c3a9970a9c36300bf0d48ba43..011ddb5d7f28d6c9d92a1c9d79917d84cb379e83 100644 (file)
 # 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
 }
 
+distro-name-compat() {
+    local x=$(distro-name)
+    case $x in
+        trisquel)
+            echo ubuntu
+            ;;
+        *)
+            echo $x
+            ;;
+    esac
+}
+
 distro-name-ver() {
     echo `distro-name``debian-archive`
 }
 
 debian-archive() {
     isdeb || return 0
-    local archive
+    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})
-    { for archive in stable testing unstable; do
-          # print priority + archive name. priority is in
-          # the previous line after finding the archive.
-          read -rd '' expression <<EOF ||:
-/o=Debian,a=$archive,.*l=Debian,c=main/{x;s/^ *([-0-9]+).*/\1 $archive/p;q};h
+    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 <<EOF ||:
+/o=$d/I!b a;/l=$d/I!b a;/c=main/!b a b b;
+: a;s/^ *([-0-9]+).*/\1/;h;b;
+: b;s/^.*a=([^,]+).*/ \1/;H;x;s/\n//;p
 EOF
-          echo "$policy" | sed -rn "$expression"
-      done
-    } | sort -rn | head -n1 | grep -oE "\w+$"
+    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)
+    echo "$shortest"
+
 }
 
 
@@ -63,6 +97,18 @@ debian-codename() {
     archive=$(debian-archive "$policy")
     echo "$policy" | sed -rn "s/^.*a=$archive,n=([a-z]+).*/\1/p;T;q"
 }
+debian-codename-compat() {
+    local n=$(debian-codename)
+    case $n in
+        flidas)
+            echo xenial
+            ;;
+        *)
+            echo $n
+            ;;
+    esac
+}
+
 isfedora() {
     [[ $(distro-name) == fedora ]]
 }
@@ -72,8 +118,11 @@ isdebian() {
 isarch() {
     [[ $(distro-name) == arch ]]
 }
-# is debian/apt based
-isdeb() { command -v apt-get &>/dev/null; }
 isubuntu() {
     [[ $(distro-name) == ubuntu ]]
 }
+istrisquel() {
+    [[ $(distro-name) == trisquel ]]
+}
+# is debian/apt based
+isdeb() { command -v apt-get &>/dev/null; }