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