mirror of
https://github.com/Terranom674/Piwigo_Bratonien_Tools.git
synced 2026-09-19 11:44:31 +00:00
Make WebDAV shadow directories writable for runtime materialization
This commit is contained in:
@@ -12,6 +12,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
ALLOWED = frozenset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.")
|
ALLOWED = frozenset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.")
|
||||||
GERMAN = str.maketrans({"ä": "ae", "ö": "oe", "ü": "ue", "Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ß": "ss", "ẞ": "SS"})
|
GERMAN = str.maketrans({"ä": "ae", "ö": "oe", "ü": "ue", "Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ß": "ss", "ẞ": "SS"})
|
||||||
|
SHADOW_DIR_MODE = 0o777
|
||||||
|
|
||||||
|
|
||||||
def safe_name(name: str) -> str:
|
def safe_name(name: str) -> str:
|
||||||
@@ -79,8 +80,13 @@ def preferred_target(source_key: str, raw_name: str, parent_target: Path, old_ma
|
|||||||
return safe_name(raw_name)
|
return safe_name(raw_name)
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_shadow_directory(path: Path) -> None:
|
||||||
|
path.mkdir(parents=True, exist_ok=True)
|
||||||
|
path.chmod(SHADOW_DIR_MODE)
|
||||||
|
|
||||||
|
|
||||||
def mirror_directory(source: Path, target: Path, source_key: str, target_key: Path, old_map: dict[str, str], new_map: dict[str, str]) -> None:
|
def mirror_directory(source: Path, target: Path, source_key: str, target_key: Path, old_map: dict[str, str], new_map: dict[str, str]) -> None:
|
||||||
target.mkdir(parents=True, exist_ok=True)
|
ensure_shadow_directory(target)
|
||||||
used: set[str] = set()
|
used: set[str] = set()
|
||||||
for child in sorted(source.iterdir(), key=lambda item: (item.name.casefold(), item.name)):
|
for child in sorted(source.iterdir(), key=lambda item: (item.name.casefold(), item.name)):
|
||||||
if child.is_symlink():
|
if child.is_symlink():
|
||||||
@@ -116,7 +122,7 @@ def build(manifest: Path, destination: Path, state_file: Path) -> None:
|
|||||||
remove_tree(previous)
|
remove_tree(previous)
|
||||||
if state_staging.exists():
|
if state_staging.exists():
|
||||||
state_staging.unlink()
|
state_staging.unlink()
|
||||||
staging.mkdir(parents=True)
|
ensure_shadow_directory(staging)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
used_roots: set[str] = set()
|
used_roots: set[str] = set()
|
||||||
|
|||||||
Reference in New Issue
Block a user