aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md14
-rwxr-xr-xcontrib/kiss-chroot58
-rwxr-xr-xcontrib/kiss-depends13
-rwxr-xr-xcontrib/kiss-depends-finder46
-rwxr-xr-xcontrib/kiss-export17
-rwxr-xr-xcontrib/kiss-maintainer8
-rwxr-xr-xcontrib/kiss-manifest13
-rwxr-xr-xcontrib/kiss-manifest-tree14
-rwxr-xr-xcontrib/kiss-orphans17
-rwxr-xr-xcontrib/kiss-owns25
-rwxr-xr-xcontrib/kiss-repodepends8
-rwxr-xr-xcontrib/kiss-revdepends10
-rwxr-xr-xcontrib/kiss-size21
13 files changed, 263 insertions, 1 deletions
diff --git a/README.md b/README.md
index 28ec254..796b7bf 100644
--- a/README.md
+++ b/README.md
@@ -134,4 +134,16 @@ export MAKEFLAGS=
## Extending the package manager
-See: https://github.com/kisslinux/kiss-utils
+The `contrib` directory contains a set of simple scripts to extend the package manager.
+
+- `kiss-chroot`: Enter a KISS `chroot`.
+- `kiss-depends-finder`: Find missing dependencies by parsing 'ldd'.
+- `kiss-depends`: Display a package's dependencies.
+- `kiss-export`: Turn an installed package into a KISS tarball.
+- `kiss-manifest-tree`: Display all files as tree owned by a package.
+- `kiss-manifest`: Display all files owned by a package.
+- `kiss-maintainer`: Display the package maintainers.
+- `kiss-orphans`: List orphaned packages.
+- `kiss-owns`: Check which package owns a file.
+- `kiss-revdepends`: Display packages which depend on package.
+- `kiss-size`: Show the size on disk for an installed package.
diff --git a/contrib/kiss-chroot b/contrib/kiss-chroot
new file mode 100755
index 0000000..372ef0a
--- /dev/null
+++ b/contrib/kiss-chroot
@@ -0,0 +1,58 @@
+#!/bin/sh -e
+#
+# kiss-chroot: Enter a chroot.
+
+log() {
+ printf '\033[32m->\033[m %s.\n' "$*"
+}
+
+die() {
+ log "$*" >&2
+ exit 1
+}
+
+clean() {
+ log Unmounting /dev, /proc and /sys from chroot; {
+ umount "$1/dev" ||:
+ umount "$1/proc" ||:
+ umount "$1/sys" ||:
+ }
+
+ log Cleaning leftover host files; {
+ rm -f "$1/root/.ash_history"
+ rm -f "$1/etc/resolv.conf"
+ }
+}
+
+main() {
+ [ -z "$1" ] && die Need a path to the chroot
+ [ -d "$1" ] || die Given path does not exist
+ [ "$(id -u)" = 0 ] || die Script needs to be run as root
+
+ trap 'clean "$1"' EXIT INT
+
+ log Mounting /dev, /proc and /sys from host; {
+ mountpoint -q "$1/dev" || mount -o bind /dev "$1/dev"
+ mountpoint -q "$1/proc" || mount -t proc proc "$1/proc"
+ mountpoint -q "$1/sys" || mount -t sysfs sys "$1/sys"
+
+ }
+
+ log Copying /etc/resolv.conf from host; {
+ cp /etc/resolv.conf "$1/etc"
+ }
+
+ log Entering chroot; {
+ chroot "$1" /usr/bin/env -i \
+ HOME=/root \
+ TERM="$TERM" \
+ SHELL=/bin/sh \
+ USER=root \
+ CFLAGS="-march=x86-64 -mtune=generic -pipe -Os" \
+ CXXFLAGS="-march=x86-64 -mtune=generic -pipe -Os" \
+ MAKEFLAGS="-j$(nproc 2>/dev/null || echo 1)" \
+ /bin/sh -l
+ }
+}
+
+main "$@"
diff --git a/contrib/kiss-depends b/contrib/kiss-depends
new file mode 100755
index 0000000..22a1d4e
--- /dev/null
+++ b/contrib/kiss-depends
@@ -0,0 +1,13 @@
+#!/bin/sh -ef
+#
+# kiss-depends - Display a package's dependencies.
+
+db_dir=$KISS_ROOT/var/db/kiss/installed/${1-null}
+
+# Check if package is installed and exit if it is not.
+[ -d "$db_dir" ] || {
+ printf '%s\n' "error: '$1' not installed." >&2
+ exit 1
+}
+
+[ -f "$db_dir/depends" ] && cat "$db_dir/depends"
diff --git a/contrib/kiss-depends-finder b/contrib/kiss-depends-finder
new file mode 100755
index 0000000..3a7f88b
--- /dev/null
+++ b/contrib/kiss-depends-finder
@@ -0,0 +1,46 @@
+#!/bin/sh -e
+#
+# Find missing dependencies by parsing 'ldd'.
+
+db_dir=$KISS_ROOT/var/db/kiss/installed
+
+# Check if package is installed and exit if it is not.
+[ -d "$db_dir/${1-null}" ] || {
+ printf '%s\n' "error: '$1' not installed." >&2
+ exit 1
+}
+
+printf '%s\n' "=> Detected dependencies:"
+
+while read -r file; do
+ # Skip directories.
+ [ -d "$KISS_ROOT/$file" ] && continue
+
+ ldd "$KISS_ROOT/$file" 2>/dev/null | while read -r dep; do
+ # Skip lines containing 'ldd'.
+ [ "${dep##*ldd*}" ] || continue
+
+ # Extract the file path from 'ldd' output.
+ dep=${dep#* => }
+ dep=${dep% *}
+
+ # Traverse symlinks to get the true path to the file.
+ pkg=$(readlink -f "$KISS_ROOT/${dep##$KISS_ROOT}")
+
+ # Figure out which package owns the file.
+ pkg=$(grep -lFx "${pkg##$KISS_ROOT}" "$db_dir/"*/manifest)
+ pkg=${pkg%/*}
+ pkg=${pkg##*/}
+
+ case $pkg in
+ # Skip listing these packages as dependencies.
+ musl|gcc|$1) ;;
+ *) printf '%s\n' "$pkg" ;;
+ esac
+ done &
+done < "$db_dir/$1/manifest" | sort | uniq
+
+printf '\n%s\n' "=> Package dependencies:"
+
+[ -f "$db_dir/$1/depends" ] &&
+ cat "$db_dir/$1/depends"
diff --git a/contrib/kiss-export b/contrib/kiss-export
new file mode 100755
index 0000000..e8da80f
--- /dev/null
+++ b/contrib/kiss-export
@@ -0,0 +1,17 @@
+#!/bin/sh -ef
+#
+# kiss-export - Turn an installed package into a KISS tarball.
+
+read -r ver rel 2>/dev/null < "$KISS_ROOT/var/db/kiss/installed/$1/version" || {
+ printf '%s\n' "error: '$1' is not installed." >&2
+ exit 1
+}
+
+# This warning is safe to ignore as globs are disabled and
+# word splitting is intentional.
+# shellcheck disable=2046
+tar czvf "$1#$ver-$rel.tar.gz" -C / -- $(
+ while read -r file; do
+ [ -d "$KISS_ROOT/$file" ] || printf '%s\n' ".$file"
+ done < "$KISS_ROOT/var/db/kiss/installed/$1/manifest"
+)
diff --git a/contrib/kiss-maintainer b/contrib/kiss-maintainer
new file mode 100755
index 0000000..a8bc19c
--- /dev/null
+++ b/contrib/kiss-maintainer
@@ -0,0 +1,8 @@
+#!/bin/sh -e
+#
+# kiss-maintainer - find the maintainer of a package.
+
+kiss s "$1" >/dev/null && {
+ cd "$(kiss s "$1")"
+ git log . 2>/dev/null | grep -F Author: | sort -u
+}
diff --git a/contrib/kiss-manifest b/contrib/kiss-manifest
new file mode 100755
index 0000000..74cd380
--- /dev/null
+++ b/contrib/kiss-manifest
@@ -0,0 +1,13 @@
+#!/bin/sh -ef
+#
+# kiss-manifest - Display all files owned by a package.
+
+db_dir=$KISS_ROOT/var/db/kiss/installed/${1-null}
+
+# Check if package is installed and exit if it is not.
+[ -d "$db_dir" ] || {
+ printf '%s\n' "error: '$1' not installed." >&2
+ exit 1
+}
+
+cat "$db_dir/manifest"
diff --git a/contrib/kiss-manifest-tree b/contrib/kiss-manifest-tree
new file mode 100755
index 0000000..995af9d
--- /dev/null
+++ b/contrib/kiss-manifest-tree
@@ -0,0 +1,14 @@
+#!/bin/sh -ef
+#
+# kiss-manifest-tree - Display all files owned by a package.
+
+db_dir=$KISS_ROOT/var/db/kiss/installed/${1-null}
+
+# Check if package is installed and exit if it is not.
+[ -d "$db_dir" ] || {
+ printf '%s\n' "error: '$1' not installed." >&2
+ exit 1
+}
+
+printf '%s\n' "[$1]:"
+tree -C --fromfile "$db_dir/manifest" | tail -n +2
diff --git a/contrib/kiss-orphans b/contrib/kiss-orphans
new file mode 100755
index 0000000..a1f0894
--- /dev/null
+++ b/contrib/kiss-orphans
@@ -0,0 +1,17 @@
+#!/bin/sh -e
+#
+# kiss-orphans - List orphaned packages.
+
+cd "$KISS_ROOT/var/db/kiss/installed/"
+
+for pkg in *; do
+ # Skip these packages.
+ case $pkg in
+ baseinit|baselayout|gcc|pkgconf|e2fsprogs|\
+ make|busybox|bzip2|grub|automake)
+ continue
+ ;;
+ esac
+
+ grep -q "^$pkg$" ./*/depends || printf '%s\n' "$pkg"
+done
diff --git a/contrib/kiss-owns b/contrib/kiss-owns
new file mode 100755
index 0000000..249c52c
--- /dev/null
+++ b/contrib/kiss-owns
@@ -0,0 +1,25 @@
+#!/bin/sh -e
+#
+# kiss-owns - Check which package owns a file.
+
+# Strip 'KISS_ROOT' from the file path if passed and
+# follow symlinks.
+file=$(readlink -f "$KISS_ROOT/${1##$KISS_ROOT}")
+
+# Check if the file exists and exit if it is not.
+[ -f "$file" ] || {
+ printf '%s\n' "error: file '$1' doesn't exist." >&2
+ exit 1
+}
+
+# Print the full path to the manifest file which contains
+# the match to our search.
+pkg_owns=$(grep -lFx "${file##$KISS_ROOT}" \
+ "$KISS_ROOT/var/db/kiss/installed/"*/manifest)
+
+
+# Extract the package name from the path above.
+pkg_owns=${pkg_owns%/*}
+pkg_owns=${pkg_owns##*/}
+
+printf '%s\n' "[$pkg_owns] owns '$1'"
diff --git a/contrib/kiss-repodepends b/contrib/kiss-repodepends
new file mode 100755
index 0000000..f56c2cb
--- /dev/null
+++ b/contrib/kiss-repodepends
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# kiss-repodepends
+
+# Disable this warning as the output
+# from 'kiss s' is intended to be split.
+# shellcheck disable=2046
+cat $(kiss s "$1")/depends 2>/dev/null
diff --git a/contrib/kiss-revdepends b/contrib/kiss-revdepends
new file mode 100755
index 0000000..5a181e5
--- /dev/null
+++ b/contrib/kiss-revdepends
@@ -0,0 +1,10 @@
+#!/bin/sh -e
+#
+# kiss-revdepends - Display packages which depend on package.
+
+# 'cd' to the database directory as a simple way of
+# stripping the path and performing a 'basename'.
+cd "$KISS_ROOT/var/db/kiss/installed"
+
+# Use a simple 'grep' to display packages depending on '$1'.
+grep "^$1" -- */depends
diff --git a/contrib/kiss-size b/contrib/kiss-size
new file mode 100755
index 0000000..72365a4
--- /dev/null
+++ b/contrib/kiss-size
@@ -0,0 +1,21 @@
+#!/bin/sh -ef
+#
+# kiss-size - Show the size on disk for a package.
+
+db_dir=$KISS_ROOT/var/db/kiss/installed/${1-null}
+
+# Check if package is installed and exit if it is not.
+[ -d "$db_dir" ] || {
+ printf '%s\n' "error: '$1' not installed." >&2
+ exit 1
+}
+
+# Filter directories from manifest and leave only files.
+# Directories in the manifest end in a trailing '/'.
+files=$(sed 's|.*/$||' "$db_dir/manifest")
+
+# Send the file list to 'du'.
+# This unquoted variable is safe as word splitting is intended
+# and globbing is globally disabled in this script.
+# shellcheck disable=2086
+du -shc -- $files 2>/dev/null