forked from kiss-community/kiss
kiss-new: Argument handling
This commit is contained in:
parent
3f752d42e9
commit
f2804c2b66
89
kiss-new
89
kiss-new
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user