#!/bin/sh # shellcheck disable=2094,2103 source=/dev/null # # pkg - package manager for kiss linux. die() { printf '\033[31mERROR>\033[m %s\n' "$@" >&2 exit 1 } log() { printf '\033[32m=>\033[m %s\n' "$@" } clean() { cd "$old_pwd/repo/$name" rm -rf -- "$mak_dir" "$pkg_dir" .checksums } pkg_info() { [ -z "$1" ] && die "No package specified." cd "repo/$1" || die "Package '$1' not in repository." [ -f version ] || die "Version file not found." [ -f depends ] || die "Depends file not found." [ -f sources ] || die "Sources file not found." read -r version release < version name=$1 pkg=$name-$version-$release } pkg_depends() { while read -r dependency; do # TODO: Handle dependencies. log "Found dependency $dependency" done < depends } pkg_sources() { while read -r src; do src_name=${src##*/} if [ -f "$src" ]; then continue elif [ -f "$src_dir/$src_name" ]; then log "Found cached $src_name." continue elif [ -z "${src##*://*}" ]; then log "Downloading '$src'." wget -P "$src_dir" "$src" || die "Failed to download $src." else die "Source file '$src' not found." fi done < sources } pkg_checksum() { while read -r src; do src_name=${src##*/} if [ -f "$src" ]; then src_path=$src elif [ -f "$src_dir/$src_name" ]; then src_path=$src_dir/$src_name fi cd "${src_path%/*}" sha256sum -- "$src_name" || die "Failed to generate checksums." cd - >/dev/null done < sources > "${1-checksums}" } pkg_verify() { pkg_checksum .checksums diff .checksums checksums || die "checksum of sources does not match checksum of package" \ "run '$0 checksum $name' to update checksums" log "Checksums verified." } pkg_extract() { while read -r src; do src_name=${src##*/} if [ -f "$src" ]; then cp -f "$src" "$mak_dir" elif [ ! -f "$src_dir/$src_name" ]; then die "$src_name" not found. else case $src_dir/$src_name in *.tar|*.tar.??|*.tar.???|*.tar.????|*.tgz) tar xf "$src_dir/$src_name" -C "$mak_dir" \ --strip-components 1 || die "Couldn't extract $src_name" ;; esac fi done < sources } pkg_build() { log "Building $pkg." cd "$mak_dir" set -e . "$OLDPWD/build" set +e cd - log "Sucessfully built $pkg." } pkg_manifest() { cd "$pkg_dir" _() { find . -mindepth 1 "$@" | sed 's/^\.//'; } _ -not -type d > "$OLDPWD/manifest" _ -type d | sort -r >> "$OLDPWD/manifest" cd - } args() { pkg_info "$2" case $1 in b*) [ -f checksums ] || die "Checksums missing, run '$0 checksum $name'" pkg_depends pkg_sources pkg_verify pkg_extract pkg_build pkg_manifest ;; c*) pkg_sources pkg_checksum log "Generated checksums." ;; esac } main() { trap clean EXIT INT clean mkdir -p sources build pkg sys bin || die "Couldn't create directories at '$PWD'". old_pwd=$PWD src_dir=$PWD/sources mak_dir=$PWD/build pkg_dir=$PWD/pkg sys_dir=$PWD/sys bin_dir=$PWD/bin args "$@" } main "$@"