riju/tools/ensure-deb-compressed.bash

77 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
: ${L} ${T}
deb="build/${T}/${L}/riju-${T}-${L}.deb"
tmp="build/${T}/${L}/ar-tmp"
rm -rf "${tmp}"
files="$(ar t "${deb}" | grep -F .tar | grep -Fv .xz || true)"
if [[ -z "${files}" ]]; then
exit 0
fi
du -sh "${deb}"
echo >&2 "found files in ${deb} needing recompression:"
echo "${files}" | sed >&2 's/^/ /'
echo >&2 "extracting ${deb} to ${tmp}..."
mkdir -p "${tmp}"
ar xv "${deb}" --output "${tmp}" | sed >&2 's/^/ /'
echo >&2 "recompressing extracted files..."
processed_files=()
while read file; do
if echo "${file}" | grep -F .tar | grep -Fvq .xz; then
ext="$(echo "${file}" | sed -E 's/^.+\.tar//')"
case "${ext}" in
"")
echo >&2 " ${file} => ${file}.xz"
xz "${tmp}/${file}"
processed_files=("${processed_files[@]}" "${file}.xz")
;;
".gz")
echo >&2 " ${file} => ${file%.gz}.xz"
gunzip "${tmp}/${file}" -c | xz - > "${tmp}/${file%.gz}"
rm "${tmp}/${file}"
processed_files=("${processed_files[@]}" "${file%.gz}")
;;
*)
echo >&2 " !! unknown file extension in ${file}"
exit 1
;;
esac
else
processed_files=("${processed_files[@]}" "${file}")
fi
done < <(ar t "${deb}")
# NB we need to keep track of the processed_files array because the
# order needs to be preserved, surprisingly enough:
# https://ubuntuforums.org/archive/index.php/t-1481153.html
echo >&2 "recreating archive at ${deb}.tmp..."
pushd "${tmp}" >/dev/null
ar rcv "../$(basename "${deb}").tmp" "${processed_files[@]}" | sed 's/^/ /'
popd >/dev/null
echo >&2 "cleaning up ${tmp}..."
rm -rf "${tmp}"
echo >&2 "renaming ${deb}.tmp => ${deb}..."
mv "${deb}.tmp" "${deb}"
files="$(ar t "${deb}" | grep -F .tar | grep -Fv .xz || true)"
if [[ -n "${files}" ]]; then
echo >&2 "error: still found files in ${deb} needing recompression:"
echo "${files}" | sed >&2 's/^/ /'
exit 1
fi