From 8218cfd9d5d78cba12b41ce64dcd706f7f3c5089 Mon Sep 17 00:00:00 2001 From: Davito <1+davito@noreply.localhost> Date: Thu, 1 Oct 2026 14:53:08 +0200 Subject: [PATCH] Release SyncVito 1.0.16 --- CHANGELOG.md | 6 ++++++ pyproject.toml | 2 +- src/syncvito/sync_engine.py | 33 +++++++++++++++++++++++++++++---- version.txt | 2 +- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 843d116..ee8f32b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Änderungsprotokoll +## 1.0.16 – 2026-10-01 + +### Behoben + +- **Verständliche Meldung bei abgelehnter NAS-Anmeldung:** Der Zugriff auf Quell- und Zielordner fängt Windows-Fehler 1326 jetzt bereits bei der Pfadprüfung ab und erklärt, dass die gespeicherten Windows-Anmeldeinformationen für den NAS-Server geprüft werden müssen. + ## 1.0.15 – 2026-09-29 ### Neu diff --git a/pyproject.toml b/pyproject.toml index ac76489..155a04a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "syncvito" -version = "1.0.15" +version = "1.0.16" description = "Windows-Desktopwerkzeug für lokale und NAS-Synchronisation" readme = "README.md" requires-python = ">=3.11" diff --git a/src/syncvito/sync_engine.py b/src/syncvito/sync_engine.py index 9d940da..461078d 100644 --- a/src/syncvito/sync_engine.py +++ b/src/syncvito/sync_engine.py @@ -32,6 +32,18 @@ class UnavailablePathError(RuntimeError): """Ein für die Synchronisation benötigter Pfad ist nicht erreichbar.""" +def _unavailable_path_message(label: str, path: Path, exc: OSError) -> str: + """Erklärt typische NAS-Anmeldefehler verständlich und erhält den Pfadkontext.""" + if getattr(exc, "winerror", None) == 1326: + return ( + f"{label} nicht erreichbar: Windows hat die NAS-Anmeldung abgelehnt " + "(WinError 1326: Benutzername oder Kennwort falsch). Prüfe die gespeicherten " + "Windows-Anmeldeinformationen für den NAS-Server und teste den Zugriff im Explorer. " + f"Pfad: {path}" + ) + return f"{label} nicht erreichbar: {path}" + + def is_relative_path_ignored(relative: str, ignored_set: set[str]) -> bool: """Prüft, ob ein relativer Pfad oder eines seiner Elternverzeichnisse ignoriert wird.""" if not ignored_set or not relative.strip(): @@ -241,14 +253,27 @@ class SyncEngine: @staticmethod def _validate_roots(source_root: Path, target_root: Path) -> None: - if not source_root.is_dir(): + try: + source_is_dir = source_root.is_dir() + except OSError as exc: + raise UnavailablePathError(_unavailable_path_message("Quellordner", source_root, exc)) from exc + if not source_is_dir: raise UnavailablePathError(f"Quellordner nicht erreichbar: {source_root}") - if not target_root.exists(): + + try: + target_exists = target_root.exists() + except OSError as exc: + raise UnavailablePathError(_unavailable_path_message("Zielordner", target_root, exc)) from exc + if not target_exists: try: target_root.mkdir(parents=True, exist_ok=True) except OSError as exc: - raise UnavailablePathError(f"Zielordner nicht erreichbar: {target_root}") from exc - if not target_root.is_dir(): + raise UnavailablePathError(_unavailable_path_message("Zielordner", target_root, exc)) from exc + try: + target_is_dir = target_root.is_dir() + except OSError as exc: + raise UnavailablePathError(_unavailable_path_message("Zielordner", target_root, exc)) from exc + if not target_is_dir: raise UnavailablePathError(f"Ziel ist kein Ordner: {target_root}") @staticmethod diff --git a/version.txt b/version.txt index a970716..b668c3b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.15 +1.0.16