aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremmett1 <me@emmett1.my>2026-05-29 17:18:13 +0800
committeremmett1 <me@emmett1.my>2026-05-29 17:18:13 +0800
commit6f01bdb26c38cac5cd15073ff94a029edcbf7197 (patch)
treec371cc52537f1b19b45f07cfe8817d3ad889e4b0
parentfadd982a62133ded035b1306b4f958c6e939f901 (diff)
downloadspm-6f01bdb26c38cac5cd15073ff94a029edcbf7197.tar.gz
spm-6f01bdb26c38cac5cd15073ff94a029edcbf7197.zip
fixs
-rwxr-xr-xspm43
1 files changed, 25 insertions, 18 deletions
diff --git a/spm b/spm
index 57447e5..cc4f968 100755
--- a/spm
+++ b/spm
@@ -5,12 +5,11 @@
# \/\_____\\ \_\ \ \_\ \ \_\
# \/_____/ \/_/ \/_/ \/_/
#
-# SPM - Simple Package manager (C) 2023-2025 Emmett1
+# SPM - Simple Package manager (C) 2023-2026 Emmett1
#
-#MARKER
-msg() { echo "[${name:-...}] $@"; }
-msgerr() { echo "[${name:-...}] ERROR: $@"; exit 1; }
+msg() { echo "[${name:-...}] $*"; }
+msgerr() { echo "[${name:-...}] ERROR: $*"; exit 1; }
needarg() { [ "$1" ] || msgerr "This operation need argument(s). Aborted."; }
checkdbdir() { [ -d $PKGDB ] || msgerr "Database directory '$PKGDB' not exist. Aborted"; }
@@ -24,8 +23,10 @@ checkpkgname() {
}
spm_build() {
- needarg $1
- [ -d "${1%/*}" ] || msgerr "'${1%/*}' directory not exist."
+ needarg "$1"
+ case $1 in
+ */*) [ -d "${1%/*}" ] || msgerr "'${1%/*}' directory not exist.";;
+ esac
checkpkgname ${1##*/}
@@ -150,7 +151,13 @@ spm_install() {
fi
msg "$([ $upgrade ] && echo Upgrading || echo Installing) package..."
- tar -xvhpf "$1" -C "${SPM_ROOT%/}"/ | while read -r line; do
+ tar -xvhpf "$1" -C "${SPM_ROOT%/}/" > "$SPMDIR/extract.list" 2>/dev/null || {
+ msg "Package extraction failed. Aborted."
+ rm -f "/tmp/spminstall.lock" "$SPMDIR"/*.list
+ exit 1
+ }
+
+ while read -r line; do
if [ "$line" = "${line%.new}.new" ]; then
line=${line%.new}
# if file not exist or same file, just move it
@@ -159,8 +166,8 @@ spm_install() {
fi
fi
[ "$SPM_VERBOSE" ] && echo "installed '$line'"
- echo "$line" >> $SPMDIR/install.list
- done
+ echo "$line"
+ done < "$SPMDIR/extract.list" > "$SPMDIR/install.list"
if [ "$upgrade" ]; then
cd $PKGDB
@@ -255,17 +262,17 @@ spm_remove() {
cd "${SPM_ROOT:-/}"
- # while loop is way to slow, but need to use it only for space separated filenames
- grep ' ' $PKGDB/$1 | sort | while read -r line; do
+ # handle filenames with spaces individually (rm/rmdir), then bulk-filter them from db
+ grep ' ' "$PKGDB/$1" | while read -r line; do
case $line in
*/) rmdir $VERBOSE "$line";;
*) rm $VERBOSE "$line";;
esac
- sed "\|^$line$|d" -i $PKGDB/$1
done
-
- # remove files
- rm $VERBOSE $(tail -n+2 $PKGDB/$1 | tac | grep -v /$)
+ grep -v ' ' "$PKGDB/$1" > "$SPMDIR/remove.tmp" && mv "$SPMDIR/remove.tmp" "$PKGDB/$1"
+
+ # remove remaining files (no spaces, safe to bulk-expand)
+ rm $VERBOSE $(tail -n+2 "$PKGDB/$1" | tac | grep -v /$)
# list all dirs except for target pkg
grep /$ $PKGDB/* | grep -v /$1: | awk -F : '{print $2}' | sort | uniq > $SPMDIR/remove.all
@@ -295,9 +302,9 @@ spm_listfiles() {
spm_owner() {
checkdbdir
- needarg $1
- set -- ${1#/}
- (cd $PKGDB && grep $1 * | tr ':' ' ')
+ needarg "$1"
+ f=${1#/}
+ (cd "$PKGDB" && grep -F "$f" * | tr ':' ' ')
exit 0
}