44am Cloud-Files-Filter (cldflt) mit Zugriff-verweigert/EXDEV, automatisch auf
55copy+delete ausweichen (der MS-empfohlene, filter-sichere Workaround).
66
7- Idempotenz fuer verzoegerte Retries: Wenn der Copy-Teil gelang, aber das
8- Loeschen der Quelle (noch) gesperrt ist, merkt sich der Schritt das via
9- `Step.copied` — der naechste Lauf loescht dann nur noch die Quelle und kopiert
7+ Idempotenz für verzögerte Retries: Wenn der Copy-Teil gelang, aber das
8+ Löschen der Quelle (noch) gesperrt ist, merkt sich der Schritt das via
9+ `Step.copied` — der nächste Lauf löscht dann nur noch die Quelle und kopiert
1010NICHT erneut (kein Datenverlust, kein Doppel-Copy).
1111"""
1212from __future__ import annotations
@@ -50,9 +50,9 @@ def _force_writable(path: str | os.PathLike) -> None:
5050
5151def _on_rm_error (func , path , _exc ):
5252 """rmtree-Fehlerbehandler: read-only-Attribut entfernen, dann erneut versuchen.
53- Windows verweigert das Loeschen read-only markierter Dateien/Verzeichnisse mit
53+ Windows verweigert das Löschen read-only markierter Dateien/Verzeichnisse mit
5454 WinError 5 (z.B. .pytest_cache, .git/objects oder von OneDrive 'pinned'). Ohne
55- diesen Handler bricht shutil.rmtree an solchen Eintraegen ab."""
55+ diesen Handler bricht shutil.rmtree an solchen Einträgen ab."""
5656 _force_writable (path )
5757 func (path )
5858
@@ -90,7 +90,7 @@ def _verify_copy(src: Path, dst: Path) -> bool:
9090def _delete_path (p : Path ) -> tuple [bool , str ]:
9191 try :
9292 if not p .exists ():
93- return True , "bereits geloescht "
93+ return True , "bereits gelöscht "
9494 if p .is_dir ():
9595 try :
9696 _rmtree (p )
@@ -99,7 +99,7 @@ def _delete_path(p: Path) -> tuple[bool, str]:
9999 # Bug 3: Verzeichnis mit gesperrter Innendatei
100100 ok , locked = _delete_dir_skip_locked (p )
101101 if ok :
102- return True , "geloescht (gesperrte Innendateien uebersprungen )"
102+ return True , "gelöscht (gesperrte Innendateien übersprungen )"
103103 if locked :
104104 names = ", " .join (str (lp .name ) for lp in locked [:3 ])
105105 return False , f"Innendatei(en) noch gesperrt (EBUSY): { names } "
@@ -115,9 +115,9 @@ def _delete_path(p: Path) -> tuple[bool, str]:
115115 except OSError :
116116 _force_writable (p ) # read-only Datei -> beschreibbar machen
117117 p .unlink ()
118- return True , "geloescht "
118+ return True , "gelöscht "
119119 except OSError as e :
120- return False , f"Loeschen fehlgeschlagen: { e } "
120+ return False , f"Löschen fehlgeschlagen: { e } "
121121
122122
123123def _delete_dir_skip_locked (p : Path ) -> tuple [bool , list [Path ]]:
@@ -165,8 +165,8 @@ def _delete_dir_skip_locked(p: Path) -> tuple[bool, list[Path]]:
165165
166166
167167def _do_move (src : Path , dst : Path ) -> tuple [bool , str , bool ]:
168- """Verschiebt src -> dst. Rueckgabe : (ok, msg, copied).
169- `copied`=True heisst : dst ist vollstaendig erstellt (egal ob Quelle schon weg).
168+ """Verschiebt src -> dst. Rückgabe : (ok, msg, copied).
169+ `copied`=True heißt : dst ist vollständig erstellt (egal ob Quelle schon weg).
170170 Ziel-existiert (mit anderem Inhalt als 'schon erledigt') = Konflikt -> Fehler."""
171171 if not src .exists () and dst .exists ():
172172 return True , "bereits verschoben" , True
@@ -199,12 +199,12 @@ def _do_move(src: Path, dst: Path) -> tuple[bool, str, bool]:
199199
200200 if not _verify_copy (src , dst ):
201201 _delete_path (dst )
202- return False , "Copy unvollstaendig (Verify fehlgeschlagen)" , False
202+ return False , "Copy unvollständig (Verify fehlgeschlagen)" , False
203203
204204 ok , msg = _delete_path (src )
205205 if ok :
206206 return True , "verschoben (copy+delete)" , True
207- return False , f"Kopiert, aber Quelle noch gesperrt — Retry spaeter ({ msg } )" , True
207+ return False , f"Kopiert, aber Quelle noch gesperrt — Retry später ({ msg } )" , True
208208
209209
210210# ── Standalone-API (fuer direkte Nutzung/Tests) ─────────────────────
@@ -251,7 +251,7 @@ def execute_step(step: Step) -> tuple[bool, str]:
251251
252252
253253def execute_chain (task : Task ) -> bool :
254- """Fuehrt die Kette ab task.step_index aus. Schritt N nur nach Erfolg N-1."""
254+ """Führt die Kette ab task.step_index aus. Schritt N nur nach Erfolg N-1."""
255255 for i in range (task .step_index , len (task .chain )):
256256 ok , msg = execute_step (task .chain [i ])
257257 if ok :
0 commit comments