Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions pydpkg/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import lzma
import os
import tarfile
import zstandard

from collections import defaultdict
from gzip import GzipFile
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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.')
Expand All @@ -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)
Expand Down