various fixes and flidas support
authorIan Kelling <iank@fsf.org>
Mon, 22 Jan 2018 01:43:01 +0000 (20:43 -0500)
committerIan Kelling <iank@fsf.org>
Mon, 22 Jan 2018 01:43:01 +0000 (20:43 -0500)
src/identify-distros
src/package-manager-abstractions

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; }
index 6936c9271e33bd4f6123bcd724ae694de5030365..6d433d249b0858f94032bfb4c23e5308ed4add9b 100644 (file)
@@ -62,11 +62,27 @@ elif command -v apt-get &>/dev/null; then
         fi
     }
     pi() {
+        if dpkg -s -- "$@" &>/dev/null; then
+            return 0
+        fi
         pupdate
         local s; [[ $EUID != 0 ]] && s=sudo
         $s apt-get -y install --purge --auto-remove "$@"
     }
+    pi() {
+        if dpkg -s -- "$@" &>/dev/null; then
+            return 0
+        fi
+        pupdate
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s $PI_PREFIX apt-get -y install --purge --auto-remove "$@"
+    }
+
     pi-nostart() {
+        if dpkg -s -- "$@" &>/dev/null; then
+            return 0
+        fi
+        pupdate
         local s; [[ $EUID != 0 ]] && s=sudo
         local f=/usr/sbin/policy-rc.d
         $s dd of=$f <<EOF
@@ -74,7 +90,7 @@ elif command -v apt-get &>/dev/null; then
 exit 101
 EOF
         $s chmod +x $f
-        pi "$@"
+        $s apt-get -y install --purge --auto-remove "$@"
         $s rm $f
     }
     pf() {
@@ -126,6 +142,7 @@ EOF
             apt-file find -x "$file"\$
         else
             apt-file find -x /"$file"\$
+            update-alternatives --list "$file" 2>/dev/null
         fi
     }
     pkgfiles() {