From 9d5a995ec93be0811b799d2e88c53f7f662d6d3b Mon Sep 17 00:00:00 2001 From: Ian Kelling Date: Mon, 29 Apr 2019 13:39:02 -0400 Subject: [PATCH] allow downgrades when forcing yes --- src/package-manager-abstractions | 372 ++++++++++++++++--------------- 1 file changed, 191 insertions(+), 181 deletions(-) diff --git a/src/package-manager-abstractions b/src/package-manager-abstractions index f70bf1d..f66a762 100644 --- a/src/package-manager-abstractions +++ b/src/package-manager-abstractions @@ -15,196 +15,206 @@ # 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 </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 </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 -- 2.30.2