[pacman-dev] [PATCH v3 0/1] Correct package size calculation in makepkg
From: Ronan Pigott <rpigott@berkeley.edu> V3 addresses eschwartz comment that leading trailing whitespace are not handled correctly. With these changes it is no longer necessary to modify INODECMD and other files that use it, so those changes have been removed and another patch can address them if necessary. Filenames that coincide with a valid stat flag option are now handled as well with a -- argument to stat. Ronan Pigott (1): makepkg: do not count hard linked file sizes multiple times scripts/Makefile.am | 1 + scripts/libmakepkg/util/dirsize.sh.in | 45 +++++++++++++++++++++++++++ scripts/libmakepkg/util/meson.build | 1 + scripts/makepkg.sh.in | 2 +- 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 scripts/libmakepkg/util/dirsize.sh.in -- 2.23.0
From: Ronan Pigott <rpigott@berkeley.edu> Signed-off-by: Ronan Pigott <rpigott@berkeley.edu> --- scripts/Makefile.am | 1 + scripts/libmakepkg/util/dirsize.sh.in | 45 +++++++++++++++++++++++++++ scripts/libmakepkg/util/meson.build | 1 + scripts/makepkg.sh.in | 2 +- 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 scripts/libmakepkg/util/dirsize.sh.in diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 88e9612d..63d09767 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -127,6 +127,7 @@ LIBMAKEPKG_IN = \ libmakepkg/util.sh \ libmakepkg/util/compress.sh \ libmakepkg/util/config.sh \ + libmakepkg/util/dirsize.sh \ libmakepkg/util/error.sh \ libmakepkg/util/message.sh \ libmakepkg/util/option.sh \ diff --git a/scripts/libmakepkg/util/dirsize.sh.in b/scripts/libmakepkg/util/dirsize.sh.in new file mode 100644 index 00000000..f9679e33 --- /dev/null +++ b/scripts/libmakepkg/util/dirsize.sh.in @@ -0,0 +1,45 @@ +#!/usr/bin/bash +# +# dirsize.sh - calculate size of all files in a directory +# +# Copyright (c) 2019 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[[ -n "$LIBMAKEPKG_UTIL_DIRSIZE_SH" ]] && return +LIBMAKEPKG_UTIL_DIRSIZE_SH=1 + +LIBRARY=${LIBRARY:-'/usr/share/makepkg'} + + +dirsize() { + local inode file size=0 + declare -A files + + while read -rd $'\0' file; do + size=$((size + $(wc -c < "$file"))) + done < <(find . -type f -links 1 -print0) + + # Size of unique hard-linked files + while read -rd ' ' inode; do + IFS= read -r file + if [[ -z "${files[$inode]}" ]]; then + files[$inode]=$(wc -c < "$file") + size=$((size + ${files[$inode]})) + fi + done < <(find . -type f -links +1 -exec @INODECMD@ -- {} + 2>/dev/null) + + echo $size +} diff --git a/scripts/libmakepkg/util/meson.build b/scripts/libmakepkg/util/meson.build index c29503b7..a160fd06 100644 --- a/scripts/libmakepkg/util/meson.build +++ b/scripts/libmakepkg/util/meson.build @@ -3,6 +3,7 @@ libmakepkg_module = 'util' sources = [ 'compress.sh.in', 'config.sh.in', + 'dirsize.sh.in', 'error.sh.in', 'message.sh.in', 'option.sh.in', diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 997c8668..e75031c2 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -584,7 +584,7 @@ write_kv_pair() { } write_pkginfo() { - local size="$(find . -type f -exec cat {} + 2>/dev/null | wc -c)" + local size=$(dirsize) merge_arch_attrs -- 2.23.0
participants (1)
-
Ronan Pigott