31 lines
1021 B
Python
31 lines
1021 B
Python
|
from __future__ import annotations
|
||
|
|
||
|
from pathlib import Path
|
||
|
|
||
|
from ..wheelfile import WheelFile
|
||
|
|
||
|
|
||
|
def unpack(path: str, dest: str = ".") -> None:
|
||
|
"""Unpack a wheel.
|
||
|
|
||
|
Wheel content will be unpacked to {dest}/{name}-{ver}, where {name}
|
||
|
is the package name and {ver} its version.
|
||
|
|
||
|
:param path: The path to the wheel.
|
||
|
:param dest: Destination directory (default to current directory).
|
||
|
"""
|
||
|
with WheelFile(path) as wf:
|
||
|
namever = wf.parsed_filename.group("namever")
|
||
|
destination = Path(dest) / namever
|
||
|
print(f"Unpacking to: {destination}...", end="", flush=True)
|
||
|
for zinfo in wf.filelist:
|
||
|
wf.extract(zinfo, destination)
|
||
|
|
||
|
# Set permissions to the same values as they were set in the archive
|
||
|
# We have to do this manually due to
|
||
|
# https://github.com/python/cpython/issues/59999
|
||
|
permissions = zinfo.external_attr >> 16 & 0o777
|
||
|
destination.joinpath(zinfo.filename).chmod(permissions)
|
||
|
|
||
|
print("OK")
|