fix(windows): Roh- und Zielordner landeten in einem Ordner namens „app"
Beim Nachstellen des leeren Bildschirms lief ein echter Test-Rip durch. Die
Rohdaten landeten in:
F:\app\temp\raw\<job>\Evangelion 2.22_t00.mkv (436 MB)
Also in einem Ordner namens `app` auf dem Laufwerk, von dem Rippy gerade lief.
## Zwei Container-Wurzeln im Worker
RAW_DIR = /app/temp/raw
MEDIA_ROOT = /app/media
Unter Windows sind das keine Pfade, sondern Unfaelle. Schlimmer: Die Pruefung
`unter_wurzel(wahl, MEDIA_ROOT)` verwarf auch eine AUSDRUECKLICHE Wahl — ein
Arbeitsordner wie `D:\Roh` liegt nicht unter `/app/media`, also fiel er still
auf den Container-Standard zurueck.
**Damit kam der Arbeitsordner, den der Commander am 28.08.2026 ausdruecklich
bestellt hat, unter Windows nie an.** Der Dialog zeigte ihn, das Setzen ging,
und der Worker ignorierte ihn — ohne ein Wort. Dasselbe galt fuer das Ziel:
Eine UNC-Freigabe liegt unter gar keiner lokalen Wurzel, also waere die
fertige Datei in `X:\app\media\bluray` gelandet.
## Die Wurzeln kommen jetzt aus dem Betrieb
Im Container aendert sich NICHTS: dort ist `/app/media` die Wurzel und `frei`
falsch. Nativ zaehlt die Wahl des Nutzers — dort IST sein Laufwerk die Grenze.
Die drei bestehenden Tests wurden rot, und zwar zu Recht: Sie pruefen die
Container-Regel, liefen aber unter Windows, wo `frei` gilt. Die Wurzeln sind
deshalb einspritzbar — beide Betriebsfaelle sind jetzt auf jedem Rechner
pruefbar, statt vom laufenden abzuhaengen.
837 Tests gruen, ruff sauber.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
27c9d9a4bb
commit
423374e65a
@@ -121,24 +121,33 @@ def test_pfad_lokal_uebersetzt_fuer_windows_worker():
|
||||
# Praxis scheiterte (st_dev war identisch, os.rename trotzdem EXDEV).
|
||||
|
||||
|
||||
# Die Wurzeln je Betrieb — eingespritzt, damit BEIDE Faelle ueberall pruefbar
|
||||
# sind. Vorher hingen diese Tests am laufenden Rechner: Unter Windows ist
|
||||
# `frei` wahr, und die Container-Regeln galten dort nicht mehr (am 29.08.2026
|
||||
# prompt rot geworden).
|
||||
CONTAINER = ("/app/media", "/app/temp/raw", False)
|
||||
NATIV = (r"C:\Users\Tobi\Videos\Rippy", r"C:\Users\Tobi\Videos\Rippy\_arbeit", True)
|
||||
|
||||
|
||||
def test_arbeitsverzeichnis_wahl_des_rips_schlaegt_die_einstellung():
|
||||
"""Pro Rip wählbar (Commander 25.07.2026), Einstellung bleibt Standard.
|
||||
|
||||
Reihenfolge: Wahl dieses Rips -> Setting -> Container-Default. Der
|
||||
Reihenfolge: Wahl dieses Rips -> Setting -> Vorgabe des Betriebs. Der
|
||||
Setting-Wert ist genau der, der bei Vollautomatik-Rips greift, weil dort
|
||||
niemand gefragt wird.
|
||||
"""
|
||||
import ablauf as tasks
|
||||
|
||||
einst = {"workDir": "/app/media/movies"}
|
||||
assert tasks._arbeitsverzeichnis(einst, "/app/media/rippy") == "/app/media/rippy"
|
||||
assert tasks._arbeitsverzeichnis(einst) == "/app/media/movies"
|
||||
assert tasks._arbeitsverzeichnis({}) == tasks.RAW_DIR
|
||||
w = CONTAINER
|
||||
assert tasks._arbeitsverzeichnis(einst, "/app/media/rippy", w) == "/app/media/rippy"
|
||||
assert tasks._arbeitsverzeichnis(einst, "", w) == "/app/media/movies"
|
||||
assert tasks._arbeitsverzeichnis({}, "", w) == "/app/temp/raw"
|
||||
# Ausbruchsversuche und Pfade außerhalb /app/media fallen durch
|
||||
assert tasks._arbeitsverzeichnis({}, "/etc") == tasks.RAW_DIR
|
||||
assert tasks._arbeitsverzeichnis({}, "/app/media/../etc") == tasks.RAW_DIR
|
||||
assert tasks._arbeitsverzeichnis({}, "/etc", w) == "/app/temp/raw"
|
||||
assert tasks._arbeitsverzeichnis({}, "/app/media/../etc", w) == "/app/temp/raw"
|
||||
# Leere Wahl fällt sauber auf die Einstellung zurück
|
||||
assert tasks._arbeitsverzeichnis(einst, " ") == "/app/media/movies"
|
||||
assert tasks._arbeitsverzeichnis(einst, " ", w) == "/app/media/movies"
|
||||
|
||||
|
||||
def test_unter_wurzel_faellt_nicht_auf_praefix_namen_herein():
|
||||
@@ -160,16 +169,67 @@ def test_unter_wurzel_faellt_nicht_auf_praefix_namen_herein():
|
||||
|
||||
|
||||
def test_zielbasis_lehnt_praefix_ausbruch_ab():
|
||||
"""Im CONTAINER bleibt die Wurzel eine Wurzel — daran ändert die
|
||||
Windows-Reparatur nichts."""
|
||||
import ablauf as tasks
|
||||
|
||||
assert tasks._zielbasis("/app/media/movies", "bluray") == "/app/media/movies"
|
||||
w = CONTAINER
|
||||
assert tasks._zielbasis("/app/media/movies", "bluray", w) == "/app/media/movies"
|
||||
# Ausbruch per Praefix-Namen fällt auf den Standard zurück
|
||||
assert tasks._zielbasis("/app/media-boese", "bluray") != "/app/media-boese"
|
||||
assert tasks._zielbasis("/etc", "bluray") != "/etc"
|
||||
assert tasks._zielbasis("/app/media-boese", "bluray", w) != "/app/media-boese"
|
||||
assert tasks._zielbasis("/etc", "bluray", w) != "/etc"
|
||||
|
||||
|
||||
def test_arbeitsverzeichnis_lehnt_praefix_ausbruch_ab():
|
||||
import ablauf as tasks
|
||||
|
||||
assert tasks._arbeitsverzeichnis({}, "/app/media-boese") == tasks.RAW_DIR
|
||||
assert tasks._arbeitsverzeichnis({"workDir": "/app/mediaX"}) == tasks.RAW_DIR
|
||||
w = CONTAINER
|
||||
assert tasks._arbeitsverzeichnis({}, "/app/media-boese", w) == "/app/temp/raw"
|
||||
assert tasks._arbeitsverzeichnis({"workDir": "/app/mediaX"}, "", w) == "/app/temp/raw"
|
||||
|
||||
|
||||
# ── Nativ: der Befund vom 29.08.2026 ────────────────────────────────────
|
||||
#
|
||||
# Beim Nachstellen des leeren Bildschirms lief ein echter Test-Rip durch, und
|
||||
# die Rohdaten landeten in `F:\app\temp\raw` — einem Ordner namens `app` auf
|
||||
# dem Laufwerk, von dem Rippy gerade lief. Ursache: `RAW_DIR` ist
|
||||
# `/app/temp/raw`, und die Pruefung `unter_wurzel(wahl, "/app/media")` verwarf
|
||||
# sogar eine AUSDRUECKLICHE Wahl.
|
||||
#
|
||||
# Damit kam der Arbeitsordner, den der Commander am 28.08.2026 bestellt hat,
|
||||
# unter Windows nie an: Der Dialog zeigte ihn, das Setzen ging, der Worker
|
||||
# ignorierte ihn — ohne ein Wort.
|
||||
|
||||
|
||||
def test_nativ_zaehlt_die_wahl_des_nutzers():
|
||||
"""DER Befund. `D:\\Roh` liegt unter keiner Container-Wurzel und wurde
|
||||
deshalb still verworfen."""
|
||||
import ablauf as tasks
|
||||
|
||||
assert tasks._arbeitsverzeichnis({}, r"D:\Roh", NATIV) == r"D:\Roh"
|
||||
assert tasks._arbeitsverzeichnis({"workDir": r"E:\Arbeit"}, "", NATIV) == r"E:\Arbeit"
|
||||
|
||||
|
||||
def test_nativ_faellt_auf_den_ort_aus_der_installation_zurueck():
|
||||
"""Nicht auf `/app/temp/raw` — das wurde unter Windows zu `X:\\app\\temp`."""
|
||||
import ablauf as tasks
|
||||
|
||||
assert tasks._arbeitsverzeichnis({}, "", NATIV) == NATIV[1]
|
||||
assert "/app/" not in tasks._arbeitsverzeichnis({}, "", NATIV)
|
||||
|
||||
|
||||
def test_nativ_nimmt_auch_eine_freigabe_als_ziel():
|
||||
"""Sein Ziel ist eine UNC-Freigabe — die liegt unter gar keiner lokalen
|
||||
Wurzel."""
|
||||
import ablauf as tasks
|
||||
|
||||
unc = r"\\192.168.179.62\rippy\movies"
|
||||
assert tasks._zielbasis(unc, "bluray", NATIV) == unc
|
||||
|
||||
|
||||
def test_nativ_ohne_wahl_landet_unter_der_eigenen_ablage():
|
||||
import ablauf as tasks
|
||||
|
||||
ziel = tasks._zielbasis("", "bluray", NATIV)
|
||||
assert ziel.startswith(NATIV[0])
|
||||
assert "/app/" not in ziel
|
||||
|
||||
Reference in New Issue
Block a user