summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2017-01-03 02:11:54 -0500
committerAllan McRae <allan@archlinux.org>2017-01-04 13:59:15 +1000
commit01a6502169f3e51ea52d60877528c5979898bbb3 (patch)
treed25bb754cc3d370d1bf89e6cfdc1dd64e26bad5f
parent9c3bf2988f565be66c57c6eee242e6f61e4921e4 (diff)
downloadpacman-01a6502169f3e51ea52d60877528c5979898bbb3.tar.gz
pacman-01a6502169f3e51ea52d60877528c5979898bbb3.zip
makepkg: sort package contents
By passing a NUL-separated filelist, this also fixes a bug where files that look like bsdtar options in the package root could break the package ("-C" was particularly troublesome because bsdtar interprets it as an option anywhere in the file list, even following "--"). Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r--scripts/makepkg.sh.in24
1 files changed, 12 insertions, 12 deletions
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 4bdccede..29408929 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -686,6 +686,15 @@ write_buildinfo() {
write_kv_pair "installed" "${pkglist[@]}"
}
+# build a sorted NUL-separated list of the full contents of the current
+# directory suitable for passing to `bsdtar --files-from`
+# database files are placed at the beginning of the package regardless of
+# sorting
+list_package_files() {
+ (find . -path './.*' \! -name '.'; find . \! -path './.*' \! -name '.' | LC_ALL=C sort) |
+ sed -e 's|^\./||' | tr '\n' '\0'
+}
+
create_package() {
(( NOARCHIVE )) && return
@@ -702,8 +711,6 @@ create_package() {
write_pkginfo > .PKGINFO
write_buildinfo > .BUILDINFO
- local comp_files=('.PKGINFO' '.BUILDINFO')
-
# check for changelog/install files
for i in 'changelog/.CHANGELOG' 'install/.INSTALL'; do
IFS='/' read -r orig dest < <(printf '%s\n' "$i")
@@ -715,7 +722,6 @@ create_package() {
exit 1
fi
chmod 644 "$dest"
- comp_files+=("$dest")
fi
done
@@ -727,15 +733,10 @@ create_package() {
[[ -f $pkg_file ]] && rm -f "$pkg_file"
[[ -f $pkg_file.sig ]] && rm -f "$pkg_file.sig"
- # when fileglobbing, we want * in an empty directory to expand to
- # the null string rather than itself
- shopt -s nullglob
-
msg2 "$(gettext "Generating .MTREE file...")"
- LANG=C bsdtar -czf .MTREE --format=mtree \
+ list_package_files | LANG=C bsdtar -cnzf .MTREE --format=mtree \
--options='!all,use-set,type,uid,gid,mode,time,size,md5,sha256,link' \
- "${comp_files[@]}" *
- comp_files+=(".MTREE")
+ --null --files-from - --exclude .MTREE
msg2 "$(gettext "Compressing package...")"
# TODO: Maybe this can be set globally for robustness
@@ -743,7 +744,7 @@ create_package() {
# bsdtar's gzip compression always saves the time stamp, making one
# archive created using the same command line distinct from another.
# Disable bsdtar compression and use gzip -n for now.
- LANG=C bsdtar -cf - "${comp_files[@]}" * |
+ list_package_files | LANG=C bsdtar -cnf - --null --files-from - |
case "$PKGEXT" in
*tar.gz) ${COMPRESSGZ[@]:-gzip -c -f -n} ;;
*tar.bz2) ${COMPRESSBZ2[@]:-bzip2 -c -f} ;;
@@ -756,7 +757,6 @@ create_package() {
"$PKGEXT"; cat ;;
esac > "${pkg_file}" || ret=$?
- shopt -u nullglob
shopt -u -o pipefail
if (( ret )); then