From ee5bc44e2b83410f293cf2e414b77efc33910117 Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Sat, 26 Oct 2019 21:08:54 +1000 Subject: [PATCH] makepkg: do not count hard links multiple times when calculating pkg size Keeps track of file inodes that we have already counted using the same strategy as we do for zipman. Still uses "cat | wc -c" to calculate file sizes as it is the only thing guaranteed to be consistent. Signed-off-by: Allan McRae --- scripts/Makefile.am | 1 + scripts/libmakepkg/util/dirsize.sh.in | 39 +++++++++++++++++++++++++++ scripts/libmakepkg/util/meson.build | 1 + scripts/makepkg.sh.in | 2 +- 4 files changed, 42 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..ba0783ca --- /dev/null +++ b/scripts/libmakepkg/util/dirsize.sh.in @@ -0,0 +1,39 @@ +#!/usr/bin/bash +# +# dirsize.sh - calculate size of all files in a directory +# +# Copyright (c) 2019 Pacman Development Team +# +# 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 . +# + +[[ -n "$LIBMAKEPKG_UTIL_DIRSIZE_SH" ]] && return +LIBMAKEPKG_UTIL_DIRSIZE_SH=1 + +LIBRARY=${LIBRARY:-'/usr/share/makepkg'} + + +dirsize() { + local size=0 s file files inode + + while read -rd ' ' inode; do + read file + if [[ -z ${files[$inode]} ]]; then + files[$inode]=$file + size=$(( size + $(cat $file | wc -c) )) + fi + done < <(find . -type f -exec @INODECMD@ '{}' + 2>/dev/null) + + echo $size +} diff --git a/scripts/libmakepkg/util/meson.build b/scripts/libmakepkg/util/meson.build index c29503b7..6160d87e 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