diff options
Diffstat (limited to 'mp.sh')
| -rwxr-xr-x | mp.sh | 175 |
1 files changed, 118 insertions, 57 deletions
| diff --git a/mp.sh b/mp.sh index 1f924a7..b3f35a0 100755 --- a/mp.sh +++ b/mp.sh | |||
| @@ -1,6 +1,15 @@ | |||
| 1 | #!/usr/bin/env sh | 1 | #!/usr/bin/env sh |
| 2 | set -e | 2 | set -e |
| 3 | 3 | ||
| 4 | WD="${WD:-/usr/local/mp}" | ||
| 5 | PORTS="${PORTS:-/usr/local/ports/ports}" | ||
| 6 | PORTS_DIR="${PORTS_DIR:-/usr/local/ports}" | ||
| 7 | PORTS_REPO="${PORTS_REPO:-https://codeberg.org/Druid520/ports.git}" | ||
| 8 | STATUS="$WD/status" | ||
| 9 | INSTALLED="$WD/installed" | ||
| 10 | EXTINSTALLED="$WD/extinstalled" | ||
| 11 | CFG="/etc/mp.conf" | ||
| 12 | |||
| 4 | war() { | 13 | war() { |
| 5 | echo "warn: $1" >&2 | 14 | echo "warn: $1" >&2 |
| 6 | } | 15 | } |
| @@ -12,73 +21,125 @@ ok() { | |||
| 12 | echo "ok: $1" >&2 | 21 | echo "ok: $1" >&2 |
| 13 | } | 22 | } |
| 14 | 23 | ||
| 15 | if command -v doas >/dev/null 2>&1; then | 24 | if [ -f "$CFG" ]; then |
| 16 | rx() { | 25 | . "$CFG" |
| 17 | doas "$@" | ||
| 18 | } | ||
| 19 | return | ||
| 20 | elif command -v sudo >/dev/null 2>&1; then | ||
| 21 | rx() { | ||
| 22 | sudo "$@" | ||
| 23 | } | ||
| 24 | return | ||
| 25 | else | ||
| 26 | die "permission elevator not found." | ||
| 27 | fi | 26 | fi |
| 28 | 27 | ||
| 29 | wd="/usr/local/mp" | 28 | mp_init() { |
| 30 | ports="/usr/local/ports/ports" | 29 | if [ -f "$STATUS" ]; then |
| 31 | ports_repo="https://codeberg.org/Druid520/ports.git" | 30 | return |
| 32 | status="$wd/status" | 31 | fi |
| 33 | _installed="$wd/installed" | 32 | war "uninitialized, initializing." |
| 34 | installed="$wd/extinstalled" | 33 | git clone "$PORTS_REPO" "$PORTS_DIR" --depth 1 || die "failed cloning $PORTS_REPO to $PORTS_DIR." |
| 34 | mkdir -p "$WD" || die "failed making $WD." | ||
| 35 | touch "$STATUS" "$INSTALLED" "$EXTINSTALLED" || die "failed making $STATUS, $INSTALLED, $EXTINSTALLED." | ||
| 36 | } | ||
| 37 | mp_add() { | ||
| 38 | if [ -z "$1" ]; then | ||
| 39 | die "pkg name required." | ||
| 40 | fi | ||
| 41 | if [ ! -d "$PORTS/$1" ]; then | ||
| 42 | die "port $1 not found." | ||
| 43 | fi | ||
| 35 | 44 | ||
| 36 | cfg="/etc/mp.conf" | 45 | cp -r "$PORTS/$1" "$WD/$1" || die "failed copying $PORTS/$1 to $WD/$1." |
| 37 | if [ -f "$cfg" ]; then | 46 | cd "$WD/$1" || die "failed changing directory to $WD/$1." |
| 38 | . "$cfg" | 47 | |
| 39 | else | 48 | if [ -f "pkg.conf" ]; then |
| 40 | war "cfg not found, creating one." | 49 | . pkg.conf || die "unknown error involving $WD/$1/pkg.conf." |
| 41 | rx touch "$cfg" | 50 | else |
| 42 | fi | 51 | die "missing $WD/$1/pkg.conf." |
| 52 | fi | ||
| 53 | if [ -z "$pkg_name" ]; then | ||
| 54 | die "pkg_name not set in $WD/$1/pkg.conf." | ||
| 55 | fi | ||
| 56 | if [ -z "$pkg_ver" ]; then | ||
| 57 | die "pkg_ver not set in $WD/$1/pkg.conf." | ||
| 58 | fi | ||
| 59 | if [ -z "$pkg_license" ]; then | ||
| 60 | die "pkg_license not set in $WD/$1/pkg.conf." | ||
| 61 | fi | ||
| 43 | 62 | ||
| 44 | mp_add() { | 63 | if [ -f "add.sh" ]; then |
| 45 | rx cp -r "$ports/$1" "$wd/$1" | 64 | sh add.sh || die "$WD/$1/add.sh failed." |
| 46 | (cd "$wd/$1" && . pkg.conf && rx sh ./add.sh && rx echo "$pkg_name" >> "$_installed" && rx echo "$pkg_name-$pkg_ver ($pkg_license)" >> "$installed") | 65 | else |
| 66 | die "missing $WD/$1/add.sh." | ||
| 67 | fi | ||
| 68 | |||
| 69 | echo "$pkg_name" | tee -a "$INSTALLED" || die "failed writing to $INSTALLED." | ||
| 70 | echo "$pkg_name-$pkg_ver ($pkg_license)" | tee -a "$EXTINSTALLED" || die "failed writing to $EXTINSTALLED." | ||
| 71 | |||
| 72 | ok "$pkg_name added." | ||
| 47 | } | 73 | } |
| 48 | mp_del() { | 74 | mp_del() { |
| 49 | (cd "$wd/$1" && . pkg.conf && rx sh ./del.sh && rx sed "s/$pkg_name//g" "$_installed" && rx sed "s/$pkg_name-$pkg_ver ($pkg_license)//g" "$installed") | 75 | if [ -z "$1" ]; then |
| 50 | rx rm -rf "$wd/$1" | 76 | die "pkg name required." |
| 77 | fi | ||
| 78 | if [ ! -d "$WD/$1" ]; then | ||
| 79 | die "pkg not installed." | ||
| 80 | fi | ||
| 81 | |||
| 82 | cd "$WD/$1" || die "failed changing directory to $WD/$1." | ||
| 83 | |||
| 84 | if [ -f "pkg.conf" ]; then | ||
| 85 | . pkg.conf || die "unknown error involving $WD/$1/pkg.conf." | ||
| 86 | else | ||
| 87 | die "missing $WD/$1/pkg.conf." | ||
| 88 | fi | ||
| 89 | if [ -z "$pkg_name" ]; then | ||
| 90 | die "pkg_name not set in $WD/$1/pkg.conf." | ||
| 91 | fi | ||
| 92 | if [ -z "$pkg_ver" ]; then | ||
| 93 | die "pkg_ver not set in $WD/$1/pkg.conf." | ||
| 94 | fi | ||
| 95 | if [ -z "$pkg_license" ]; then | ||
| 96 | die "pkg_license not set in $WD/$1/pkg.conf." | ||
| 97 | fi | ||
| 98 | |||
| 99 | if [ -f "del.sh" ]; then | ||
| 100 | sh del.sh || die "$WD/$1/del.sh failed." | ||
| 101 | else | ||
| 102 | die "missing $WD/$1/del.sh." | ||
| 103 | fi | ||
| 104 | |||
| 105 | sed -i "/^$pkg_name$/d" "$INSTALLED" || die "failed writing to $INSTALLED." | ||
| 106 | sed -i "/^$pkg_name-$pkg_ver (/d" "$EXTINSTALLED" || die "failed writing to $EXTINSTALLED." | ||
| 107 | rm -rf "$WD/$1" || die "failed removing $WD/$1." | ||
| 108 | |||
| 109 | ok "$pkg_name deleted." | ||
| 51 | } | 110 | } |
| 52 | mp_upd() { | 111 | mp_upd() { |
| 53 | (cd "$ports" && rx git pull) | 112 | cd "$PORTS_DIR" || die "missing $PORTS_DIR." |
| 54 | if [ "$1" = "*" ]; then | 113 | git pull || die "failed git pull on $PORTS_DIR." |
| 55 | for pkg in $(cat "$_installed"); do | 114 | |
| 56 | (cd "$wd/$pkg" && . pkg.conf && rx sh ./del.sh && rx sh ./add.sh) | 115 | if [ "$1" = "*" ] || [ -z "$1" ]; then |
| 116 | if [ ! -f "$INSTALLED" ]; then | ||
| 117 | die "no pkgs installed." | ||
| 118 | fi | ||
| 119 | for pkg in $(cat "$INSTALLED"); do | ||
| 120 | (mp_del "$pkg") | ||
| 121 | (mp_add "$pkg") | ||
| 122 | ok "$pkg updated." | ||
| 57 | done | 123 | done |
| 58 | return | 124 | else |
| 125 | (mp_del "$1") | ||
| 126 | (mp_add "$1") | ||
| 127 | ok "$1 updated." | ||
| 59 | fi | 128 | fi |
| 60 | (cd "$wd/$1" && . pkg.conf && rx sh ./del.sh && rx sh ./add.sh) | ||
| 61 | } | ||
| 62 | mp_init() { | ||
| 63 | if [ -f "$status" ]; then | ||
| 64 | return | ||
| 65 | fi | ||
| 66 | |||
| 67 | war "uninitialized, initializing." | ||
| 68 | rx git clone "$ports_repo" "$ports" --depth 1 | ||
| 69 | rx mkdir -p "$wd" | ||
| 70 | rx touch "$installed" "$_installed" "$status" | ||
| 71 | } | 129 | } |
| 72 | 130 | ||
| 73 | mp_init | 131 | mp_init |
| 74 | if [ $# -ne 2 ]; then | 132 | |
| 75 | die "bad usage. usage: mp <a/d/u> <pkg>." | 133 | case $# in |
| 76 | elif [ "$1" = "a" ]; then | 134 | 0|1) |
| 77 | mp_add "$2" | 135 | die "usage: mp <a|d|u> <pkg>." |
| 78 | elif [ "$1" = "d" ]; then | 136 | ;; |
| 79 | mp_del "$2" | 137 | *) |
| 80 | elif [ "$1" = "u" ]; then | 138 | case $1 in |
| 81 | mp_upd "$2" | 139 | a) (mp_add "$2") ;; |
| 82 | else | 140 | d) (mp_del "$2") ;; |
| 83 | die "bad usage. usage: mp <a/d/u> <pkg>." | 141 | u) (mp_upd "$2") ;; |
| 84 | fi | 142 | *) die "usage: mp <a|d|u> <pkg>." ;; |
| 143 | esac | ||
| 144 | ;; | ||
| 145 | esac | ||
