[pacman-dev] [PATCH 1/2] Revert "makepkg: calculate exact total file size"

Dave Reisner d at falconindy.com
Wed Mar 14 16:41:10 EDT 2012


btrfs's cow snapshots seem to do very strange things, causing du to not
count data still in filesystem buffers. Repackaging the same build of
handbrake within a chroot on brynhild, I witnessed (via bash xtrace) du
reporting a different $pkgdir size every time the write_pkginfo()
function ran.

Unfortunately, replacing du with stat has its own slew of problems,
mostly due to hard links (e.g. git, with 106 hardlinks to the same
file). Working around this is neither fun, nor practical.

As it turns out, all we needed here all along was a simple call to sync
to flush writes to disk before calling du.

This reverts commit b264fb9e9ddcc31dc8782390309421965e507383.

Signed-off-by: Dave Reisner <dreisner at archlinux.org>
---
 configure.ac          |    1 +
 scripts/Makefile.am   |    1 +
 scripts/makepkg.sh.in |    7 ++++++-
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index 12a6e65..52f8ad4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -282,6 +282,7 @@ esac
 
 AM_CONDITIONAL([CYGWIN], test "x$host_os_cygwin" = "xyes")
 AM_CONDITIONAL([DARWIN], test "x$host_os_darwin" = "xyes")
+AC_PATH_PROGS([DUPATH], [du], [du], [/usr/bin$PATH_SEPARATOR/bin] )
 AC_SUBST(SIZECMD)
 AC_SUBST(SEDINPLACE)
 AC_SUBST(STRIP_BINARIES)
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index 727de25..328fbff 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -53,6 +53,7 @@ edit = sed \
 	-e 's|@BUILDSCRIPT[@]|$(BUILDSCRIPT)|g' \
 	-e 's|@SIZECMD[@]|$(SIZECMD)|g' \
 	-e 's|@SEDINPLACE[@]|$(SEDINPLACE)|g' \
+	-e 's|@DUPATH[@]|$(DUPATH)|g' \
 	-e 's|@SCRIPTNAME[@]|$@|g' \
 	-e 's|@configure_input[@]|Generated from $@.sh.in; do not edit by hand.|g'
 
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 89cd118..c2941b2 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -1156,7 +1156,8 @@ write_pkginfo() {
 	else
 		local packager="Unknown Packager"
 	fi
-	local size="$(find . -print0 | xargs -0 @SIZECMD@ | awk '{ sum += $1 } END { print sum }')"
+	local size="$(@DUPATH@ -sk)"
+	size="$(( ${size%%[^0-9]*} * 1024 ))"
 
 	msg2 "$(gettext "Generating %s file...")" ".PKGINFO"
 	echo "# Generated by makepkg $myver"
@@ -1264,6 +1265,10 @@ create_package() {
 		PKGARCH=$CARCH
 	fi
 
+	# flush buffers to disk. This avoids problems with du calculating the wrong
+	# installed package size, particularly on btrfs CoW snapshots.
+	sync
+
 	write_pkginfo $nameofpkg > .PKGINFO
 
 	local comp_files=('.PKGINFO')
-- 
1.7.9.4



More information about the pacman-dev mailing list