- .claude/agents/planer.md - .claude/agents/quorum-stimme.md - .claude/skills/bookstack-upload/SKILL.md - .claude/skills/bookstack-upload/scripts/bookstack/archiv.py - .claude/skills/bookstack-upload/scripts/bookstack/auswahl.py - .claude/skills/bookstack-upload/scripts/bookstack/beschreibung.py - .claude/skills/bookstack-upload/scripts/bookstack/bilder.py - .claude/skills/bookstack-upload/scripts/bookstack/ergebnis.py - .claude/skills/bookstack-upload/scripts/bookstack/hochladen.py - .claude/skills/bookstack-upload/scripts/bookstack/konvertierung.py - .claude/skills/bookstack-upload/scripts/bookstack/struktur.py - .claude/skills/bookstack-upload/scripts/bookstack/verweise.py - … und 33 weitere Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py. Co-Authored-By: Claude Opus 5 <[email protected]>
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
"""Verschiebt bereits hochgeladene Notizen aus dem aktiven Bereich in ein Archiv.
|
|
|
|
Ersteller: Pascal Michel
|
|
Erstellt: 2026-08-11
|
|
Doku: docs/code/archiv.md · Version und Änderungen: CHANGELOG.md
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
ARCHIV_ORDNERNAME = "nicht hochladen - ARCHIV"
|
|
|
|
|
|
def ist_archiviert(pfad: Path, quelle: Path) -> bool:
|
|
"""True, wenn der Pfad bereits unterhalb des Archiv-Unterverzeichnisses liegt.
|
|
|
|
Liegt pfad außerhalb von quelle (z. B. --nur mit einem externen Pfad), gilt
|
|
das als „nicht archiviert" — archiviere() wird für solche Pfade gar nicht
|
|
erst aufgerufen (siehe hochladen.py).
|
|
"""
|
|
try:
|
|
teile = pfad.relative_to(quelle).parts
|
|
except ValueError:
|
|
return False
|
|
return ARCHIV_ORDNERNAME in teile
|
|
|
|
|
|
def archivziel(pfad: Path, quelle: Path) -> Path:
|
|
"""Berechnet den Zielpfad im Archiv, ohne etwas zu verschieben."""
|
|
relativ = pfad.relative_to(quelle)
|
|
return quelle / ARCHIV_ORDNERNAME / relativ
|
|
|
|
|
|
def archiviere(pfad: Path, quelle: Path) -> Path:
|
|
"""Verschiebt die Datei ins Archiv-Unterverzeichnis; legt Ordner bei Bedarf an.
|
|
|
|
Existiert das Ziel schon, bleibt die Quelle liegen und es kommt FileExistsError.
|
|
Unter Windows wirft rename das ohnehin, unter POSIX würde es still überschreiben.
|
|
"""
|
|
ziel = archivziel(pfad, quelle)
|
|
if ziel.exists():
|
|
raise FileExistsError(f"Archivziel existiert schon: {ziel}")
|
|
ziel.parent.mkdir(parents=True, exist_ok=True)
|
|
pfad.rename(ziel)
|
|
return ziel
|