- $x aptitude -y install "$@"
- }
- pf() {
- # scratch a very annoying itch.
- # 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
- local x
- [[ $EUID == 0 ]] && x=sudo
- $x aptitude -F "%c%a%M %p %$((COLUMNS - 30))d" -w $COLUMNS search "$@"
- }
- pu() {
- local x
- [[ $EUID == 0 ]] && x=sudo
- $x aptitude -y purge "$@"
- }
- pup() { # upgrade
- local x
- [[ $EUID == 0 ]] && x=sudo
- $x aptitude -y full-upgrade "$@"
- }
- # package info
- pl() {
- aptitude show "$@"
- }
-
+ fi
+ done
+ if (( cachetime > limittime )); then
+ $s apt-get update
+ fi
+ }
+ pi() {
+ pcheck "$@" || return 0
+ pupdate
+ if [[ $- != *i* ]]; then
+ echo pi "$*"
+ fi
+ if [[ $EUID == 0 ]]; then
+ DEBIAN_FRONTEND=noninteractive apt-get -y install --purge --auto-remove "$@"
+ else
+ sudo DEBIAN_FRONTEND=noninteractive apt-get -y install --purge --auto-remove "$@"
+ fi
+
+ }
+
+ pi-nostart() {
+ local ret=
+ pcheck "$@" || return 0
+ plock-wait
+ pupdate
+ local f=/usr/sbin/policy-rc.d
+ if [[ $- != *i* ]]; then
+ echo pi-nostart "$@"
+ fi
+ if [[ $EUID == 0 ]]; then
+ dd of=$f status=none <<EOF
+#!/bin/sh
+exit 101
+EOF
+ chmod +x $f
+ DEBIAN_FRONTEND=noninteractive apt-get -y install --purge --auto-remove "$@" || ret=$?
+ rm $f
+ else
+ sudo dd of=$f status=none <<EOF
+#!/bin/sh
+exit 101
+EOF
+ sudo chmod +x $f
+ sudo DEBIAN_FRONTEND=noninteractive apt-get -y install --purge --auto-remove "$@" || ret=$?
+ sudo rm $f
+ fi
+ return $ret
+ }
+ # package find description
+ pfd() {
+ # package name and descriptions
+ apt-cache search "$@"
+ }
+ # package find file
+ 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
+ local needed=false
+ for arg; do
+ if dpkg -s -- "$arg" &>/dev/null; then
+ needed=true
+ break
+ fi
+ done
+ $needed || return 0
+ plock-wait
+ $s apt-get -y remove --purge --auto-remove "$@"
+ # seems slightly redundant, but it removes more stuff sometimes.
+ $s apt-get -y autoremove
+ }
+ # shellcheck disable=SC2120
+ pup() { # upgrade
+ plock-wait
+ 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() {
+ # -a = search all repos
+ local -a arg all
+ all=false
+ case $1 in
+ -a)
+ all=true
+ shift
+ ;;
+ esac
+ 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
+ dpkg -S "$file"
+ else
+ if ! $all; then
+ arg=(--filter-origins "$(positive-origins)")
+ fi
+ if [[ $file == /* ]]; then
+ apt-file "${arg[@]}" find -x /"$file"\$
+ update-alternatives --list "$file" 2>/dev/null
+ else
+ apt-file "${arg[@]}" find -x "$file"\$
+ fi
+ fi
+ }
+ pkgfiles() {
+ if dpkg -s "$1" &>/dev/null; then
+ dpkg-query -L $1 | while read -r l; do [[ -f $l ]] && printf "%s\n" "$l"; done
+ else
+ apt-file -x list "^$1$"
+ fi
+ }
+
+elif command -v pacman &>/dev/null; then
+ p() {
+ pacaur "$@"
+ }
+ pi() {
+ pacaur -S --noconfirm --needed --noedit "$@"
+ }
+ pfd() {
+ 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
+ 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
+ }
+ # shellcheck disable=SC2120
+ 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
+ }