# 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