aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordylan.araps@gmail.com <dylan.araps@gmail.com>2019-06-28 22:33:02 +0000
committerdylan.araps@gmail.com <dylan.araps@gmail.com>2019-06-28 22:33:02 +0000
commit0765a5008cbf34c57b01412c3f7b4faa7f26b124 (patch)
tree59cbf6fcdd838c161eaa8d7f94cbb8ebe12f1e4a
parentc6fd262fbe136c5866015c3790a1d2532873bd62 (diff)
downloadcpt-0765a5008cbf34c57b01412c3f7b4faa7f26b124.tar.gz
kiss-new: Argument handling
FossilOrigin-Name: d095e537f64326918d550cca71f60ef08f2366b996ea4e5e83e5ea18fd3e741c
-rwxr-xr-xkiss-new89
1 files 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