fix: use custom copy function to ignore extended attributes

This commit is contained in:
Robert Kaussow 2024-02-14 16:15:17 +01:00
parent 4b424d5e7c
commit dd6af2416a
Signed by: xoxys
GPG Key ID: 4E692A2EAECC03C0
3 changed files with 38 additions and 1 deletions

View File

@ -14,6 +14,7 @@ import git
from gitbatch import __version__
from gitbatch.logging import SingleLog
from gitbatch.utils import normalize_path, to_bool
from gitbatch.utils.copy import copy_file_with_basic_stats
class GitBatch:
@ -135,6 +136,7 @@ class GitBatch:
repo["dest"],
ignore=shutil.ignore_patterns(".git"),
dirs_exist_ok=self.config["ignore_existing"],
copy_function=copy_file_with_basic_stats,
)
except FileExistsError:
self._file_exist_handler()

View File

@ -1,4 +1,3 @@
#!/usr/bin/env python3
"""Global utility methods and classes."""
import os

36
gitbatch/utils/copy.py Normal file
View File

@ -0,0 +1,36 @@
"""Copy file utils."""
import shutil
from os import utime
from pathlib import Path
def _coerce_to_path(source, dest):
return Path(source).resolve(), Path(dest).resolve()
def copy_basic_file_stats(source, dest):
"""
Copy only the m_time and a_time attributes from source to destination.
Both are expected to exist. The extended attribute copy has sideeffects
with SELinux and files copied from temporary directories and copystat
doesn't allow disabling these copies.
"""
source, dest = _coerce_to_path(source, dest)
src_stat = source.stat()
utime(dest, ns=(src_stat.st_atime_ns, src_stat.st_mtime_ns))
def copy_file_with_basic_stats(source, dest):
"""
Simplified copy2 to copy extended file attributes.
Only the access time and modified times are copied as
extended attribute copy has sideeffects with SELinux and files
copied from temporary directories.
"""
source, dest = _coerce_to_path(source, dest)
shutil.copy(source, dest)
copy_basic_file_stats(source, dest)