kiss/contrib/kiss-size
Ethan b11cd58936 kiss-size: fix bug when kiss-size runs on big packages
Previously, if kiss-size was ran on a package that owns a lot of
files, kiss-size would error out. This is because du wasn't
able to handle the number of files provided to it.

This patch solves this issue, by avoiding the generation of the 'files'
variable, and instead piping directly into xargs which then feeds the
files to du.

For an example package that breaks with the previous implementation,
see https://github.com/ehawkvu/kiss-tex/tree/master/texlive/texlive-fontsextra
which installs around 94,000 files.
2021-08-04 00:25:06 -05:00

45 lines
1.3 KiB
Bash
Executable File

#!/bin/sh -ef
# Show the size on disk for a package
get_size() {
# Naive function to convert bytes to human readable
# sizes (MB, KB, etc). This is probably wrong in places
# though we can fix this over time. It's a start.
case ${#1} in
[0-3]) hum=$(($1))KB ;;
[4-6]) hum=$(($1 / 1024))MB ;;
[7-9]) hum=$(($1 / 1024 / 1024))GB ;;
*) hum=$(($1)) ;;
esac
printf '%s\t%s\n' "$hum" "$2"
}
# Use the current directory as the package name if no package is given.
[ "$1" ] || set -- "${PWD##*/}"
# Ignore shellcheck as we want the warning's behavior.
# shellcheck disable=2015
kiss list "${1:-null}" >/dev/null || {
printf 'usage: kiss-size [pkg]\n'
exit 1
}
# Filter directories from manifest and leave only files.
# Directories in the manifest end in a trailing '/'.
# Send the file list to 'xargs' to run through 'du',
# this prevents du from exiting due to too many arguments
sed -e "s|^|$KISS_ROOT|" -e 's|.*/$||' \
"$KISS_ROOT/var/db/kiss/installed/$1/manifest" \
| xargs du -sk -- 2>/dev/null |
# Iterate over each line and convert the byte output to human
# readable (MB, KB, GB, etc).
while read -r size file || {
get_size "$tot" total >&2
break
} do
get_size "$size" "$file"
tot=$((tot + size))
done