ipkg-build: use deterministic timestamps in ipk tarballs

As a follow-up to r46026, this commit sets the modification
times of files inside the tarballs to deterministic values.
It uses the date of the last git or svn commit and falls
back to the old behavior if those are not available.

Signed-off-by: Reiner Herrmann <reiner@reiner-h.de>

SVN-Revision: 46360
This commit is contained in:
John Crispin 2015-07-14 09:57:19 +00:00
parent 5e1c7fb0cc
commit 3846bb9ac9

View file

@ -13,8 +13,19 @@ version=1.0
FIND="$(which find)" FIND="$(which find)"
FIND="${FIND:-$(which gfind)}" FIND="${FIND:-$(which gfind)}"
TAR="${TAR:-$(which tar)}" TAR="${TAR:-$(which tar)}"
SVN="$(which svn)"
GIT="$(which git)"
export GZIP="-n" export GZIP="-n"
# look up date of last commit
if [ -d "$TOPDIR/.git" ]; then
TIMESTAMP=$($GIT log -1 -s --format=%ci)
elif [ -d "$TOPDIR/.svn" ]; then
TIMESTAMP=$($SVN info "$TOPDIR" | sed -n "s/^Last Changed Date: \(.*\)/\1/p")
else
TIMESTAMP=$(date)
fi
ipkg_extract_value() { ipkg_extract_value() {
sed -e "s/^[^:]*:[[:space:]]*//" sed -e "s/^[^:]*:[[:space:]]*//"
} }
@ -128,20 +139,20 @@ mkdir $tmp_dir
echo $CONTROL > $tmp_dir/tarX echo $CONTROL > $tmp_dir/tarX
# Preserve permissions (-p) when creating data.tar.gz as non-root user # Preserve permissions (-p) when creating data.tar.gz as non-root user
( cd $pkg_dir && $TAR $ogargs -X $tmp_dir/tarX --format=gnu -czpf $tmp_dir/data.tar.gz . ) ( cd $pkg_dir && $TAR $ogargs -X $tmp_dir/tarX --format=gnu -czpf $tmp_dir/data.tar.gz --mtime="$TIMESTAMP" . )
installed_size=`stat -c "%s" $tmp_dir/data.tar.gz` installed_size=`stat -c "%s" $tmp_dir/data.tar.gz`
sed -i -e "s/^Installed-Size: .*/Installed-Size: $installed_size/" \ sed -i -e "s/^Installed-Size: .*/Installed-Size: $installed_size/" \
$pkg_dir/$CONTROL/control $pkg_dir/$CONTROL/control
( cd $pkg_dir/$CONTROL && $TAR $ogargs --format=gnu -czf $tmp_dir/control.tar.gz . ) ( cd $pkg_dir/$CONTROL && $TAR $ogargs --format=gnu -czf $tmp_dir/control.tar.gz --mtime="$TIMESTAMP" . )
rm $tmp_dir/tarX rm $tmp_dir/tarX
echo "2.0" > $tmp_dir/debian-binary echo "2.0" > $tmp_dir/debian-binary
pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk
rm -f $pkg_file rm -f $pkg_file
( cd $tmp_dir && $TAR --format=gnu -zcf $pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz ) ( cd $tmp_dir && $TAR --format=gnu -zcf $pkg_file --mtime="$TIMESTAMP" ./debian-binary ./data.tar.gz ./control.tar.gz )
rm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz rm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz
rmdir $tmp_dir rmdir $tmp_dir