Compare commits

..

4 Commits

Author SHA1 Message Date
git-bruh
e6fe686dc9
missing continue......... 2022-10-21 13:25:54 +05:30
git-bruh
51a3a26e6f
fixed 2022-10-21 13:25:54 +05:30
git-bruh
7b6519e326
dir -> file 2022-10-21 13:25:54 +05:30
git-bruh
130fdcf2f6
kiss: always remove file during installation if it's not a directory, closes #95 2022-10-21 13:25:54 +05:30
7 changed files with 109 additions and 167 deletions

View File

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

View File

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

View File

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

12
contrib/kiss-preferred Executable file
View File

@ -0,0 +1,12 @@
#!/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

View File

@ -1,16 +0,0 @@
#!/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

View File

@ -1,19 +0,0 @@
#!/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

191
kiss
View File

@ -94,7 +94,9 @@ prompt() {
null "$1" || log "$1" null "$1" || log "$1"
log "Continue?: Press Enter to continue or Ctrl+C to abort" log "Continue?: Press Enter to continue or Ctrl+C to abort"
equ "$KISS_PROMPT" 0 || dd bs=1 count=1 >/dev/null 2>&1 || exit 1
# korn-shell does not exit on interrupt of read.
equ "$KISS_PROMPT" 0 || read -r _ || exit 1
} }
mkcd() { mkcd() {
@ -192,26 +194,15 @@ run_hook_pkg() {
fi 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() { decompress() {
case $1 in case $1 in
*.tar) cat ;; *.tbz|*.bz2) bzip2 -d ;;
*.tbz|*.bz2) bzip2 -dc ;; *.lzma) lzma -dc ;;
*.lz) lzip -dc ;; *.lz) lzip -dc ;;
*.tgz|*.gz) gzip -dc ;; *.tar) cat ;;
*.lzma) lzma -dcT0 ;; *.tgz|*.gz) gzip -d ;;
*.xz|*.txz) xz -dcT0 ;; *.xz|*.txz) xz -dc ;;
*.zst) zstd -dcT0 ;; *.zst) zstd -dc ;;
esac < "$1" esac < "$1"
} }
@ -314,6 +305,15 @@ pkg_find_version() {
die "$pkg" "Build file not found or not executable" 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() {
_pkg_find "$@" || die "'$1' not found" _pkg_find "$@" || die "'$1' not found"
} }
@ -328,7 +328,6 @@ _pkg_find() {
# Intentional. # Intentional.
# shellcheck disable=2086 # shellcheck disable=2086
for _find_path in $4 "${3:-$sys_db}"; do set +f for _find_path in $4 "${3:-$sys_db}"; do set +f
ok "$_find_path" || continue
for _find_pkg in "$_find_path/"$1; do for _find_pkg in "$_find_path/"$1; do
test "${3:--d}" "$_find_pkg" && set -f -- "$@" "$_find_pkg" test "${3:--d}" "$_find_pkg" && set -f -- "$@" "$_find_pkg"
done done
@ -379,11 +378,24 @@ pkg_cache() {
pkg_source_resolve() { pkg_source_resolve() {
# Given a line of input from the sources file, return an absolute # Given a line of input from the sources file, return an absolute
# path to the source if it already exists, error if not. # path to the source if it already exists, error if not.
unset _res _des unset _res _des _fnr
ok "${2##\#*}" || return 0 ok "${2##\#*}" || return 0
set -- "$1" "$2" "${3%"${3##*[!/]}"}" "$4" # 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"
# Git repository. # Git repository.
if null "${2##git+*}"; then if null "${2##git+*}"; then
@ -430,7 +442,7 @@ pkg_source_resolve() {
pkg_source() { pkg_source() {
# Download any remote package sources. The existence of local files is # Download any remote package sources. The existence of local files is
# also checked. # also checked.
pkg_find_version "$1" pkg_find_version_split "$1"
# Support packages without sources. Simply do nothing. # Support packages without sources. Simply do nothing.
[ -f "$repo_dir/sources" ] || return 0 [ -f "$repo_dir/sources" ] || return 0
@ -442,8 +454,9 @@ pkg_source() {
# arg1: pre-source # arg1: pre-source
# arg2: package name # arg2: package name
# arg3: source # arg3: verbatim source
run_hook pre-source "$1" "$src" # arg4: resolved source
run_hook pre-source "$1" "$src" "$_fnr"
# '$2' is set when this function is called from 'kiss c' and it is used # '$2' is set when this function is called from 'kiss c' and it is used
# here to skip calling the Git code. # here to skip calling the Git code.
@ -454,8 +467,8 @@ pkg_source() {
# arg1: post-source # arg1: post-source
# arg2: package name # arg2: package name
# arg3: source # arg3: verbatim source
# arg4: destination # arg4: resolved source
run_hook post-source "$1" "$src" "${_des:-"$_res"}" run_hook post-source "$1" "$src" "${_des:-"$_res"}"
done < "$repo_dir/sources" done < "$repo_dir/sources"
} }
@ -463,17 +476,6 @@ pkg_source() {
pkg_source_url() { pkg_source_url() {
log "$repo_name" "Downloading $2" 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. # Set the arguments based on found download utility.
case ${cmd_get##*/} in case ${cmd_get##*/} in
aria2c) set -- -d / -o "$@" ;; aria2c) set -- -d / -o "$@" ;;
@ -483,11 +485,9 @@ pkg_source_url() {
esac esac
"$cmd_get" "$@" || { "$cmd_get" "$@" || {
rm -f "$_tmp_file" rm -f "$2"
die "$repo_name" "Failed to download $download_source" die "$repo_name" "Failed to download $3"
} }
mv "$_tmp_file" "$download_dest"
} }
pkg_source_git() { pkg_source_git() {
@ -935,16 +935,9 @@ pkg_etcsums() {
# Minor optimization - skip packages without /etc/. # Minor optimization - skip packages without /etc/.
[ -d "$pkg_dir/$repo_name/etc" ] || return 0 [ -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/*[!/]) while read -r etc; do case $etc in /etc/*[!/])
etc="$pkg_dir/$repo_name/$etc" set -- "$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 esac done < manifest
b3 "$@" > etcsums b3 "$@" > etcsums
@ -964,7 +957,14 @@ pkg_tar() {
cd "$pkg_dir/$1" cd "$pkg_dir/$1"
# Create a tarball from the contents of the built package. # Create a tarball from the contents of the built package.
tar cf - . | compress > "$_tar_file" 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"
cd "$OLDPWD" cd "$OLDPWD"
@ -1039,7 +1039,7 @@ pkg_build_all() {
for pkg do for pkg do
log "$pkg" "Building package ($((_build_cur+=1))/$#)" log "$pkg" "Building package ($((_build_cur+=1))/$#)"
pkg_find_version "$pkg" pkg_find_version_split "$pkg"
# arg1: queue-status # arg1: queue-status
# arg2: package name # arg2: package name
@ -1097,14 +1097,16 @@ pkg_build() {
# Give the script a modified environment. Define toolchain program # Give the script a modified environment. Define toolchain program
# environment variables assuming a generic environment by default. # environment variables assuming a generic environment by default.
# #
# Define GOPATH to sane defaults as its use is mandatory for Go projects. # Define DESTDIR and GOPATH to sane defaults as their use is mandatory
# Define KISS_ROOT as the sanitized value used internally by the package # in anything using autotools, meson, cmake, etc. Define KISS_ROOT as
# manager. This is safe to join with other paths. # the sanitized value used internally by the package manager. This is
# safe to join with other paths.
AR="${AR:-ar}" \ AR="${AR:-ar}" \
CC="${CC:-cc}" \ CC="${CC:-cc}" \
CXX="${CXX:-c++}" \ CXX="${CXX:-c++}" \
NM="${NM:-nm}" \ NM="${NM:-nm}" \
RANLIB="${RANLIB:-ranlib}" \ RANLIB="${RANLIB:-ranlib}" \
DESTDIR="$pkg_dir/$1" \
RUSTFLAGS="--remap-path-prefix=$PWD=. $RUSTFLAGS" \ RUSTFLAGS="--remap-path-prefix=$PWD=. $RUSTFLAGS" \
GOFLAGS="-trimpath -modcacherw $GOFLAGS" \ GOFLAGS="-trimpath -modcacherw $GOFLAGS" \
GOPATH="$PWD/go" \ GOPATH="$PWD/go" \
@ -1318,27 +1320,6 @@ pkg_alternatives() {
fi 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() { pkg_swap() {
# Swap between package alternatives. # Swap between package alternatives.
[ -d "$sys_db/$1" ] || die "'$1' not found" [ -d "$sys_db/$1" ] || die "'$1' not found"
@ -1403,6 +1384,9 @@ pkg_install_files() {
# Skip directories if they already exist in the file system. # Skip directories if they already exist in the file system.
# (Think /usr/bin, /usr/lib, etc). # (Think /usr/bin, /usr/lib, etc).
[ -d "$_file" ] || { [ -d "$_file" ] || {
# The file could be a symlink or a regular file
rm -f "$_file"
file_rwx "$2/${file#/}" file_rwx "$2/${file#/}"
mkdir -m "$oct" "$_file" mkdir -m "$oct" "$_file"
} }
@ -1430,6 +1414,24 @@ pkg_install_files() {
cp -fP "$2$file" "${_file%/*}/." cp -fP "$2$file" "${_file%/*}/."
else 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 # Construct a temporary filename which is a) unique and
# b) identifiable as related to the package manager. # b) identifiable as related to the package manager.
__tmp=${_file%/*}/__kiss-tmp-$_pkg-${file##*/}-$KISS_PID __tmp=${_file%/*}/__kiss-tmp-$_pkg-${file##*/}-$KISS_PID
@ -1456,7 +1458,7 @@ pkg_remove_files() {
case "${#sum_pkg}" in case "${#sum_pkg}" in
64) sh256 "$KISS_ROOT/$file" >/dev/null ;; 64) sh256 "$KISS_ROOT/$file" >/dev/null ;;
*) b3 "$KISS_ROOT/$file" >/dev/null ;; 66) b3 "$KISS_ROOT/$file" >/dev/null ;;
esac esac
equ "$hash" "$sum_pkg" || { equ "$hash" "$sum_pkg" || {
@ -1494,7 +1496,7 @@ pkg_etc() {
case "${#sum_old}" in case "${#sum_old}" in
64) sh256 "$tar_dir/$_pkg$file" "$KISS_ROOT$file" >/dev/null ;; 64) sh256 "$tar_dir/$_pkg$file" "$KISS_ROOT$file" >/dev/null ;;
*) b3 "$tar_dir/$_pkg$file" "$KISS_ROOT$file" >/dev/null ;; 66) b3 "$tar_dir/$_pkg$file" "$KISS_ROOT$file" >/dev/null ;;
esac esac
sum_new=${hash%%"$newline"*} sum_new=${hash%%"$newline"*}
@ -1537,14 +1539,6 @@ pkg_removable() {
set -f set -f
cd "$OLDPWD" 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() { pkg_remove() {
@ -1938,7 +1932,7 @@ args() {
# Ensure that arguments do not contain invalid characters. Wildcards can # Ensure that arguments do not contain invalid characters. Wildcards can
# not be used here as they would conflict with kiss extensions. # not be used here as they would conflict with kiss extensions.
case $action in case $action in
a|alternatives|p|preferred) a|alternatives)
case $1 in *\**|*\!*|*\[*|*\ *|*\]*|*/*|*"$newline"*) case $1 in *\**|*\!*|*\[*|*\ *|*\]*|*/*|*"$newline"*)
die "Invalid argument: '!*[ ]/\\n' ($1)" die "Invalid argument: '!*[ ]/\\n' ($1)"
esac esac
@ -1998,16 +1992,14 @@ args() {
LOGNAME="$user" \ LOGNAME="$user" \
HOME="$HOME" \ HOME="$HOME" \
XDG_CACHE_HOME="$XDG_CACHE_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_CHOICE="$KISS_CHOICE" \
KISS_COLOR="$KISS_COLOR" \ KISS_COLOR="$KISS_COLOR" \
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_TMPDIR="$KISS_TMPDIR" \
_KISS_DATE="$time" \ KISS_PID="$KISS_PID" \
_KISS_LVL="$_KISS_LVL" \ _KISS_LVL="$_KISS_LVL" \
"$0" "$action" "$@" "$0" "$action" "$@"
@ -2026,22 +2018,20 @@ args() {
H|help-ext) pkg_help_ext "$@" ;; H|help-ext) pkg_help_ext "$@" ;;
i|install) for pkg do pkg_install "$pkg"; done ;; i|install) for pkg do pkg_install "$pkg"; done ;;
l|list) pkg_list_version "$@" ;; l|list) pkg_list_version "$@" ;;
p|preferred) pkg_preferred "$@" ;;
r|remove) for pkg in $redro; do pkg_remove "$pkg"; done ;; r|remove) for pkg in $redro; do pkg_remove "$pkg"; done ;;
s|search) for pkg do pkg_find "$pkg" all; done ;; s|search) for pkg do pkg_find "$pkg" all; done ;;
u|update) pkg_update ;; u|update) pkg_update ;;
U|upgrade) pkg_upgrade ;; U|upgrade) pkg_upgrade ;;
v|version) printf '5.6.4\n' ;; v|version) printf '5.6.3\n' ;;
'') '')
log 'kiss [a|b|c|d|i|l|p|r|s|u|U|v] [pkg]...' log 'kiss [a|b|c|d|i|l|r|s|u|U|v] [pkg]...'
log 'alternatives List and swap alternatives' log 'alternatives List and swap alternatives'
log 'build Build packages' log 'build Build packages'
log 'checksum Generate checksums' log 'checksum Generate checksums'
log 'download Download sources' log 'download Download sources'
log 'install Install packages' log 'install Install packages'
log 'list List installed packages' log 'list List installed packages'
log 'preferred List owners of files with alternatives'
log 'remove Remove packages' log 'remove Remove packages'
log 'search Search for packages' log 'search Search for packages'
log 'update Update the repositories' log 'update Update the repositories'
@ -2161,10 +2151,7 @@ main() {
# Store the date and time of script invocation to be used as the name of # Store the date and time of script invocation to be used as the name of
# the log files the package manager creates during builds. # the log files the package manager creates during builds.
# Accept _KISS_DATE in case this process has been called by a kiss process time=$(date +%Y-%m-%d-%H:%M)
# 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 create_tmp_dirs
trap_on trap_on