allow downgrades when forcing yes
authorIan Kelling <iank@fsf.org>
Mon, 29 Apr 2019 17:39:02 +0000 (13:39 -0400)
committerIan Kelling <iank@fsf.org>
Mon, 29 Apr 2019 17:39:02 +0000 (13:39 -0400)
src/package-manager-abstractions

index f70bf1d01772d3d403c4a6f45d38d40f45429681..f66a7620b2292f6c402bcf7127ee28b17057db83 100644 (file)
 
 # basic yum/apt package manager abstraction, plus a few minor conveniences
 if command -v yum &> /dev/null; then
-    # package manager
-    p() {
-        local s; [[ $EUID != 0 ]] && s=sudo
-        $s yum "$@"
-    }
-    # package install
-    pi() {
-        local s; [[ $EUID != 0 ]] && s=sudo
-        $s yum -y install "$@"
-    }
-    # package find
-    pf() {
-        local s; [[ $EUID != 0 ]] && s=sudo
-        $s yum search "$@"
-    }
-    # package remove/uninstall
-    pu() {
-        local s; [[ $EUID != 0 ]] && s=sudo
-        $s yum autoremove "$@"
-    }
-    pup() { # upgrade
-        local s; [[ $EUID != 0 ]] && s=sudo
-        $s yum -y distro-sync full "$@"
-    }
-    # package list info
-    pl() {
-        yum info "$@"
-    }
-    pfile() {
-        yum whatprovides \*/$1
-    }
-    
+  # package manager
+  p() {
+    local s; [[ $EUID != 0 ]] && s=sudo
+    $s yum "$@"
+  }
+  # package install
+  pi() {
+    local s; [[ $EUID != 0 ]] && s=sudo
+    $s yum -y install "$@"
+  }
+  # package find
+  pf() {
+    local s; [[ $EUID != 0 ]] && s=sudo
+    $s yum search "$@"
+  }
+  # package remove/uninstall
+  pu() {
+    local s; [[ $EUID != 0 ]] && s=sudo
+    $s yum autoremove "$@"
+  }
+  pup() { # upgrade
+    local s; [[ $EUID != 0 ]] && s=sudo
+    $s yum -y distro-sync full "$@"
+  }
+  # package list info
+  pl() {
+    yum info "$@"
+  }
+  pfile() {
+    yum whatprovides \*/$1
+  }
+
 elif command -v apt-get &>/dev/null; then
-    p() {
-        local s; [[ $EUID != 0 ]] && s=sudo
+  pp() { # package policy
+    apt-cache policy $@
+  }
+  p() {
+    local s; [[ $EUID != 0 ]] && s=sudo
+    case $1 in
+      install)
+        $s apt-get --purge --auto-remove "$@"
+        ;;
+      *)
         $s apt-get "$@"
-    }
-    pupdate() {
-        local s f; [[ $EUID != 0 ]] && s=sudo
-        # update package list if its more than an 2 hours old
-        f=/var/cache/apt/pkgcache.bin
-        if [[ ! -r $f ]] \
-               || (( $(( $(date +%s) - $(stat -c %Y $f ) )) > 60*60*2 )); then
-            $s apt-get update
-        fi
-    }
-    pi() {
-        if dpkg -s -- "$@" &>/dev/null; then
-            return 0
-        fi
-        while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
-        pupdate
-        local s; [[ $EUID != 0 ]] && s=sudo
-        $s $PI_PREFIX apt-get -y install --purge --auto-remove "$@"
-    }
+        ;;
+    esac
+  }
+  pupdate() {
+    local s f; [[ $EUID != 0 ]] && s=sudo
+    # update package list if its more than an 2 hours old
+    f=/var/cache/apt/pkgcache.bin
+    if [[ ! -r $f ]] \
+         || (( $(( $(date +%s) - $(stat -c %Y $f ) )) > 60*60*2 )); then
+      $s apt-get update
+    fi
+  }
+  pi() {
+    if dpkg -s -- "$@" &>/dev/null; then
+      return 0
+    fi
+    while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
+    pupdate
+    local s; [[ $EUID != 0 ]] && s=sudo
+    $s $PI_PREFIX apt-get -y --allow-downgrades install --purge --auto-remove "$@"
+  }
 
