summary refs log tree commit diff
path: root/mp.sh
diff options
context:
space:
mode:
Diffstat (limited to 'mp.sh')
-rwxr-xr-xmp.sh175
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
2set -e 2set -e
3 3
4WD="${WD:-/usr/local/mp}"
5PORTS="${PORTS:-/usr/local/ports/ports}"
6PORTS_DIR="${PORTS_DIR:-/usr/local/ports}"
7PORTS_REPO="${PORTS_REPO:-https://codeberg.org/Druid520/ports.git}"
8STATUS="$WD/status"
9INSTALLED="$WD/installed"
10EXTINSTALLED="$WD/extinstalled"
11CFG="/etc/mp.conf"
12
4war() { 13war() {
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
15if command -v doas >/dev/null 2>&1; then 24if [ -f "$CFG" ]; then
16 rx() { 25 . "$CFG"
17 doas "$@"
18 }
19 return
20elif command -v sudo >/dev/null 2>&1; then
21 rx() {
22 sudo "$@"
23 }
24 return
25else
26 die "permission elevator not found."
27fi 26fi
28 27
29wd="/usr/local/mp" 28mp_init() {
30ports="/usr/local/ports/ports" 29 if [ -f "$STATUS" ]; then
31ports_repo="https://codeberg.org/Druid520/ports.git" 30 return
32status="$wd/status" 31 fi
33_installed="$wd/installed" 32 war "uninitialized, initializing."
34installed="$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}
37mp_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
36cfg="/etc/mp.conf" 45 cp -r "$PORTS/$1" "$WD/$1" || die "failed copying $PORTS/$1 to $WD/$1."
37if [ -f "$cfg" ]; then 46 cd "$WD/$1" || die "failed changing directory to $WD/$1."
38 . "$cfg" 47
39else 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
42fi 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
44mp_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}
48mp_del() { 74mp_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}
52mp_upd() { 111mp_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}
62mp_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
73mp_init 131mp_init
74if [ $# -ne 2 ]; then 132
75 die "bad usage. usage: mp <a/d/u> <pkg>." 133case $# in
76elif [ "$1" = "a" ]; then 134 0|1)
77 mp_add "$2" 135 die "usage: mp <a|d|u> <pkg>."
78elif [ "$1" = "d" ]; then 136 ;;
79 mp_del "$2" 137 *)
80elif [ "$1" = "u" ]; then 138 case $1 in
81 mp_upd "$2" 139 a) (mp_add "$2") ;;
82else 140 d) (mp_del "$2") ;;
83 die "bad usage. usage: mp <a/d/u> <pkg>." 141 u) (mp_upd "$2") ;;
84fi 142 *) die "usage: mp <a|d|u> <pkg>." ;;
143 esac
144 ;;
145esac