add support for zstd compressed deb package.

Debian/Ubuntu has moved to zstd compress by default.
dpkg has come with zstd support since 1.21.18 but UOS got 1.19.7.
This commit adds support for unpacking zstd compressed without using dpkg but the other utils.

Signed-off-by: Shiroko <hhx.xxm@gmail.com>
This commit is contained in:
Shiroko
2023-10-23 09:00:32 +00:00
committed by Gitee
parent add8fc89e4
commit e0eadf2c8b

View File

@@ -1,15 +1,43 @@
#/bin/bash
#!/bin/bash
TMPDIR="/tmp"
unpack_package() {
DEBPATH="$1"
package_name=$(dpkg-deb -f "$DEBPATH" Package)
ABS_DEBPATH="$(readlink -f "$DEBPATH")"
OUTPATH=$(dirname "$DEBPATH")
mkdir -p "$OUTPATH/$package_name/DEBIAN/"
dpkg -e "$DEBPATH" "$OUTPATH/$package_name/DEBIAN/"
dpkg -X "$DEBPATH" "$OUTPATH/$package_name/"
ABS_OUTPATH="$(readlink -f "$OUTPATH")"
local fields=$(LC_ALL=C dpkg -f "$DEBPATH" 2>&1)
if [[ "$(echo "$fields" | wc -l)" == 1 ]] && [[ "$fields" =~ "tar.zst" ]]; then
local tempd=$(mktemp -d)
[[ ! -d "$tempd" ]] && exit -1
pushd "$tempd"
ar x "$ABS_DEBPATH" control.tar.zst
ar x "$ABS_DEBPATH" data.tar.zst
mkdir DEBIAN
[ -f control.tar.zst ] && tar --use-compress-program=unzstd -xvf control.tar.zst -C DEBIAN
local package_name="$(grep Package DEBIAN/control | sed 's/^Package: //g')"
mkdir -p "$ABS_OUTPATH/$package_name/"
mv DEBIAN "$ABS_OUTPATH/$package_name/"
mv data.tar.zst "$ABS_OUTPATH/$package_name"
popd
rm -rf "$tempd"
pushd "$OUTPATH/$package_name/"
[[ -f data.tar.zst ]] && tar --use-compress-program=unzstd -xvf data.tar.zst
rm -f data.tar.zst
popd
else
package_name=$(dpkg-deb -f "$DEBPATH" Package)
mkdir -p "$OUTPATH/$package_name/DEBIAN/"
dpkg -e "$DEBPATH" "$OUTPATH/$package_name/DEBIAN/"
dpkg -X "$DEBPATH" "$OUTPATH/$package_name/"
fi
notify-send "$package_name 解包已完成" -i /usr/share/icons/uos-packaging-tools.png
echo "---------------------------------------------------------------------------"
}