move casync release creation to use a tarball of files (#32089)
* tar archive instead
* fix
* move this here
* migrate these
* fix this
* update readme
* fix that
* try to build nightly
* Revert "try to build nightly"
This reverts commit 4ea680cb6a
.
* caexclude is no longer required
* finish up
* sorted
* need this
* and that
* context mnager
* path based
pull/32110/head
parent
d7ea27cbdd
commit
69982d43cd
8 changed files with 221 additions and 31 deletions
@ -0,0 +1,38 @@ |
|||||||
|
import pathlib |
||||||
|
import tarfile |
||||||
|
from typing import IO, Callable |
||||||
|
|
||||||
|
|
||||||
|
def include_default(_) -> bool: |
||||||
|
return True |
||||||
|
|
||||||
|
|
||||||
|
def create_tar_archive(filename: pathlib.Path, directory: pathlib.Path, include: Callable[[pathlib.Path], bool] = include_default): |
||||||
|
"""Creates a tar archive of a directory""" |
||||||
|
|
||||||
|
with tarfile.open(filename, 'w') as tar: |
||||||
|
for file in sorted(directory.rglob("*"), key=lambda f: f.stat().st_size if f.is_file() else 0, reverse=True): |
||||||
|
if not include(file): |
||||||
|
continue |
||||||
|
relative_path = str(file.relative_to(directory)) |
||||||
|
if file.is_symlink(): |
||||||
|
info = tarfile.TarInfo(relative_path) |
||||||
|
info.type = tarfile.SYMTYPE |
||||||
|
info.linkpath = str(file.readlink()) |
||||||
|
tar.addfile(info) |
||||||
|
|
||||||
|
elif file.is_file(): |
||||||
|
info = tarfile.TarInfo(relative_path) |
||||||
|
info.size = file.stat().st_size |
||||||
|
info.type = tarfile.REGTYPE |
||||||
|
with file.open('rb') as f: |
||||||
|
tar.addfile(info, f) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def extract_tar_archive(fh: IO[bytes], directory: pathlib.Path): |
||||||
|
"""Extracts a tar archive to a directory""" |
||||||
|
|
||||||
|
tar = tarfile.open(fileobj=fh, mode='r') |
||||||
|
tar.extractall(str(directory), filter=lambda info, path: info) |
||||||
|
tar.close() |
Loading…
Reference in new issue