From f2804c2b66824fdafe332c4723fbed989821c256 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Sat, 29 Jun 2019 01:33:02 +0300 Subject: [PATCH] kiss-new: Argument handling --- kiss-new | 89 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 16 deletions(-) diff --git a/kiss-new b/kiss-new index f53a7b1..ea11394 100755 --- a/kiss-new +++ b/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