[PATCH] makepkg: use bsdtar --no-read-sparse for archive creation if available

Allan McRae allan at archlinux.org
Thu Mar 10 23:44:17 UTC 2022


On 11/3/22 01:38, Jonas Witschel wrote:
> bsdtar uses the "pax" TAR archive format by default, which has support for
> storing sparse file information in the archive. Unfortunately this is a source
> of unreproducibility because the sparse encoding is taken from the file system
> and different file systems handle sparse files differently: some file systems
> have no support for sparsely encoded files at all, and even file systems with
> sparse file support can report different file information for identical files
> due to differing implementations.
> 
> As a real world example where this happens, consider the Arch Linux package
> "brotli-testdata 1.0.9-7", which contains a sparsely encoded all-zeros file
> "usr/share/brotli/testdata/zeros". Building this package on a btrfs file system
> yields a different package than building it on tmpfs or ext4 solely due to
> different sparse file information that gets recorded in the package tarball.
> 
> To improve the reproducibility of archives containing sparsely encoded files,
> libarchive version 3.6.0 introduces a new --no-read-sparse option. This skips
> reading sparse file information from disk entirely and therefore stores files
> "expanded" in the archive, which is the only way to make them reliably
> reproducible across file systems.
> 
> makepkg will use this option if libarchive is recent enough to support it,
> which is detected at build time.
> ---


LGTM.  Thanks.

A

>   build-aux/edit-script.sh.in | 1 +
>   meson.build                 | 6 ++++++
>   scripts/makepkg.sh.in       | 4 ++--
>   3 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/build-aux/edit-script.sh.in b/build-aux/edit-script.sh.in
> index 85c56cfe..992033b2 100644
> --- a/build-aux/edit-script.sh.in
> +++ b/build-aux/edit-script.sh.in
> @@ -20,6 +20,7 @@ sed \
>     -e "s|@DEBUGSUFFIX[@]|@DEBUGSUFFIX@|g" \
>     -e "s|@INODECMD[@]|@INODECMD@|g" \
>     -e "s|@FILECMD[@]|@FILECMD@|g" \
> +  -e "s|@BSDTAR_NO_READ_SPARSE[@]|@BSDTAR_NO_READ_SPARSE@|g" \
>     "$input" >"$output"
>   
>   if [[ $mode ]]; then
> diff --git a/meson.build b/meson.build
> index b7cca865..1519a2bb 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -91,6 +91,11 @@ endif
>   libarchive = dependency('libarchive',
>                           version : '>=3.0.0',
>                           static : get_option('buildstatic'))
> +if libarchive.version().version_compare('>=3.6.0')
> +  bsdtar_no_read_sparse = '--no-read-sparse'
> +else
> +  bsdtar_no_read_sparse = ''
> +endif
>   
>   libcurl = dependency('libcurl',
>                        version : '>=7.55.0',
> @@ -274,6 +279,7 @@ substs.set('LIBMAKEPKGDIR', LIBMAKEPKGDIR)
>   substs.set('STRIP_BINARIES', strip_binaries)
>   substs.set('STRIP_SHARED', strip_shared)
>   substs.set('STRIP_STATIC', strip_static)
> +substs.set('BSDTAR_NO_READ_SPARSE', bsdtar_no_read_sparse)
>   
>   subdir('lib/libalpm')
>   subdir('src/common')
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index 5aaabf63..69757d03 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -616,7 +616,7 @@ create_package() {
>   	msg2 "$(gettext "Compressing package...")"
>   	# TODO: Maybe this can be set globally for robustness
>   	shopt -s -o pipefail
> -	list_package_files | LANG=C bsdtar --no-fflags -cnf - --null --files-from - |
> +	list_package_files | LANG=C bsdtar --no-fflags @BSDTAR_NO_READ_SPARSE@ -cnf - --null --files-from - |
>   		compress_as "$PKGEXT" > "${pkg_file}" || ret=$?
>   
>   	shopt -u -o pipefail
> @@ -714,7 +714,7 @@ create_srcpackage() {
>   
>   	# TODO: Maybe this can be set globally for robustness
>   	shopt -s -o pipefail
> -	LANG=C bsdtar --no-fflags -cLf - ${pkgbase} | compress_as "$SRCEXT" > "${pkg_file}" || ret=$?
> +	LANG=C bsdtar --no-fflags @BSDTAR_NO_READ_SPARSE@ -cLf - ${pkgbase} | compress_as "$SRCEXT" > "${pkg_file}" || ret=$?
>   
>   	shopt -u -o pipefail
>   



More information about the pacman-dev mailing list