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@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