Source code for ewoksxrpd.tasks.utils.zip_utils
import io
import os
import zipfile
from contextlib import contextmanager
from datetime import datetime
from pathlib import Path
from typing import Generator
from typing import Union
[docs]
@contextmanager
def open_in_zipfile(
zipf: zipfile.ZipFile, filename: Union[str, Path], **kwargs
) -> Generator[io.BufferedIOBase, None, None]:
"""Same as `zipfile.ZipFile.open` but with a fixed `name` argument that
ensures the file timestamp and permissions would be equivalent as with
python's `open` function when creating a file.
"""
filename = str(filename).replace("\\", "/")
info = zipfile.ZipInfo(filename)
info.date_time = datetime.now().timetuple()[:6]
current_umask = os.umask(0)
os.umask(current_umask)
file_permissions = 0o666 & ~current_umask
info.external_attr = file_permissions << 16
with zipf.open(info, **kwargs) as zipio:
yield zipio