46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
"""Automatic config backup management."""
|
|
|
|
import re
|
|
import shutil
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
from nirimod import kdl_parser
|
|
|
|
def backup_all_sources(source_files: set[Path], limit: int = 10) -> Path | None:
|
|
if not source_files:
|
|
return None
|
|
|
|
kdl_parser.BACKUP_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
existing_gens = []
|
|
for p in kdl_parser.BACKUP_DIR.iterdir():
|
|
if p.is_dir():
|
|
m = re.match(r"^(?:\(Gen|v|gen)(\d+)", p.name, re.IGNORECASE)
|
|
if m:
|
|
existing_gens.append(int(m.group(1)))
|
|
next_gen = max(existing_gens) + 1 if existing_gens else 1
|
|
|
|
ts = datetime.now().strftime("%Y-%m-%d_%H-%M")
|
|
dest_dir = kdl_parser.BACKUP_DIR / f"(Gen{next_gen}){ts}"
|
|
dest_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
for src in sorted(source_files):
|
|
if not src.exists():
|
|
continue
|
|
try:
|
|
rel = src.relative_to(kdl_parser.NIRI_CONFIG.parent)
|
|
dest = dest_dir / rel
|
|
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
shutil.copy2(src, dest)
|
|
except ValueError:
|
|
shutil.copy2(src, dest_dir / src.name)
|
|
|
|
if limit > 0:
|
|
backups = sorted([p for p in kdl_parser.BACKUP_DIR.iterdir() if p.is_dir()], key=lambda p: p.stat().st_mtime)
|
|
while len(backups) > limit:
|
|
oldest = backups.pop(0)
|
|
shutil.rmtree(oldest)
|
|
|
|
return dest_dir
|