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"
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
printf '=> %s\n%s\n' "$PWD" "$m"
printf '=> %s\n%s>\n' "$PWD" "$m"
done

View File

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

193
kiss
View File

@ -94,7 +94,9 @@ prompt() {
null "$1" || log "$1"
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() {
@ -192,26 +194,15 @@ 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
*.tar) cat ;;
*.tbz|*.bz2) bzip2 -dc ;;
*.lz) lzip -dc ;;
*.tgz|*.gz) gzip -dc ;;
*.lzma) lzma -dcT0 ;;
*.xz|*.txz) xz -dcT0 ;;
*.zst) zstd -dcT0 ;;
*.tbz|*.bz2) bzip2 -d ;;
*.lzma) lzma -dc ;;
*.lz) lzip -dc ;;
*.tar) cat ;;
*.tgz|*.gz) gzip -d ;;
*.xz|*.txz) xz -dc ;;
*.zst) zstd -dc ;;
esac < "$1"
}
@ -314,6 +305,15 @@ 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,7 +328,6 @@ _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
@ -379,11 +378,24 @@ 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
unset _res _des _fnr
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.
if null "${2##git+*}"; then
@ -430,7 +442,7 @@ pkg_source_resolve() {
pkg_source() {
# Download any remote package sources. The existence of local files is
# also checked.
pkg_find_version "$1"
pkg_find_version_split "$1"
# Support packages without sources. Simply do nothing.
[ -f "$repo_dir/sources" ] || return 0
@ -442,8 +454,9 @@ pkg_source() {
# arg1: pre-source
# arg2: package name
# arg3: source
run_hook pre-source "$1" "$src"
# arg3: verbatim source
# 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
# here to skip calling the Git code.
@ -454,8 +467,8 @@ pkg_source() {
# arg1: post-source
# arg2: package name
# arg3: source
# arg4: destination
# arg3: verbatim source
# arg4: resolved source
run_hook post-source "$1" "$src" "${_des:-"$_res"}"
done < "$repo_dir/sources"
}
@ -463,17 +476,6 @@ 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 "$@" ;;
@ -483,11 +485,9 @@ pkg_source_url() {
esac
"$cmd_get" "$@" || {
rm -f "$_tmp_file"
die "$repo_name" "Failed to download $download_source"
rm -f "$2"
die "$repo_name" "Failed to download $3"
}
mv "$_tmp_file" "$download_dest"
}
pkg_source_git() {
@ -935,16 +935,9 @@ 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/*[!/])
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"
set -- "$pkg_dir/$repo_name/$etc" "$@"
esac done < manifest
b3 "$@" > etcsums
@ -964,7 +957,14 @@ pkg_tar() {
cd "$pkg_dir/$1"
# 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"
@ -1039,7 +1039,7 @@ pkg_build_all() {
for pkg do
log "$pkg" "Building package ($((_build_cur+=1))/$#)"
pkg_find_version "$pkg"
pkg_find_version_split "$pkg"
# arg1: queue-status
# arg2: package name
@ -1097,14 +1097,16 @@ pkg_build() {
# Give the script a modified environment. Define toolchain program
# environment variables assuming a generic environment by default.
#
# 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.
# 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.
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" \
@ -1318,27 +1320,6 @@ 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"
@ -1403,6 +1384,9 @@ 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"
}
@ -1430,6 +1414,24 @@ 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
@ -1456,7 +1458,7 @@ pkg_remove_files() {
case "${#sum_pkg}" in
64) sh256 "$KISS_ROOT/$file" >/dev/null ;;
*) b3 "$KISS_ROOT/$file" >/dev/null ;;
66) b3 "$KISS_ROOT/$file" >/dev/null ;;
esac
equ "$hash" "$sum_pkg" || {
@ -1494,7 +1496,7 @@ pkg_etc() {
case "${#sum_old}" in
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
sum_new=${hash%%"$newline"*}
@ -1537,14 +1539,6 @@ 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() {
@ -1938,7 +1932,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|p|preferred)
a|alternatives)
case $1 in *\**|*\!*|*\[*|*\ *|*\]*|*/*|*"$newline"*)
die "Invalid argument: '!*[ ]/\\n' ($1)"
esac
@ -1998,16 +1992,14 @@ 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_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_PID="$KISS_PID" \
_KISS_LVL="$_KISS_LVL" \
"$0" "$action" "$@"
@ -2026,22 +2018,20 @@ 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.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 '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'
@ -2161,10 +2151,7 @@ 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.
# 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)"}
time=$(date +%Y-%m-%d-%H:%M)
create_tmp_dirs
trap_on