diff mbox

[pacman-dev] Replace @SIZECMD@ with POSIX-compatible command

Message ID 20170320025500.GA17043@homura
State Accepted, archived
Headers show

Commit Message

Drew DeVault March 20, 2017, 2:55 a.m. UTC
Now uses wc -c $file | cut -d' ' -f1, which works using only POSIX
commands and removes the need for any platform-specific usages.

Signed-off-by: Drew DeVault <sir@cmpwn.com>
---
 configure.ac           | 5 -----
 scripts/pkgdelta.sh.in | 4 ++--
 scripts/repo-add.sh.in | 6 +++---
 3 files changed, 5 insertions(+), 10 deletions(-)

Comments

Allan McRae March 20, 2017, 5:19 a.m. UTC | #1
On 20/03/17 12:55, Drew DeVault wrote:
> Now uses wc -c $file | cut -d' ' -f1, which works using only POSIX
> commands and removes the need for any platform-specific usages.
> 

I'm sure we had this in the past and changed to what we have currently.
 Can't remember why...   compressing filesystems maybe?

A
Mike Swanson March 25, 2017, 12:26 a.m. UTC | #2
On Mon, 2017-03-20 at 15:19 +1000, Allan McRae wrote:
> On 20/03/17 12:55, Drew DeVault wrote:
> > Now uses wc -c $file | cut -d' ' -f1, which works using only POSIX
> > commands and removes the need for any platform-specific usages.
> > 
> 
> I'm sure we had this in the past and changed to what we have
> currently.
>  Can't remember why...   compressing filesystems maybe?
> 
> A

`wc -c` always shows the true size of a file -- that is, the number of
bytes of information it contains, not a multiple of the block size.  The
compressed size can only be calculated by looking at the number of
blocks allocated.  This command is safe for all compressing/sparse-
supporting file systems.
Allan McRae April 4, 2017, 2:20 a.m. UTC | #3
On 25/03/17 10:26, Mike Swanson wrote:
> On Mon, 2017-03-20 at 15:19 +1000, Allan McRae wrote:
>> On 20/03/17 12:55, Drew DeVault wrote:
>>> Now uses wc -c $file | cut -d' ' -f1, which works using only POSIX
>>> commands and removes the need for any platform-specific usages.
>>>
>>
>> I'm sure we had this in the past and changed to what we have
>> currently.
>>  Can't remember why...   compressing filesystems maybe?
>>
>> A
> 
> `wc -c` always shows the true size of a file -- that is, the number of
> bytes of information it contains, not a multiple of the block size.  The
> compressed size can only be calculated by looking at the number of
> blocks allocated.  This command is safe for all compressing/sparse-
> supporting file systems.
> 

I have more time now so looked into the history of this.  I submitted a
patch to do this in makepkg for calculating file sizes.  We moved away
from this to using something like "du -sk  --apparent-size $pkgdir"
instead.  That is only used for displaying installed sizes so does not
need to be byte level accurate.

I am fine to include this change to reduce cross platform complexity.

A
diff mbox

Patch

diff --git a/configure.ac b/configure.ac
index 825b29b9..ab8f53df 100644
--- a/configure.ac
+++ b/configure.ac
@@ -348,7 +348,6 @@  DEFAULT_DUFLAGS=" -sk --apparent-size"
 INODECMD="stat -c '%i %n'"
 OWNERCMD="stat -c '%u:%g'"
 MODECMD="stat -c '%a'"
-SIZECMD="stat -c %s"
 SEDINPLACE="sed --follow-symlinks -i"
 STRIP_BINARIES="--strip-all"
 STRIP_SHARED="--strip-unneeded"
@@ -358,7 +357,6 @@  case "${host_os}" in
 		INODECMD="stat -f '%i %N'"
 		OWNERCMD="stat -f '%u:%g'"
 		MODECMD="stat -f '%Lp'"
-		SIZECMD="stat -f %z"
 		SEDINPLACE="sed -i \"\""
 		DEFAULT_DUFLAGS=" -sk"
 		;;
