dist: add reproducible dir entries to tarballs

In the initial implementation of reproducible tarballs, they were
missing directory entries, while .zip archives had them. It meant
that on extracting the tarball, on-disk directory entries got the
current timestamp.

This patch fixes this by including directory entries in the tarball,
with reproducible timestamps. It also moves sorting inside tar,
to ensure reproducible directory entry timestamps on extract
(without the need of `--delay-directory-restore` option, when
extracting with GNU tar. BSD tar got that right by default.)

GNU tar 1.28 (2014-07-28) introduced `--sort=`.

Ref: https://github.com/curl/curl/pull/13299#discussion_r1555957350
Follow-up to 860cd5fc2dc8e165fadd2c19a9b7c73b3ae5069d #13299
Closes #13322
This commit is contained in:
Viktor Szakats 2024-04-09 06:46:35 +00:00
parent 3210101088
commit b6a4f9aa1e
No known key found for this signature in database
GPG Key ID: B5ABD165E2AEF201

View File

@ -185,8 +185,8 @@ retar() {
mkdir "$tempdir"
cd "$tempdir"
gzip -dc "../$targz" | tar -xf -
find curl-* -type f -exec touch -c -t "$filestamp" '{}' +
find curl-* -type f | sort | tar --create --format=ustar --owner=0 --group=0 --numeric-owner --files-from - | gzip --best --no-name > out.tar.gz
find curl-* -depth -exec touch -c -t "$filestamp" '{}' +
tar --create --format=ustar --owner=0 --group=0 --numeric-owner --sort=name curl-* | gzip --best --no-name > out.tar.gz
mv out.tar.gz ../
cd ..
rm -rf "$tempdir"
@ -223,7 +223,6 @@ makezip() {
mkdir "$tempdir"
cd "$tempdir"
gzip -dc "../$targz" | tar -xf -
find . -depth -type d -exec touch -c -t "$filestamp" '{}' +
find . | sort | zip -9 -X "$zip" -@ >/dev/null
mv "$zip" ../
cd ..