From 480b658294762072649ed32d4faf48e98876ff0a Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Fri, 28 Aug 2026 14:56:10 +0200 Subject: [PATCH] fix: die Laufwerks-Pruefung muss selbst einspritzbar sein Ampel-Lauf zu 16df61e rot, und diesmal am Gegenteil: assert 'Administratorrechte' in 'Statt des Laufwerksbuchstabens den UNC-Pfad eintragen (\Server\Freigabe).' `pfade.laufwerk_von` zerlegte den Windows-Pfad jetzt richtig -- aber `os.path.isdir("C:\")` ist auf Linux immer False, also galt JEDES Laufwerk als fehlend und der falsche Zweig griff. Die Frage "existiert Laufwerk Q:" laesst sich auf dem Linux-Runner ueberhaupt nicht beantworten, dort gibt es keine Laufwerksbuchstaben. Also gehoert sie in eine eigene, einspritzbare Funktion (`laufwerk_fehlt`) -- ohne die waere der Zweig nur auf einem Windows-Rechner mit genau diesem fehlenden Laufwerk pruefbar, also nirgends. Dieselbe Lehre wie bei pruefe_windows heute Vormittag: **Ein Plattform-Vergleich mitten in einer Funktion macht jeden Einspritzpunkt davor wertlos.** Vor dem Push den Linux-Fall lokal nachgestellt (os.name auf "posix" gesetzt): Program Files, Programme und ein fehlendes Q: landen jetzt alle im richtigen Zweig. Ampel lokal: 715 gruen, ruff sauber. Co-Authored-By: Claude Opus 5 --- src/rippy/einrichtung.py | 26 +++++++++++++++++++++++--- src/rippy/test_einrichtung.py | 19 ++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/rippy/einrichtung.py b/src/rippy/einrichtung.py index 4000c6d..1f853e4 100644 --- a/src/rippy/einrichtung.py +++ b/src/rippy/einrichtung.py @@ -200,7 +200,27 @@ def pruefe_administrator(erhoeht=None, laufwerke=None) -> dict: "(\\\\Server\\Freigabe) oder Rippy ohne Administrator starten.") -def pruefe_schreibrecht(ziel: str, probe=None, erhoeht=None) -> dict: +def laufwerk_fehlt(ziel: str, vorhanden=None) -> bool: + r"""Zeigt der Pfad auf einen Laufwerksbuchstaben, den es hier nicht gibt? + + `vorhanden` ist einspritzbar — und das ist kein Beiwerk: Die Frage + „existiert Laufwerk Q:" laesst sich auf dem Linux-Runner der Ampel gar + nicht beantworten, dort gibt es ueberhaupt keine Laufwerksbuchstaben. + Ohne Einspritzpunkt waere dieser Zweig nur auf einem Windows-Rechner mit + genau dem passenden fehlenden Laufwerk pruefbar — also nirgends. + """ + laufwerk = pfade.laufwerk_von(ziel or "") + if len(laufwerk) != 2 or not laufwerk.endswith(":"): + return False # UNC-Pfad oder POSIX + if vorhanden is not None: + return not vorhanden + if os.name != "nt": + return False + return not os.path.isdir(laufwerk + "\\") + + +def pruefe_schreibrecht(ziel: str, probe=None, erhoeht=None, + laufwerk_da=None) -> dict: """Darf Rippy dorthin schreiben? Wirklich probiert, nicht geraten. Ein `os.access(..., W_OK)` lügt unter Windows: Es beantwortet die Frage @@ -222,8 +242,8 @@ def pruefe_schreibrecht(ziel: str, probe=None, erhoeht=None) -> dict: # ueber `pfade`, nicht ueber `os.path`: Auf dem Linux-Runner der Ampel # kennt `splitdrive` kein "Q:" und gab einen leeren String zurueck -- # dieselbe Falle, fuer die es `rippy/pfade.py` gibt. Zum vierten Mal. - laufwerk = pfade.laufwerk_von(ziel or "") - if laufwerk and len(laufwerk) == 2 and not os.path.isdir(laufwerk + "\\"): + if laufwerk_fehlt(ziel, laufwerk_da): + laufwerk = pfade.laufwerk_von(ziel or "") # Ein Laufwerksbuchstabe, den es in DIESEM Prozess nicht gibt. zusatz = (" Als Administrator gestartete Programme sehen die " "eingebundenen Netzlaufwerke der Sitzung nicht." diff --git a/src/rippy/test_einrichtung.py b/src/rippy/test_einrichtung.py index c8cd157..dbf80a5 100644 --- a/src/rippy/test_einrichtung.py +++ b/src/rippy/test_einrichtung.py @@ -114,9 +114,13 @@ def test_als_administrator_wird_vor_den_fehlenden_netzlaufwerken_gewarnt(): def test_fehlendes_laufwerk_wird_beim_namen_genannt(): """„Schreibrechte fehlen" war richtig im Wortlaut und unbrauchbar als Auskunft: Das Laufwerk war fuer den erhoehten Prozess gar nicht da.""" + # `laufwerk_da=False` eingespritzt: Die Frage "existiert Q:" laesst sich + # auf dem Linux-Runner der Ampel gar nicht beantworten. Ohne den + # Einspritzpunkt waere dieser Zweig nur auf einem Windows-Rechner mit + # genau diesem fehlenden Laufwerk pruefbar -- also nirgends. befund = e.pruefe_schreibrecht( "Q:" + chr(92) + "Rippy", probe=(False, "Pfad nicht gefunden"), - erhoeht=True) + erhoeht=True, laufwerk_da=False) assert befund["zustand"] == e.FEHLER assert "Q:" in befund["text"] assert "nicht vorhanden" in befund["text"] @@ -261,3 +265,16 @@ def test_netzwerkpfad_ohne_administrator_bekommt_die_normale_meldung(): erhoeht=False) assert befund["zustand"] == e.FEHLER assert "Administrator" not in befund["abhilfe"] or "keine" in befund["abhilfe"] + + +def test_ein_vorhandenes_laufwerk_ist_kein_laufwerks_problem(): + """Sonst waere JEDER Schreibfehler auf C: ein 'Laufwerk fehlt'.""" + B = chr(92) + assert e.laufwerk_fehlt("C:" + B + "Programme", vorhanden=True) is False + assert e.laufwerk_fehlt("Q:" + B + "Rippy", vorhanden=False) is True + + +def test_unc_und_posix_sind_keine_laufwerksbuchstaben(): + B = chr(92) + assert e.laufwerk_fehlt(B + B + "NAS" + B + "Filme") is False + assert e.laufwerk_fehlt("/srv/rippy") is False