1
0
src/packrat/prat
2022-09-17 23:19:09 -04:00

141 lines
2.4 KiB
Bash
Executable File

#!/bin/sh
set -e
argv0="$0"
argv1="$1"
argv2="$2"
dep() {
! command -v "$1" >/dev/null 2>&1 \
&& printf "%s: Missing dependency for this operation with type %s: %s\n" \
"$argv0" "$argv2" "$1" 1>&2 \
&& exit 1 \
|| return 0
}
deps() {
while [ -n "$1" ]; do
# shellcheck disable=SC2015
command -v "$1" >/dev/null 2>&1 \
&& printf "%s" "$1" && return 0 \
|| true
done
return 1
}
error() {
printf "%s: Programmer error. Please report.\n" "$argv0" 1>&2
exit 1 || return 1
}
# this will alias GNU and busybox lses to the functionality of 9 ls
# - this is a stupid hack and GNU and busybox lses should do this
# by default
# shellcheck disable=SC2015
ls --version >/dev/null 2>&1 || ls -x >/dev/null 2>&1 \
&& alias ls="ls -1A ." \
|| alias ls="ls ."
usage() {
printf "Usage: %s {c,cf,d,df} [type]\n" "$argv0" 1>&2
exit 1
}
unsupported() {
printf "%s: Unknown/unsupported type %s for this operation\n" "$argv0" "$argv2" 1>&2
exit 1
}
[ -z "$3" ] || usage
case "$argv1" in
c)
case "$argv2" in
gzip)
dep gzip
gzip -c
# -c - output to standard output
;;
xzip)
dep xz
xzip -c
# -c - output to standard output
;;
*) unsupported ;;
esac ;;
d)
case "$argv2" in
gzip)
dep gzip
gzip -cd
# -c - output to standard output
# -d - decompress
;;
lzip)
# should be improved but is decent
method=$(deps lzip 7z)
[ -n "$method" ] || dep 7z
case $method in
7z)
7z x -bd -si -so -tlzip
# x - extract
# -bd - disable percentage indicator
# -si - read from standard input
# -so - output to standard output
# -tlzip - type: lzip
;;
lzip)
lzip -cd
# -c - output to standard output
# -d - decompress
;;
*)
error
;;
esac ;;
tar)
dep tar
tar -xO
# -x - extract
# -O - output to standard output
;;
xzip)
dep xz
xz -cd
# -c - output to standard output
# -d - decompress
;;
*) unsupported ;;
esac ;;
cf)
case "$argv2" in
*) unsupported ;;
esac ;;
df)
case "$argv2" in
tar)
dep tar
tar -x
;;
unrar)
# UNTESTED
unrar x - "$3"
# x - extract
# - - stop parsing switches
;;
zip)
# unzip can't extract files that start with a dash as far as I
# can tell, so we have to use 7z(1)
dep 7z
7z x -bd -o. -si -tzip >/dev/null
# x - extract
# -bd - disable percentage indicator
# -o. - output to current dir
# -si - read from standard input
# -tzip - type: zip
;;
*) unsupported ;;
esac ;;
*) usage ;;
esac