From e0eadf2c8b8d22cdcc1a977fbc23b77f42108617 Mon Sep 17 00:00:00 2001 From: Shiroko Date: Mon, 23 Oct 2023 09:00:32 +0000 Subject: [PATCH] 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 --- src/opt/uos-packaging-tools/just-X-me | 40 +++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/opt/uos-packaging-tools/just-X-me b/src/opt/uos-packaging-tools/just-X-me index 0febf1e..ce12124 100755 --- a/src/opt/uos-packaging-tools/just-X-me +++ b/src/opt/uos-packaging-tools/just-X-me @@ -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 "---------------------------------------------------------------------------" }