@@ -367,7 +365,6 @@  case "${host_os}" in
 		INODECMD="/usr/bin/stat -f '%i %N'"
 		OWNERCMD="/usr/bin/stat -f '%u:%g'"
 		MODECMD="/usr/bin/stat -f '%Lp'"
-		SIZECMD="/usr/bin/stat -f %z"
 		SEDINPLACE="/usr/bin/sed -i ''"
 		DEFAULT_DUFLAGS=" -sk"
 		STRIP_BINARIES=""
@@ -380,7 +377,6 @@  AC_PATH_PROGS([DUPATH], [du], [du], [/usr/bin$PATH_SEPARATOR/bin] )
 AC_SUBST(INODECMD)
 AC_SUBST(OWNERCMD)
 AC_SUBST(MODECMD)
-AC_SUBST(SIZECMD)
 AC_SUBST(SEDINPLACE)
 AC_SUBST(STRIP_BINARIES)
 AC_SUBST(STRIP_SHARED)
@@ -570,7 +566,6 @@  ${PACKAGE_NAME}:
     File inode command     : ${INODECMD}
     File owner command     : ${OWNERCMD}
     File mode command      : ${MODECMD}
-    Filesize command       : ${SIZECMD}
     In-place sed command   : ${SEDINPLACE}
 
     libalpm version        : ${LIB_VERSION}
diff --git a/scripts/pkgdelta.sh.in b/scripts/pkgdelta.sh.in
index 9f87185b..4500dd75 100644
--- a/scripts/pkgdelta.sh.in
+++ b/scripts/pkgdelta.sh.in
@@ -119,7 +119,7 @@  create_xdelta()
 	newver="$pkgver"
 	newarch="$arch"
 
-	pkgsize="$(@SIZECMD@ -L "$newfile")"
+	pkgsize="$(wc -c "$newfile" | cut -d' ' -f1)"
 
 	if ((pkgsize < min_pkg_size)); then
 		msg "$(gettext "Skipping delta creation for small package: %s - size %s")" "$newname" "$pkgsize"
@@ -151,7 +151,7 @@  create_xdelta()
 		return 1
 	fi
 
-	deltasize="$(@SIZECMD@ -L "$deltafile")"
+	deltasize="$(wc -c "$deltafile" | cut -d' ' -f1)"
 
 	if ((max_delta_size * pkgsize / 100 < deltasize)); then
 		msg "$(gettext "Delta package larger than maximum size. Removing.")"
diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in
index 6333f6a2..68edbf4b 100644
--- a/scripts/repo-add.sh.in
+++ b/scripts/repo-add.sh.in
@@ -153,7 +153,7 @@  db_write_delta() {
 	# get md5sum and compressed size of package
 	md5sum=$(md5sum "$deltafile")
 	md5sum=${md5sum%% *}
-	csize=$(@SIZECMD@ -L "$deltafile")
+	csize=$(wc -c "$deltafile" | cut -d' ' -f1)
 
 	oldfile=$(xdelta3 printhdr "$deltafile" | grep "XDELTA filename (source)" | sed 's/.*: *//')
 	newfile=$(xdelta3 printhdr "$deltafile" | grep "XDELTA filename (output)" | sed 's/.*: *//')
@@ -368,7 +368,7 @@  db_write_entry() {
 			error "$(gettext "Cannot use armored signatures for packages: %s")" "$pkgfile.sig"
 			return 1
 		fi
-		pgpsigsize=$(@SIZECMD@ -L "$pkgfile.sig")
+		pgpsigsize=$(wc -c "$pkgfile.sig" | cut -d' ' -f1)
 		if (( pgpsigsize > 16384 )); then
 			error "$(gettext "Invalid package signature file '%s'.")" "$pkgfile.sig"
 			return 1
@@ -377,7 +377,7 @@  db_write_entry() {
 		pgpsig=$(base64 "$pkgfile.sig" | tr -d '\n')
 	fi
 
-	csize=$(@SIZECMD@ -L "$pkgfile")
+	csize=$(wc -c "$pkgfile" | cut -d' ' -f1)
 
 	# compute checksums
 	msg2 "$(gettext "Computing checksums...")"