kiss-new: Started rewriting kiss.

This commit is contained in:
Dylan Araps 2019-06-29 00:26:43 +03:00
parent 10fc9838c6
commit 3f752d42e9
2 changed files with 121 additions and 11 deletions

40
kiss
View File

@ -3,15 +3,21 @@
# kiss - package manager for kiss linux.
die() {
# Print a message and exit with '1' (error).
printf '\033[31m!>\033[m %s\n' "$@" >&2
exit 1
}
log() {
# Print a message with a colorful arrow to distinguish
# from other output.
printf '\033[32m=>\033[m %s\n' "$@"
}
source_type() {
# Figure out what kind of source we are dealing with.
# This removes the need to repeat these same tests
# in each function.
[ -z "$1" ] && return 1 # No file.
[ -f "$1" ] && return 2 # Local file.
[ -f "$src_dir/${1##*/}" ] && return 3 # Cached downloaded file.
@ -20,32 +26,44 @@ source_type() {
}
pkg_clean() {
# Clean up on exit or error. This removes everything related
# to the build.
rm -rf -- "$mak_dir" "$pkg_dir" "$tar_dir" \
"$cac_dir/manifest-$$" "$cac_dir/checksums-$$" \
"$cac_dir/mv" "$cac_dir/mkdir" "$cac_dir/find"
}
pkg_search() {
set -f
# Figure out which repository a package belongs to by
# searching for directories matching the package name
# in $KISS_PATH.
# Disable globbing with 'set -f' to ensure that the unquoted
# variable doesn't expand to anything nasty.
# shellcheck disable=2086,2046
set -- "$1" $(IFS=:; find $KISS_PATH -maxdepth 1 -name "$1")
set +f
{
set -f
set -- "$1" $(IFS=:; find $KISS_PATH -maxdepth 1 -name "$1")
set +f
}
[ -z "$2" ] && die "Package '$1' not in any repository."
rep_dir=${2%/$1}
printf '%s\n' "$2"
}
pkg_setup() {
pkg_search "$1"
# Check that each mandatory file in the package entry exists.
pkg_location=$(pkg_search "$1")
cd "$rep_dir/$1" || die "'$rep_dir/$1' not accessible"
[ -f sources ] || die "Sources file not found."
[ -x build ] || die "Build file not found or not executable."
[ -f licenses ] || die "License file not found or empty."
cd "$pkg_location" || die "'$pkg_location' not accessible"
[ -f sources ] || die "Sources file not found."
[ -x build ] || die "Build file not found or not executable."
[ -f licenses ] || die "License file not found or empty."
read -r ver rel < version || die "Version file not found."
pkg=${name:=$1}\#$ver-$rel.tar.gz
read -r pkg_ver pkg_rel < version || die "Version file not found."
pkg_name=$1
pkg_tar=$name\#$ver-$rel.tar.gz
}
pkg_depends() {

92
kiss-new Executable file
View File

@ -0,0 +1,92 @@
#!/bin/sh -e
#
# This is a simple package manager written in POSIX 'sh' for
# KISS Linux utlizing the core unix utilites where needed.
#
# The script runs with 'set -e' enabled. It will exit on any
# non-zero return code. This ensures that no function continues
# if it fails at any point.
#
# Keep in mind that this involves extra code in the case where
# an error is optional or required.
#
# The code below conforms to shellcheck's rules. However, some
# lint errors *are* disabled as they relate to unexpected
# behavior (which we do expect).
#
# KISS is available under the MIT license.
#
# - Dylan Araps.
die() {
# Print a message and exit with '1' (error).
printf '\033[31m!>\033[m %s\n' "$@" >&2
exit 1
}
log() {
# Print a message with a colorful arrow to distinguish
# from other output.
printf '\033[32m=>\033[m %s\n' "$@"
}
pkg_search() {
# Figure out which repository a package belongs to by
# searching for directories matching the package name
# in $KISS_PATH/*.
[ "$KISS_PATH" ] || \
die "\$KISS_PATH needs to be set." \
"Example: KISS_PATH=/packages/core:/packages/extra:/packages/xorg" \
"Repositories will be searched in the configured order." \
"The variable should work just like \$PATH."
# Disable globbing with 'set -f' to ensure that the unquoted
# variable doesn't expand into anything nasty.
# shellcheck disable=2086,2046
{
set -f
set -- "$1" $(IFS=:; find $KISS_PATH -maxdepth 1 -name "$1")
set +f
}
# A package may also not be found due to a repository not being
# readable by the current user. Either way, we need to die here.
[ -z "$2" ] && die "Package '$1' not in any repository."
printf '%s\n' "$2"
}
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
while [ "$1" ]; do
case $action in
b*)
pkg_search "$1"
shift
;;
esac
done
}
main() {
kiss=${0##*/}
args "$@"
}
main "$@"