-    pi-nostart() {
-        if dpkg -s -- "$@" &>/dev/null; then
-            return 0
-        fi
-        while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
-        pupdate
-        local s; [[ $EUID != 0 ]] && s=sudo
-        local f=/usr/sbin/policy-rc.d
-        $s dd of=$f <<EOF
+  pi-nostart() {
+    if dpkg -s -- "$@" &>/dev/null; then
+      return 0
+    fi
+    while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
+    pupdate
+    local s; [[ $EUID != 0 ]] && s=sudo
+    local f=/usr/sbin/policy-rc.d
+    $s dd of=$f <<EOF
 #!/bin/sh
 exit 101
 EOF
-        $s chmod +x $f
-        $s apt-get -y install --purge --auto-remove "$@"
-        $s rm $f
-    }
-    pf() {
-        # package name and descriptions
-        apt-cache search "$@"
-    }
-    pff() {
-        local s; [[ $EUID != 0 ]] && s=sudo
-        # nice aptitude search from emacs shell. package description width as
-        # wide as the screen, and package name field small aptitude
-        # manual can't figure out how wide emacs terminal is, of course
-        # it doesn't consult the $COLUMNS variable...  and in a normal
-        # terminal, it makes the package name field ridiculously big
-        # also, remove that useless dash before the description
-        aptitude -F "%c%a%M %p %$((COLUMNS - 30))d" -w $COLUMNS search "$@"
-    }
-    pu() {
-        local s; [[ $EUID != 0 ]] && s=sudo
-        while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
-        $s apt-get -y remove --purge --auto-remove  "$@"
-        # seems slightly redundant, but it removes more stuff sometimes.
-        $s apt-get -y autoremove
-    }
-    pup() { # upgrade
-        while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
-        pupdate
-        local s; [[ $EUID != 0 ]] && s=sudo
-        $s apt-get -y dist-upgrade --purge --auto-remove "$@"
-        $s apt-get -y autoremove
-    }
-    # package info
-    pl() {
-        if type -p aptitude &>/dev/null; then
-            aptitude show "$@"
-        else
-            apt-cache show "$@"
-        fi
-    }
-    pfile() {
-        local file=$1
-        # ucfq can tell us about config files which are not tracked
-        # with apt-file. but, for at least a few files I tested
-        # which are tracked with apt-file, ucfq doesn't show their
-        # package name. So, commenting this, waiting to find
-        # a config file only tracked by ucfq to see if it gives the
-        # package name and if I can identify this kind of file.
-        # if [[ $file == /* ]] && ! ucfq -w $file | grep ::: &>/dev/null; then
-        #    ucfq $file
+    $s chmod +x $f
+    $s apt-get -y install --allow-downgrades --purge --auto-remove "$@"
+    $s rm $f
+  }
+  pf() {
+    # package name and descriptions
+    apt-cache search "$@"
+  }
+  pff() {
+    local s; [[ $EUID != 0 ]] && s=sudo
+    # nice aptitude search from emacs shell. package description width as
+    # wide as the screen, and package name field small aptitude
+    # manual can't figure out how wide emacs terminal is, of course
+    # it doesn't consult the $COLUMNS variable...  and in a normal
+    # terminal, it makes the package name field ridiculously big
+    # also, remove that useless dash before the description
+    aptitude -F "%c%a%M %p %$((COLUMNS - 30))d" -w $COLUMNS search "$@"
+  }
+  pu() {
+    local s; [[ $EUID != 0 ]] && s=sudo
+    while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
+    $s apt-get -y remove --allow-downgrades --purge --auto-remove  "$@"
+    # seems slightly redundant, but it removes more stuff sometimes.
+    $s apt-get -y --allow-downgrades autoremove
+  }
+  pup() { # upgrade
+    while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
+    pupdate
+    local s; [[ $EUID != 0 ]] && s=sudo
+    $s apt-get -y dist-upgrade --allow-downgrades --purge --auto-remove "$@"
+    $s apt-get -y autoremove --allow-downgrades
+  }
+  # package info
+  pl() {
+    if type -p aptitude &>/dev/null; then
+      aptitude show "$@"
+    else
+      apt-cache show "$@"
+    fi
+  }
+  pfile() {
+    local file=$1
+    # ucfq can tell us about config files which are not tracked
+    # with apt-file. but, for at least a few files I tested
+    # which are tracked with apt-file, ucfq doesn't show their
+    # package name. So, commenting this, waiting to find
+    # a config file only tracked by ucfq to see if it gives the
+    # package name and if I can identify this kind of file.
+    # if [[ $file == /* ]] && ! ucfq -w $file | grep ::: &>/dev/null; then
+    #    ucfq $file
 
-        if [[ $file == */* ]]; then
-            apt-file find -x "$file"\$
-        else
-            apt-file find -x /"$file"\$
-            update-alternatives --list "$file" 2>/dev/null
-        fi
-    }
-    pkgfiles() {
-        if dpkg -s "$1" &>/dev/null; then
-            dpkg-query -L $1
-        else
-            apt-file -x list "^$1$"
-        fi
-    }
+    if [[ $file == */* ]]; then
+      apt-file find -x "$file"\$
+    else
+      apt-file find -x /"$file"\$
+      update-alternatives --list "$file" 2>/dev/null
+    fi
+  }
+  pkgfiles() {
+    if dpkg -s "$1" &>/dev/null; then
+      dpkg-query -L $1
+    else
+      apt-file -x list "^$1$"
+    fi
+  }
 
 elif command -v pacman &>/dev/null; then
-    p() {
-        pacaur "$@"
-    }
-    pi() {
-        pacaur -S --noconfirm --needed --noedit "$@"
-    }
-    pf() {
-        pacaur -Ss "$@"
-    }
-    pu() {
-        pacaur -Rs --noconfirm "$@"
-        if p=$(pacaur -Qdtq); then
-            pacaur -Rs $p
-        fi
-    }
-    aurex() {
-        p="$1"
-        aur='https://aur.archlinux.org'
-        curl -s $aur/$(curl -s "$aur/rpc.php?type=info&arg=$p" \
-                           | jq -r .results.URLPath) | tar xz
-        cd "$p"
+  p() {
+    pacaur "$@"
+  }
+  pi() {
+    pacaur -S --noconfirm --needed --noedit "$@"
+  }
+  pf() {
+    pacaur -Ss "$@"
+  }
+  pu() {
+    pacaur -Rs --noconfirm "$@"
+    if p=$(pacaur -Qdtq); then
+      pacaur -Rs $p
+    fi
+  }
+  aurex() {
+    p="$1"
+    aur='https://aur.archlinux.org'
+    curl -s $aur/$(curl -s "$aur/rpc.php?type=info&arg=$p" \
+                     | jq -r .results.URLPath) | tar xz
+    cd "$p"
 
-    }
-    pmirror() {
-        local s; [[ $EUID != 0 ]] && s=sudo
-        local x=$(mktemp)
-        curl -s "https://www.archlinux.org/mirrorlist/\
+  }
+  pmirror() {
+    local s; [[ $EUID != 0 ]] && s=sudo
+    local x=$(mktemp)
+    curl -s "https://www.archlinux.org/mirrorlist/\
 ?country=US&protocol=https&ip_version=4&ip_version=6&use_mirror_status=on" \
-            | sed -r 's/^[ #]*(Server *=)/\1/' > $x
-        if (( $(stat -c %s $x ) > 10 )); then
-            $s cp $x /etc/pacman.d/mirrorlist
-            rm $x
-        fi
-    }
-    pup() { # upgrade
-        local s; [[ $EUID != 0 ]] && s=sudo
-        # file_time + 24 hours > current_time
-        if ! (( $(stat -c%Y /etc/pacman.d/mirrorlist) + 60*60*24 > $(date +%s) ))
-        then
-            pmirror
-        fi
-        pacaur -Syu --noconfirm "$@"
-    }
-    # package info
-    pl() {
-        pacaur -Si "$@"
-    }
-    pfile() {
-        pkgfile "$1"
-    }
-    pkgfiles() {
-        if pacaur -Qs "^$1$" &>/dev/null; then
-            pacman -Ql $1
-        else
-            pkgfile -l $1
-        fi
-    }
+      | sed -r 's/^[ #]*(Server *=)/\1/' > $x
+    if (( $(stat -c %s $x ) > 10 )); then
+      $s cp $x /etc/pacman.d/mirrorlist
+      rm $x
+    fi
+  }
+  pup() { # upgrade
+    local s; [[ $EUID != 0 ]] && s=sudo
+    # file_time + 24 hours > current_time
+    if ! (( $(stat -c%Y /etc/pacman.d/mirrorlist) + 60*60*24 > $(date +%s) ))
+    then
+      pmirror
+    fi
+    pacaur -Syu --noconfirm "$@"
+  }
+  # package info
+  pl() {
+    pacaur -Si "$@"
+  }
+  pfile() {
+    pkgfile "$1"
+  }
+  pkgfiles() {
+    if pacaur -Qs "^$1$" &>/dev/null; then
+      pacman -Ql $1
+    else
+      pkgfile -l $1
+    fi
+  }
 fi