Compare commits

..

26 Commits

Author SHA1 Message Date
wael
b9a8f9fc28
kiss-repo(rev)depends: same utility to search in repositories instead 2023-12-23 19:04:48 +03:00
phoebos
7740c929a3
.woodpecker.yml: fix parse error 2023-08-12 12:30:33 +01:00
phoebos
9f88746487
.woodpecker.yml: add Codeberg CI 2023-08-04 13:30:56 +01:00
phoebos
584b905d17
kiss: pass _KISS_DATE when rerunning kiss as root
For context, see https://codeberg.org/kiss-community/kiss/issues/98
2023-07-16 14:27:58 +01:00
phoebos
37e6a59ed3
kiss: add preferred to usage 2023-05-17 00:06:34 +01:00
phoebos
a6bb1c5a26
kiss: preserve KISS_HOOK for as_user actions
Without KISS_HOOK exported to the privileged process, certain hooks
can't be run (pre- and post-install at least). run_hook_pkg works, but
not KISS_HOOK. Make sure it's preserved.
2023-05-16 23:40:25 +01:00
phoebos
1492cfa0a7
kiss: sort vars for as_user 2023-05-16 23:39:24 +01:00
phoebos
4e809ddf6b
kiss: remove pkg_find_version_split
should have been removed in b66a2c4.
2023-04-22 03:20:42 +01:00
phoebos
5e338034ec
kiss: fix _pkg_find for extra colons in KISS_PATH
Previously, having an extra colon in KISS_PATH causes / to be a
directory being searched in, so you could get things like

    $ KISS_PATH=: kiss s usr
    /usr

