diff options
| -rwxr-xr-x | spm | 43 |
1 files changed, 25 insertions, 18 deletions
@@ -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 } |