lots of new stuff, good working version
[distro-functions] / src / package-manager-abstractions
index a92d80d71080df13e11c64b82865f692f231fdd3..53ae02942561c631e4d17fcf30e1339acd69caeb 100644 (file)
 # limitations under the License.
 
 # basic yum/apt package manager abstraction, plus a few minor conveniences
-if type -p yum > /dev/null; then
+if command -v yum &> /dev/null; then
     # package manager
     p() {
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        $x yum "$@"
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s yum "$@"
     }
     # package install
     pi() {
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        $x yum -y install "$@"
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s yum -y install "$@"
     }
     # package find
     pf() {
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        $x yum search "$@"
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s yum search "$@"
     }
     # package remove/uninstall
     pu() {
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        $x yum autoremove "$@"
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s yum autoremove "$@"
     }
     pup() { # upgrade
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        $x yum -y distro-sync full
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s yum -y distro-sync full "$@"
     }
     # package list info
     pl() {
         yum info "$@"
     }
+    pfile() {
+        yum whatprovides \*/$1
+    }
     
-else
+elif command -v apt-get &>/dev/null; then
     p() {
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        $x aptitude "$@"
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s apt-get "$@"
     }
-    pi() {
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        # update package list if its more than an hour old
-        if (( $(( $(date +%s) - $(stat -c %Y /var/lib/apt/periodic/update-success-stamp) )) > 60*60 )); then
-            $x aptitude update
+    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
-        $x aptitude -y install "$@"
+    }
+    pi() {
+        pupdate
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s apt-get -y install "$@"
+    }
+    pi-nostart() {
+        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
+        pi "$@"
+        $s rm $f
     }
     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
+        # 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 "$@"
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s aptitude -F "%c%a%M %p %$((COLUMNS - 30))d" -w $COLUMNS search "$@"
     }
     pu() {
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        $x aptitude -y purge "$@"
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s apt-get -y purge "$@"
+        $s apt-get -y autoremove
     }
     pup() { # upgrade
-        local x
-        [[ $EUID == 0 ]] && x=sudo
-        $x aptitude -y full-upgrade "$@"
+        pupdate
+        local s; [[ $EUID != 0 ]] && s=sudo
+        $s apt-get -y dist-upgrade "$@"
+        $s apt-get -y autoremove
     }
     # package info
     pl() {
         aptitude show "$@"
     }
-    
+    pfile() {
+        if [[ $file == /* ]] && ucfq -w $file | grep -v ::: &>/dev/null; then
+            ucfq $file
+        elif [[ $file == */* ]]; then
+            apt-file find -x "$1"\$
+        else
+            apt-file find -x /"$1"\$
+        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"
+
+    }
+    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
+    }
 fi