fix: die Laufwerks-Pruefung muss selbst einspritzbar sein
Ampel / ampel (push) Successful in 54s

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 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-08-28 14:56:10 +02:00
co-authored by Claude Opus 5
parent 16df61ea3a
commit 480b658294
2 changed files with 41 additions and 4 deletions
+23 -3
View File
@@ -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."
+18 -1
View File
@@ -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