which is clearly incorrect.
2023-04-22 03:13:42 +01:00
phoebos
9e1394c897
kiss-maintainer: get git to format 2023-03-22 01:16:58 +00:00
phoebos
61b24f4d7b
kiss-maintainer: version is a path 2023-03-22 00:56:22 +00:00
phoebos
b66a2c4203 kiss: remove VERSION markers (#121)
https://codeberg.org/kiss-community/repo/issues/90
Co-authored-by: phoebos <ben@bvnf.space>
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/121
Co-authored-by: phoebos <phoebos@noreply.codeberg.org>
Co-committed-by: phoebos <phoebos@noreply.codeberg.org>
2023-03-02 09:45:21 +00:00
phoebos
4f739a6589 kiss: don't set DESTDIR in builds (#122)
https://codeberg.org/kiss-community/repo/issues/90
Co-authored-by: phoebos <ben@bvnf.space>
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/122
Co-authored-by: phoebos <phoebos@noreply.codeberg.org>
Co-committed-by: phoebos <phoebos@noreply.codeberg.org>
2023-03-02 09:45:09 +00:00
Vouivre
38b71d01b2 kiss-outdated: fdm name on repology (#120)
`fdm` on repology is now `fdm-email-fetcher`.

Co-authored-by: Cédric <cedric@vouivre.org>
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/120
Co-authored-by: Vouivre <vouivre@noreply.codeberg.org>
Co-committed-by: Vouivre <vouivre@noreply.codeberg.org>
2023-03-01 09:00:44 +00:00
sewn
6a41ce4f7e kiss-outdated: use PWD when no args are given (#108)
Co-authored-by: wael <40663@proton.me>
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/108
Reviewed-by: phoebos <phoebos@noreply.codeberg.org>
Co-authored-by: sewn <sewn@disroot.org>
Co-committed-by: sewn <sewn@disroot.org>
2023-01-20 07:52:57 +00:00
illiliti
b04a707130 kiss: improve compression (#110)
move compression to its own function
use threads for (de)compression where possible
drop some useless flags

Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/110
Reviewed-by: phoebos <phoebos@noreply.codeberg.org>
Co-authored-by: illiliti <illiliti@protonmail.com>
Co-committed-by: illiliti <illiliti@protonmail.com>
2023-01-20 07:51:54 +00:00
sdsddsd1
ed4b6b7534 contrib: kiss-outdated: fix python-* remotes (#115)
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/115
Co-authored-by: sdsddsd1 <sdsddsd1@noreply.codeberg.org>
Co-committed-by: sdsddsd1 <sdsddsd1@noreply.codeberg.org>
2023-01-03 13:07:56 +00:00
sdsddsd1
cbbfd857f0 contrib: kiss-outdated: gtk+3 fix remote name (#114)
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/114
Co-authored-by: sdsddsd1 <sdsddsd1@noreply.codeberg.org>
Co-committed-by: sdsddsd1 <sdsddsd1@noreply.codeberg.org>
2022-12-28 10:00:23 +00:00
phoebos
d240830906 kiss: fix dd for some implementations (#109)
Co-authored-by: phoebos <phoebos@noreply.codeberg.org>
Co-committed-by: phoebos <phoebos@noreply.codeberg.org>
2022-11-22 04:12:26 +00:00
phoebos
65b5140de5 kiss: correct use of $@ if KISS_GET=aria2c (#107)
d47508c0 shifted some args down without updating the use of $2 and $3
later on.

Co-authored-by: phoebos <ben@bvnf.space>
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/107
Co-authored-by: phoebos <phoebos@noreply.codeberg.org>
Co-committed-by: phoebos <phoebos@noreply.codeberg.org>
2022-11-01 10:12:52 +01:00
git-bruh
b71f27c891
kiss: 5.6.4 2022-11-01 14:10:12 +05:30
phoebos
fabe05b37d kiss: remove partial downloads if interrupted (#100)
Co-authored-by: phoebos <phoebos@noreply.codeberg.org>
Co-committed-by: phoebos <phoebos@noreply.codeberg.org>
2022-11-01 03:57:23 +01:00
Pratham
8caca48504 kiss: bail out if package removal would break alternatives (#89) (#92)
Co-authored-by: git-bruh <e817509a-8ee9-4332-b0ad-3a6bdf9ab63f@aleeas.com>
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/92
2022-10-30 08:51:12 +01:00
illiliti
3309146e61 kiss: use dd for prompt (#106)
use dd for prompt since it will always exit upon receiving SIGINT
signal, unlike the read builtin, which, as permitted by POSIX, can
ignore this signal.

Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/106
Co-authored-by: illiliti <illiliti@protonmail.com>
Co-committed-by: illiliti <illiliti@protonmail.com>
2022-10-29 09:03:06 +02:00
phoebos
a27fcec564 kiss: use Ctrl+D to abort prompt (#105)
EOF is defined by POSIX to cause read to return an error, and works with
every shell while SIGINT (Ctrl+C) does not (eg. with yash).

Co-authored-by: phoebos <ben@bvnf.space>
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/105
Co-authored-by: phoebos <phoebos@noreply.codeberg.org>
Co-committed-by: phoebos <phoebos@noreply.codeberg.org>
2022-10-27 09:01:59 +02:00
Pratham
8a1a88e0d3 kiss: fixup etcsums, closes #94 (#97)
```
λ rm -rf /tmp/root
λ KISS_FORCE=1 kiss i iproute2
-> iproute2 Checking for package conflicts
-> iproute2 Installing package (iproute2@5.19.0-1.tar.gz)
-> iproute2 Installed successfully
λ kiss r iproute2
-> iproute2 Checking if package removable
-> iproute2 Removing package
Skipping /etc/iproute2/rt_tables (modified)
Skipping /etc/iproute2/rt_scopes (modified)
Skipping /etc/iproute2/rt_realms (modified)
Skipping /etc/iproute2/rt_protos (modified)
Skipping /etc/iproute2/nl_protos (modified)
Skipping /etc/iproute2/group (modified)
Skipping /etc/iproute2/ematch_map (modified)
Skipping /etc/iproute2/bpf_pinning (modified)
-> iproute2 Removed successfully
λ
λ rm -rf /tmp/root
λ KISS_FORCE=1 $PWD/kiss i iproute2
-> iproute2 Checking for package conflicts
-> iproute2 Installing package (iproute2@5.19.0-1.tar.gz)
-> iproute2 Installed successfully
λ $PWD/kiss r iproute2
-> iproute2 Checking if package removable
-> iproute2 Removing package
-> iproute2 Removed successfully
```

Co-authored-by: git-bruh <e817509a-8ee9-4332-b0ad-3a6bdf9ab63f@aleeas.com>
Reviewed-on: https://codeberg.org/kiss-community/kiss/pulls/97
2022-10-26 09:19:25 +02:00
7 changed files with 167 additions and 109 deletions

9
.woodpecker.yml Normal file
View File

@ -0,0 +1,9 @@
steps:
build:
image: alpine
when:
branch: [ master ]
commands: |
apk add --no-cache shellcheck
shellcheck kiss contrib/*

View File

@ -8,11 +8,9 @@
}
kiss search "$@" | sort -u | while read -r repo; do cd "$repo"
m=$(git log -1 version 2>/dev/null) ||:
m=${m##*Author: }
m=${m%%>*}
m=$(git log -1 --format='%an <%ae>' -- version 2>/dev/null) ||:
[ "$m" ] || continue
printf '=> %s\n%s>\n' "$PWD" "$m"
printf '=> %s\n%s\n' "$PWD" "$m"
done

View File

@ -76,6 +76,10 @@ EOF
remote=fd-find
;;
fdm)
remote=fdm-email-fetcher
;;
fetsh)
# TODO [community]: Rename package?
remote=fet.sh
@ -109,7 +113,7 @@ EOF
;;
gtk+3)
remote=gtk3+classic
remote=gtk3-classic
;;
gst-*)
@ -236,6 +240,18 @@ EOF
remote=python
;;
python-docutils)
remote=python:docutils
;;
python-mako)
remote=python:mako
;;
python-markupsafe)
remote=python:markupsafe
;;
qt5*)
remote=qt
;;
@ -370,8 +386,7 @@ get_outdated() {
main() {
set -e
[ "$1" ] ||
die 'usage: kiss [ou]tdated /path/to/repo...'
[ "$1" ] || set -- "$PWD"
mkdir -p "${tmp:=${XDG_CACHE_HOME:-"$HOME/.cache"}/kiss/repology}"

View File

@ -1,12 +0,0 @@
#!/bin/sh -e
# Lists the owners of all files with conflicts
kiss a | while read -r _ path; do
if owner=$(kiss owns "$path" 2>/dev/null) && [ "$owner" ]; then
printf '%s %s\n' "$owner" "$path"
else
printf 'warning: %s has no owner\n' "$path" >&2
fi
done

16
contrib/kiss-repodepends Executable file
View File

@ -0,0 +1,16 @@
#!/bin/sh -ef
# Display a package's dependencies in repositories
pkg=${1:-"${PWD##*/}"}
kiss search "$pkg" >/dev/null || {
printf 'usage: kiss-depends [pkg]\n' >&2
exit 1
}
kiss search "$pkg" | while read -r pkgpath; do
printf '=> %s\n' "$pkgpath"
while read -r dep mak || [ "$dep" ]; do
printf '%s%s\n' "$dep" "${mak:+ "$mak"}"
done 2>/dev/null < "$pkgpath/depends"
done

19
contrib/kiss-reporevdepends Executable file
View File

@ -0,0 +1,19 @@
#!/bin/sh
# Display packages in all repositories which depend on a package
[ "$1" ] || set -- "${PWD##*/}"
suffix () {
case "$1" in *"$2") return 0; esac; return 1
}
IFS=:
for repo in $KISS_PATH; do
# remove trailing slashes
while suffix "$repo" /; do repo="${repo%/}"; done
gitdir="$(git -C "$repo" rev-parse --show-toplevel 2>/dev/null || echo "$repo")"
case "$gitdir" in "$repo") unset prefix ;; *) prefix="${repo##*/}/" ;; esac
cd "$gitdir/.." || continue
grep -E "^$1([[:space:]]|$)" -- "${gitdir##*/}/$prefix"*/depends 2>/dev/null ||:
done

193
kiss
View File

@ -94,9 +94,7 @@ prompt() {
null "$1" || log "$1"
log "Continue?: Press Enter to continue or Ctrl+C to abort"
# korn-shell does not exit on interrupt of read.
equ "$KISS_PROMPT" 0 || read -r _ || exit 1
equ "$KISS_PROMPT" 0 || dd bs=1 count=1 >/dev/null 2>&1 || exit 1
}
mkcd() {
@ -194,15 +192,26 @@ run_hook_pkg() {
fi
}
compress() {
case $KISS_COMPRESS in
bz2) bzip2 -c ;;
gz) gzip -c ;;
lz) lzip -c ;;
lzma) lzma -cT0 ;;
xz) xz -cT0 ;;
zst) zstd -cT0 ;;
esac
}
decompress() {
case $1 in
*.tbz|*.bz2) bzip2 -d ;;
*.lzma) lzma -dc ;;
*.lz) lzip -dc ;;
*.tar) cat ;;
*.tgz|*.gz) gzip -d ;;
*.xz|*.txz) xz -dc ;;
*.zst) zstd -dc ;;
*.tar) cat ;;
*.tbz|*.bz2) bzip2 -dc ;;
*.lz) lzip -dc ;;
*.tgz|*.gz) gzip -dc ;;
*.lzma) lzma -dcT0 ;;
*.xz|*.txz) xz -dcT0 ;;
*.zst) zstd -dcT0 ;;
esac < "$1"
}
@ -305,15 +314,6 @@ pkg_find_version() {
die "$pkg" "Build file not found or not executable"
}
pkg_find_version_split() {
pkg_find_version "$@"
# Split the version on '.+-_' to obtain individual components.
IFS=.+-_ read -r repo_major repo_minor repo_patch repo_ident <<EOF
$repo_ver
EOF
}
pkg_find() {
_pkg_find "$@" || die "'$1' not found"
}
@ -328,6 +328,7 @@ _pkg_find() {
# Intentional.
# shellcheck disable=2086
for _find_path in $4 "${3:-$sys_db}"; do set +f
ok "$_find_path" || continue
for _find_pkg in "$_find_path/"$1; do
test "${3:--d}" "$_find_pkg" && set -f -- "$@" "$_find_pkg"
done
@ -378,24 +379,11 @@ pkg_cache() {
pkg_source_resolve() {
# Given a line of input from the sources file, return an absolute
# path to the source if it already exists, error if not.
unset _res _des _fnr
unset _res _des
ok "${2##\#*}" || return 0
# Surround each replacement with substitutions to handled escaped markers.
# First substitution turns '\MARKER' into ' ' (can't appear in sources as
# they're already split on whitespace), second replaces 'MARKER' with its
# value and the third, turns ' ' into 'MARKER' (dropping \\).
fnr "${2%"${2##*[!/]}"}" \
\\VERSION \ VERSION "$repo_ver" \ VERSION \
\\RELEASE \ RELEASE "$repo_rel" \ RELEASE \
\\MAJOR \ MAJOR "$repo_major" \ MAJOR \
\\MINOR \ MINOR "$repo_minor" \ MINOR \
\\PATCH \ PATCH "$repo_patch" \ PATCH \
\\IDENT \ IDENT "$repo_ident" \ IDENT \
\\PACKAGE \ PACKAGE "$repo_name" \ PACKAGE
set -- "$1" "$_fnr" "${3%"${3##*[!/]}"}" "$4"
set -- "$1" "$2" "${3%"${3##*[!/]}"}" "$4"
# Git repository.
if null "${2##git+*}"; then
@ -442,7 +430,7 @@ pkg_source_resolve() {
pkg_source() {
# Download any remote package sources. The existence of local files is
# also checked.
pkg_find_version_split "$1"
pkg_find_version "$1"
# Support packages without sources. Simply do nothing.
[ -f "$repo_dir/sources" ] || return 0
@ -454,9 +442,8 @@ pkg_source() {
# arg1: pre-source
# arg2: package name
# arg3: verbatim source
# arg4: resolved source
run_hook pre-source "$1" "$src" "$_fnr"
# arg3: source
run_hook pre-source "$1" "$src"
# '$2' is set when this function is called from 'kiss c' and it is used
# here to skip calling the Git code.
@ -467,8 +454,8 @@ pkg_source() {
# arg1: post-source
# arg2: package name
# arg3: verbatim source
# arg4: resolved source
# arg3: source
# arg4: destination
run_hook post-source "$1" "$src" "${_des:-"$_res"}"
done < "$repo_dir/sources"
}
@ -476,6 +463,17 @@ pkg_source() {
pkg_source_url() {
log "$repo_name" "Downloading $2"
# Download to a temporary file and only move it to the destination if
# everything completed successfully, to avoid leaving incomplete downloads
# in the cache if it is interrupted.
download_source=$2
download_dest=$1
tmp_file "${1##*/}" download
shift
set -- "$_tmp_file" "$@"
rm -f "$_tmp_file"
# Set the arguments based on found download utility.
case ${cmd_get##*/} in
aria2c) set -- -d / -o "$@" ;;
@ -485,9 +483,11 @@ pkg_source_url() {
esac
"$cmd_get" "$@" || {
rm -f "$2"
die "$repo_name" "Failed to download $3"
rm -f "$_tmp_file"
die "$repo_name" "Failed to download $download_source"
}
mv "$_tmp_file" "$download_dest"
}
pkg_source_git() {
@ -935,9 +935,16 @@ pkg_etcsums() {
# Minor optimization - skip packages without /etc/.
[ -d "$pkg_dir/$repo_name/etc" ] || return 0
# Create a list of all files in etc but do it in reverse.
while read -r etc; do case $etc in /etc/*[!/])
set -- "$pkg_dir/$repo_name/$etc" "$@"
etc="$pkg_dir/$repo_name/$etc"
# Always use hash of /dev/null as the hash for symlinks as it's
# possible that they can never be resolved/hashed
# (eg. directory, non-existent path, ...)
# So they leave missing lines in etcsums which breaks removal of all
# other unmodified files in /etc aswell
[ -h "$etc" ] && etc=/dev/null
set -- "$@" "$etc"
esac done < manifest
b3 "$@" > etcsums
@ -957,14 +964,7 @@ pkg_tar() {
cd "$pkg_dir/$1"
# Create a tarball from the contents of the built package.
tar cf - . | case $KISS_COMPRESS in
bz2) bzip2 -z ;;
gz) gzip -6 ;;
lzma) lzma -z ;;
lz) lzip -z ;;
xz) xz -z ;;
zst) zstd -z ;;
esac > "$_tar_file"
tar cf - . | compress > "$_tar_file"
cd "$OLDPWD"
@ -1039,7 +1039,7 @@ pkg_build_all() {
for pkg do
log "$pkg" "Building package ($((_build_cur+=1))/$#)"
pkg_find_version_split "$pkg"
pkg_find_version "$pkg"
# arg1: queue-status
# arg2: package name
@ -1097,16 +1097,14 @@ pkg_build() {
# Give the script a modified environment. Define toolchain program
# environment variables assuming a generic environment by default.
#
# Define DESTDIR and GOPATH to sane defaults as their use is mandatory
# in anything using autotools, meson, cmake, etc. Define KISS_ROOT as
# the sanitized value used internally by the package manager. This is
# safe to join with other paths.
# Define GOPATH to sane defaults as its use is mandatory for Go projects.
# Define KISS_ROOT as the sanitized value used internally by the package
# manager. This is safe to join with other paths.
AR="${AR:-ar}" \
CC="${CC:-cc}" \
CXX="${CXX:-c++}" \
NM="${NM:-nm}" \
RANLIB="${RANLIB:-ranlib}" \
DESTDIR="$pkg_dir/$1" \
RUSTFLAGS="--remap-path-prefix=$PWD=. $RUSTFLAGS" \
GOFLAGS="-trimpath -modcacherw $GOFLAGS" \
GOPATH="$PWD/go" \
@ -1320,6 +1318,27 @@ pkg_alternatives() {
fi
}
pkg_preferred() {
cd "$sys_db"
# We only respect first argument
if ok "$1"; then
[ -d "$1" ] || die "'$1' not found"
set -- "$1/manifest"
else
set +f; set -f -- */manifest
fi
# Pass /dev/null to grep to always ensure that the file name
# is printed even if we have a single file
pkg_alternatives |
cut -d' ' -f2- |
grep -Fxf - "$@" /dev/null |
sed 's/\/manifest:/ /'
cd "$OLDPWD"
}
pkg_swap() {
# Swap between package alternatives.
[ -d "$sys_db/$1" ] || die "'$1' not found"
@ -1384,9 +1403,6 @@ pkg_install_files() {
# Skip directories if they already exist in the file system.
# (Think /usr/bin, /usr/lib, etc).
[ -d "$_file" ] || {
# The file could be a symlink or a regular file
rm -f "$_file"
file_rwx "$2/${file#/}"
mkdir -m "$oct" "$_file"
}
@ -1414,24 +1430,6 @@ pkg_install_files() {
cp -fP "$2$file" "${_file%/*}/."
else
# Don't copy the file inside a directory if a directory with
# that name already exists. Defer it's creation to after
# package removal
# This statement will be reached again on the second call to
# pkg_install_files
# TODO maybe add a sanity check before installation for
# checking if the directory will actually be gone by the
# second installation i.e no other packages have files inside
# that dir (Eg. if you created a file at /usr)
[ -d "$_file" ] &&
if equ "$1" '-z'; then
war "Deferring creation of '$_file' as it overlaps with an existing directory"
continue
else
war "Refusing to replace non-empty directory '$_file' with file"
return 1
fi
# Construct a temporary filename which is a) unique and
# b) identifiable as related to the package manager.
__tmp=${_file%/*}/__kiss-tmp-$_pkg-${file##*/}-$KISS_PID
@ -1458,7 +1456,7 @@ pkg_remove_files() {
case "${#sum_pkg}" in
64) sh256 "$KISS_ROOT/$file" >/dev/null ;;
66) b3 "$KISS_ROOT/$file" >/dev/null ;;
*) b3 "$KISS_ROOT/$file" >/dev/null ;;
esac
equ "$hash" "$sum_pkg" || {
@ -1496,7 +1494,7 @@ pkg_etc() {
case "${#sum_old}" in
64) sh256 "$tar_dir/$_pkg$file" "$KISS_ROOT$file" >/dev/null ;;
66) b3 "$tar_dir/$_pkg$file" "$KISS_ROOT$file" >/dev/null ;;
*) b3 "$tar_dir/$_pkg$file" "$KISS_ROOT$file" >/dev/null ;;
esac
sum_new=${hash%%"$newline"*}
@ -1539,6 +1537,14 @@ pkg_removable() {
set -f
cd "$OLDPWD"
# Check if a package would leave dangling "orphaned" alternatives.
tmp_file "$1" owned-conflicts
pkg_preferred "$1" | tee "$_tmp_file"
cnt=$(wc -l < "$_tmp_file")
equ "$cnt" 0 ||
die "$1" "Not removable, package leaves behind $cnt orphaned alternatives"
}
pkg_remove() {
@ -1932,7 +1938,7 @@ args() {
# Ensure that arguments do not contain invalid characters. Wildcards can
# not be used here as they would conflict with kiss extensions.
case $action in
a|alternatives)
a|alternatives|p|preferred)
case $1 in *\**|*\!*|*\[*|*\ *|*\]*|*/*|*"$newline"*)
die "Invalid argument: '!*[ ]/\\n' ($1)"
esac
@ -1992,14 +1998,16 @@ args() {
LOGNAME="$user" \
HOME="$HOME" \
XDG_CACHE_HOME="$XDG_CACHE_HOME" \
KISS_COMPRESS="$KISS_COMPRESS" \
KISS_PATH="$KISS_PATH" \
KISS_FORCE="$KISS_FORCE" \
KISS_ROOT="$KISS_ROOT" \
KISS_CHOICE="$KISS_CHOICE" \
KISS_COLOR="$KISS_COLOR" \
KISS_TMPDIR="$KISS_TMPDIR" \
KISS_COMPRESS="$KISS_COMPRESS" \
KISS_FORCE="$KISS_FORCE" \
KISS_HOOK="$KISS_HOOK" \
KISS_PATH="$KISS_PATH" \
KISS_PID="$KISS_PID" \
KISS_ROOT="$KISS_ROOT" \
KISS_TMPDIR="$KISS_TMPDIR" \
_KISS_DATE="$time" \
_KISS_LVL="$_KISS_LVL" \
"$0" "$action" "$@"
@ -2018,20 +2026,22 @@ args() {
H|help-ext) pkg_help_ext "$@" ;;
i|install) for pkg do pkg_install "$pkg"; done ;;
l|list) pkg_list_version "$@" ;;
p|preferred) pkg_preferred "$@" ;;
r|remove) for pkg in $redro; do pkg_remove "$pkg"; done ;;
s|search) for pkg do pkg_find "$pkg" all; done ;;
u|update) pkg_update ;;
U|upgrade) pkg_upgrade ;;
v|version) printf '5.6.3\n' ;;
v|version) printf '5.6.4\n' ;;
'')
log 'kiss [a|b|c|d|i|l|r|s|u|U|v] [pkg]...'
log 'kiss [a|b|c|d|i|l|p|r|s|u|U|v] [pkg]...'
log 'alternatives List and swap alternatives'
log 'build Build packages'
log 'checksum Generate checksums'
log 'download Download sources'
log 'install Install packages'
log 'list List installed packages'
log 'preferred List owners of files with alternatives'
log 'remove Remove packages'
log 'search Search for packages'
log 'update Update the repositories'
@ -2151,7 +2161,10 @@ main() {
# Store the date and time of script invocation to be used as the name of
# the log files the package manager creates during builds.
time=$(date +%Y-%m-%d-%H:%M)
# Accept _KISS_DATE in case this process has been called by a kiss process
# started on a different day, which could cause permission issues if we
# create log_dir as root.
time=${_KISS_DATE:-"$(date +%Y-%m-%d-%H:%M)"}
create_tmp_dirs
trap_on