From fab1e2c2c29719660301e6b2b4f2957094a0f8fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yunusemre=20=C5=9Eent=C3=BCrk?= Date: Fri, 22 Jul 2022 00:35:01 +0300 Subject: [PATCH] Add support for zst control archive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Yunusemre Şentürk --- pydpkg/__init__.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/pydpkg/__init__.py b/pydpkg/__init__.py index ea7e37f..91b02ba 100644 --- a/pydpkg/__init__.py +++ b/pydpkg/__init__.py @@ -12,6 +12,7 @@ import lzma import os import tarfile +import zstandard from collections import defaultdict from gzip import GzipFile @@ -41,11 +42,11 @@ class DpkgVersionError(DpkgError): class DpkgMissingControlFile(DpkgError): - """No control file found in control.tar.gz/xz""" + """No control file found in control.tar.gz/xz/zst""" class DpkgMissingControlGzipFile(DpkgError): - """No control.tar.gz/xz file found in dpkg file""" + """No control.tar.gz/xz/zst file found in dpkg file""" class DpkgMissingRequiredHeaderError(DpkgError): @@ -308,6 +309,9 @@ def _process_dpkg_file(self, filename): elif b'control.tar.xz' in dpkg_archive.archived_files: control_archive = dpkg_archive.archived_files[b'control.tar.xz'] control_archive_type = "xz" + elif b'control.tar.zst' in dpkg_archive.archived_files: + control_archive = dpkg_archive.archived_files[b'control.tar.zst'] + control_archive_type = "zst" else: raise DpkgMissingControlGzipFile( 'Corrupt dpkg file: no control.tar.gz/xz file in ar archive.') @@ -319,6 +323,13 @@ def _process_dpkg_file(self, filename): with tarfile.open(fileobj=io.BytesIO(gzf.read())) as ctar: self._log.debug('opened tar file: %s', ctar) message = self._extract_message(ctar) + elif control_archive_type == "zst": + decomp = zstandard.ZstdDecompressor() + zst = decomp.stream_reader(control_archive) + self._log.debug("opened zst control archive: %s", zst) + with tarfile.open(fileobj=io.BytesIO(zst.read())) as ctar: + self._log.debug("opened tar file: %s", ctar) + message = self._extract_message(ctar) else: with lzma.open(control_archive) as xzf: self._log.debug('opened xz control archive: %s', xzf)