forked from kiss-community/kiss
b11cd58936
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.
45 lines
1.3 KiB
Bash
Executable File
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
|