kiss-new: Argument handling

This commit is contained in:
Dylan Araps 2019-06-29 01:33:02 +03:00
parent 3f752d42e9
commit f2804c2b66

View File

@ -10,6 +10,9 @@
# Keep in mind that this involves extra code in the case where
# an error is optional or required.
#
# Where possible the package manager should "error first".
# Check things first, die is necessary and continue if all is well.
#
# The code below conforms to shellcheck's rules. However, some
# lint errors *are* disabled as they relate to unexpected
# behavior (which we do expect).
@ -56,28 +59,82 @@ pkg_search() {
printf '%s\n' "$2"
}
pkg_list() {
# List installed packages. As the format is files and
# diectories, this just involves a simple for loop and
# file read.
# Changing directories is similar to storing the full
# full path in a variable, only there is no variable as
# you can access children relatively.
cd "$KISS_ROOT/var/db/kiss" || \
die "KISS database doesn't exist or is inaccessible."
# Optional arguments can be passed to check for specific
# packages. If no arguments are passed, list all. As we
# loop over '$@', if there aren't any arguments we can
# just set the directory contents to the argument list.
[ "$1" ] || set -- *
# Loop over each version file and warn if one doesn't exist.
# Supress errors from 'read' as we print our own message.
for pkg; do
[ -d "$pkg" ] || {
log "Package '$pkg' is not installed."
return 1
}
[ -f "$pkg/version" ] || {
log "Warning: Package '$pkg' has no version file."
return
}
read -r version release < "$pkg/version" &&
printf '%s\n' "${pkg%/*} $version-$release"
done
}
args() {
# Parse script arguments manually. POSIX 'sh' has no 'getopts'
# or equivalent built in.
[ "$1" ] || {
log "$kiss [b|c|i|l|r|u] [pkg]" \
"build: Build a package." \
"checksum: Generate checksums." \
"install: Install a package (Runs build if needed)." \
"list: List packages." \
"remove: Remove a package." \
"update: Check for updates."
exit
}
action=$1
shift
# or equivalent built in. This is rather easy to do in our case
# since the first argument is always an "action" and the arguments
# that follow are all package names.
# Actions can be abbreviated to their first letter. This saves
# keystrokes once you memorize themand it also has the side-effect
# of "correcting" spelling mistakes assuming the first letter is
# right.
while [ "$1" ]; do
case $action in
case $1 in
# Build the list of packages.
b*)
pkg_search "$1"
;;
# List installed packages.
l*)
shift
pkg_list "$@"
exit
;;
# Print version and exit.
v*)
log "$kiss 0.1.10"
exit
;;
# Catch all invalid arguments as well as
# any help related flags (-h, --help, help).
*)
log "$kiss [b|c|i|l|r|u] [pkg]" \
"build: Build a package." \
"checksum: Generate checksums." \
"install: Install a package (Runs build if needed)." \
"list: List packages." \
"remove: Remove a package." \
"update: Check for updates."
exit
;;
esac
done