better error handling
[distro-functions] / src / identify-distros
index 0d7a8fe1a9a1eff9b93a178efbe4839871c40c41..c3cfc723c585d9737d958a874026eb54146482bf 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-distro_name() {
+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
-        grep "^ID=.*" /etc/os-release | sed 's/^ID=//'
+        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 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})
+    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
+    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"
+
+}
+
+
+isdebian-testing() {
+    [[ $(debian-archive) == testing ]]
+}
+# I only do testing or stable.
+isdebian-stable() {
+    [[ $(debian-archive) == stable ]]
+}
+
+debian-codename() {
+    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"
+}
+debian-codename-compat() {
+    local n=$(debian-codename)
+    case $n in
+        flidas)
+            echo xenial
+            ;;
+        *)
+            echo $n
+            ;;
+    esac
+}
+
 isfedora() {
-    local d=$(distro_name)
-    [[ $d == fedora ]] || return 1
+    [[ $(distro-name) == fedora ]]
 }
 isdebian() {
-    local d=$(distro_name)
-    [[ $d == debian ]] || return 1
+    [[ $(distro-name) == debian ]]
 }
-isdeb() {
-    local d=$(distro_name)
-    [[ $d == debian || $d == ubuntu ]] || return 1
+isarch() {
+    [[ $(distro-name) == arch ]]
 }
 isubuntu() {
-    local d=$(distro_name)
-    [[ $d == ubuntu ]] || return 1
+    [[ $(distro-name) == ubuntu ]]
+}
+istrisquel() {
+    [[ $(distro-name) == trisquel ]]
 }
+# is debian/apt based
+isdeb() { command -v apt-get &>/dev/null; }