[pacman-dev] [MAKEPKG][PATCH] makepkg-do-not-count-hard-links-multiple-times

la.luge at free.fr la.luge at free.fr
Sun Oct 27 12:26:17 UTC 2019


Uses stat -c '%i %s' and sort -u to count hardlink one time.
Gives same result than cat | wc -c without harlinks and good result with hardlinks.
Doesn't use filenames


>From cf4ef0333ccc6f080882ee9f3c27049be41bce67 Mon Sep 17 00:00:00 2001
From: nenesse <la.luge at free.fr>
Date: Sun, 27 Oct 2019 12:08:36 +0100
Subject: [PATCH] makepkg-do-not-count-hard-links-multiple-times. uses stat -c
 '%i %s' and sort -u to count hardlink one time. Gives same result than cat |
 wc -c without harlinks and good result with hardlinks. Doesn't use filenames
To: mailto:pacman-dev at archlinux.org

---
 configure.ac                          |  6 ++---
 scripts/libmakepkg/util/dirsize.sh.in | 35 +++++++++++++++++++++++++++
 scripts/makepkg.sh.in                 |  2 +-
 3 files changed, 39 insertions(+), 4 deletions(-)
 create mode 100644 scripts/libmakepkg/util/dirsize.sh.in

diff --git a/configure.ac b/configure.ac
index d68b3591..5d8f8747 100644
--- a/configure.ac
+++ b/configure.ac
@@ -370,18 +370,18 @@ GCC_VISIBILITY_CC
 
 # Host-dependant definitions
 DEFAULT_SEDINPLACEFLAGS=" --follow-symlinks -i"
-INODECMD="stat -c '%i %n'"
+INODECMD="stat -c '%i %s'"
 STRIP_BINARIES="--strip-all"
 STRIP_SHARED="--strip-unneeded"
 STRIP_STATIC="--strip-debug"
 case "${host_os}" in
 	*bsd*)
-		INODECMD="stat -f '%i %N'"
+		INODECMD="stat -f '%i %z'"
 		DEFAULT_SEDINPLACEFLAGS=" -i \"\""
 		;;
 	darwin*)
 		host_os_darwin=yes
-		INODECMD="/usr/bin/stat -f '%i %N'"
+		INODECMD="/usr/bin/stat -f '%i %z'"
 		DEFAULT_SEDINPLACEFLAGS=" -i ''"
 		STRIP_BINARIES=""
 		STRIP_SHARED="-S"
diff --git a/scripts/libmakepkg/util/dirsize.sh.in b/scripts/libmakepkg/util/dirsize.sh.in
new file mode 100644
index 00000000..a0bd2b3f
--- /dev/null
+++ b/scripts/libmakepkg/util/dirsize.sh.in
@@ -0,0 +1,35 @@
+#!/usr/bin/bash
+#
+#   dirsize.sh - calculate size of all files in a directory
+#
+#   Copyright (c) 2019 Pacman Development Team <pacman-dev at 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 size=0 sz _
+
+	while read _ sz; do
+		size=$(( size + sz ))
+	done < <(find . -type f -exec @INODECMD@ '{}' + 2>/dev/null|sort -u)
+
+	echo $size
+}
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 997c8668..f7a9459b 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


More information about the pacman-dev mailing list