Skip to content

fix(icon): pass file paths as plain argv to the icon helper (WP-B2, #45) - #155

Merged
Toqsick merged 1 commit into
mainfrom
fix/45-icon-loader-argv
Oct 23, 2026
Merged

Toqsick merged 1 commit into
mainfrom
fix/45-icon-loader-argv

Conversation

@Toqsick

@Toqsick Toqsick commented Oct 23, 2026

Copy link
Copy Markdown
Owner

Was

WP-B2 (#45): Der Icon-Loader übergibt den Pfad an den Python-Helfer jetzt als Daten im argv
— ohne eingebettete Quotes und ohne Shell. Der Quote-Strip-Shim im Helfer ist entfernt; der
Helfer reicht den Wert unverändert durch.

Beide Hälften des Paares mussten zusammen geändert werden: der Helfer hat den Wert bisher
umgeschrieben (removeprefix("'")/removesuffix("'")). Ein Aufrufer, der den nackten Pfad
übergibt — so wie der Loader jetzt — hätte bei einem Pfad, der mit einem Quote-Zeichen endet,
ein abgeschnittenes Pfad-Fragment bekommen.

Datei Änderung
lib/services/icon_loader.dart --file='<pfad>' → --file=<pfad>; runInShell: false an allen drei Aufrufstellen
additional/python/get_icon_path_for_file.py Shim entfernt, Wert wird durchgereicht
test/icon_loader_test.dart (neu) 7 Tests: argv ohne Quotes, Pfad mit Leerzeichen als ein Argument, runInShell false an allen drei Stellen
additional/python/tests/test_icon_path_helper.py (neu) 4 Tests: der Helfer reicht den Wert unverändert an Gio.File.new_for_path durch

Zur Shell: sie war nie ein Split-Risiko. Dart quotet jedes argv-Element, ein Pfad mit
Leerzeichen bleibt also ein Argument — das habe ich mit einer Sonde gemessen, die die
Argumentanzahl zählt (nicht nur die Ausgabe vergleicht, was ein Argument mit Leerzeichen nicht
von zwei Argumenten unterscheiden kann). Die Shell war nur ein unnötiger Zwischenschritt;
runInShell: false ist das Muster, das die übrigen sechs Aufrufstellen in linux.dart schon
nutzen.

Verifiziert

TDD, beide Phasen getrennt gelaufen:

Phase Ergebnis
RED (Dart) 6 Failures — Quotes im argv, runInShell true an allen drei Stellen
RED (Python) 2 Failures — Shim entfernt den abschließenden Quote bzw. die umschließenden Quotes
GREEN (Dart) 7/7 grün
GREEN (Python) 4/4 grün

Gates am 2026-10-23 mit echten Exitcodes (Exitcode vor dem Piping gesichert):

Gate Ergebnis
bash tool/check-versions.sh OK
dart format --set-exit-if-changed lib test OK — 124 Dateien, 0 geändert
flutter analyze OK — No issues found! (27,1 s)
flutter test OK — 230 Tests (vorher 223)
Python-Unit-Tests OK — 62 Tests (vorher 58)
packages/la_core: analyze / format / test OK — 0 Findings, 25 Dateien, 68 Tests

End-to-End mit echtem GI-Stack: der reale Helper wurde mit einem Pfad mit Leerzeichen und
einem Pfad mit abschließendem Quote aufgerufen. Beide Fälle scheitern erst im Gtk-Teil
(Gtk.IconTheme.get_default() liefert ohne Display null) — der Gio-Teil
(new_for_path + query_info) lief also mit dem richtigen Pfad durch.

Risk-Register

  • Niedrig. Die Änderung ist auf zwei Dateien plus Tests begrenzt; kein Eingriff in die
    polkit-Trinität, keine Änderung an der Security-Invariante.
  • Verhaltensänderung: der Icon-Lookup bekommt jetzt den Pfad ohne Quotes. Da beide Seiten
    gleichzeitig geändert werden, bleibt das Ergebnis identisch — der Helfer entfernte vorher
    genau die Quotes, die der Loader setzte.
  • Flatpak: hostOnFlatpak bleibt unverändert. Das gepackte Flatpak-Paket ist ohnehin
    geparkt (packaging/unmaintained/); der gepflegte Weg ist das .deb.
  • Kein Doku-Flake: die Test-Kommentare beschreiben den alten Zustand korrekt. Das alte
    Paar war symmetrisch und lieferte für sich genommen das richtige Ergebnis — der Bruch wäre
    erst entstanden, wenn nur eine Seite geändert worden wäre. Genau das ist der Grund, warum
    die beiden Seiten zusammen geändert werden müssen.

Deferred

Copilot AI lite review requested due to automatic review settings October 23, 2026 12:57

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants