Skip to content

fix(file-manager): Transferziel mit Hostname und dauerhafter Ziel-Fußzeile (#464) - #538

Merged
iret77 merged 5 commits into
mainfrom
fix/464-fm-transferziel
Oct 9, 2026
Merged

iret77 merged 5 commits into
mainfrom
fix/464-fm-transferziel

Conversation

@iret77

@iret77 iret77 commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

Schließt die drei offenen Punkte aus dem Codebefund in #464 (Kommentar vom 06.10., Stand 9ce5af67c). Geprüft gegen den aktuellen main und darauf rebased (000dff3e0, nach #536, #537 und #539).

Was sich ändert

1. Ziel-Labels nennen den Host, nicht die Registry-ID.
fm_label() baute <node_id>:<pfad>. Jetzt trägt der Pane-Descriptor das Host-Label, das auch der Pane-Kopf seit #536 zeigt: den SSH-Host, ersatzweise den Anzeigenamen, lokal das Label der lokalen Terminal-Pane. Dazu kommt die Verbindung (user@host[:port]) mit dem Benutzer, als der sich die Verbindung tatsächlich anmeldet; bei OneKey ist das der Benutzer aus dem Credential. Beides wird beim Anlegen gesetzt und bei jedem erfolgreichen (Re-)Connect aus dem Server-Snapshot und der Authentifizierung genau dieser Verbindung erneuert, zusammen mit der neuen Route-Generation. So ändert sich ein Descriptor nie unter einem laufenden Transfer. Der Pane-Kopf folgt demselben verbundenen Host. FileManagerRegistry::labels() rendert Host · Verzeichnis (lokal ~ wie im Pane-Kopf) über alle offenen Dateimanager-Panes, die Quelle eingeschlossen.

  • Tragen zwei verschiedene Hosts dasselbe Label, nennt das Label zusätzlich die Verbindung.
  • Zwei Panes im selben Verzeichnis unterscheidet die stabile Pane-Referenz.
  • Das Routing bleibt unverändert: FsNamespace, resolve_snapshot und die Generation.

2. Das Ziel ist vor der Ausführung sichtbar.
Neue Fußzeile über der F-Leiste: „Ziel: Host · Verzeichnis“ bzw. „Ziel wählen“. Sie übernimmt sinngemäß die Fußzeile aus premium-workspace.html. Ein Klick öffnet die Zielauswahl ohne Operation. Die Auswahl listet den eigenen Tab zuerst („Dieser Tab“ / „Andere Tabs“), markiert das aktuelle Ziel und nennt bei F5/F6 die Quelle.

  • Ein ausdrücklich gewähltes Ziel folgt seiner Pane, auch deren aktuellem Verzeichnis. F5/F6 nutzen es ohne Rückfrage.
  • Ist die gewählte Pane geschlossen oder kein Dateimanager mehr, fragen Fußzeile und F5/F6 neu. Sie fallen nicht auf die sichtbare Nachbar-Pane zurück, gemäß der Zustandskarte „Transfer“ in #spec: „Ein stale Ziel stoppt sichtbar statt auf eine andere Pane auszuweichen“.
  • Der Mockup-Code fiel hier still auf die sichtbare Pane zurück. Laut README hat #spec Vorrang vor dem Demo-Verhalten, deshalb ist die eine Zeile in defaultTransferTarget angeglichen.
  • Registry-Updates rufen jetzt ctx.notify() auf, und der Browser beobachtet die Registry. So folgt die Fußzeile Verzeichniswechseln und dem Schließen anderer Panes sofort.
  • Ein Klick auf die Fußzeile ersetzt keinen offenen Dialog.

3. F-Leiste unter 280 px.
Bereits durch #506 (5059d1125) erledigt: 1, 2 oder 4 Zeilen gleich breiter Zellen mit gemessenen Schwellen (#spec F2, PRODUCT §38). Die frühere AC1-Formulierung „in einer Zeile“ ist damit durch die Spezifikation abgelöst. Der native Nachweistest suchte aber noch die alten IDs legend-compact/legend-full und wertete jeden Umbruch als Fehler. Er wäre im nächsten ci-batch rot geworden. Eigener Commit: Er nimmt jetzt das gerenderte Layout legend-rows-1/2/4, prüft auf Überlappung statt auf eine einzige Zeile und belegt zusätzlich, dass die Ziel-Fußzeile in ihrer Pane über der Legende liegt und das Verzeichnis der anderen Pane nennt.

Unverändert: Revalidierung (resolve_snapshot, transfer_guard_is_current) sowie Konflikt-, Symlink-, Pfad-, Streaming-, Abbruch- und Überschreibschutz.

Rebase

Der Rebase auf #536 lief textuell konfliktfrei, war aber semantisch nicht: Die eigene Variable host im Konstruktor hätte die aus #536 überschattet und vor set_identity_host verschoben, also einen Compile-Fehler erzeugt. Behoben in 4791d6ff8. Dort sind die Ziel-Labels auch an das Host-Label des Pane-Kopfs angeglichen, damit Fußzeile und Pane-Kopf dieselbe Pane gleich benennen. Die dadurch ungenutzten Schlüssel fm-label-local und fm-label-remote-host sind entfernt.

Specs im selben PR

PRODUCT §39, TECH §5A (+ Testmatrix 37–39), cockpit-sidebar-connections.html (#spec F3, Zustandskarte „Transfer“), docs/ui/README.md (Zeile Dateimanager) und premium-workspace.html (eine Zeile, Zielwahl ohne Rückfall). VERSION und Changelog bleiben unverändert, wie in #529 begründet: Das Release setzt beides über script/set-version.

Tests

Neue Tests, die echtes Verhalten prüfen:

  • fm_registry_tests: gewähltes Ziel gewinnt und fällt nach dem Schließen nicht auf den sichtbaren Nachbarn zurück; Labels nennen Host und Pfad; Hosts mit gleichem Label zeigen die Verbindung, auch im Zwei-Pane-Fall mit der Quelle; gleiche Verzeichnisse bleiben unterscheidbar.
  • browser_integration_tests: gewähltes Ziel folgt der Pane und F5 kopiert ohne Rückfrage dorthin; nach dem Schließen öffnet F5 die Auswahl samt Quelle und kopiert nichts; Labels enthalten keine Registry-ID; zwei gleichnamige Hosts mit gleichem Pfad lesen sich in den Fußzeilen verschieden; ein langer Zielpfad bleibt in seiner Pane.
  • browser_unit_tests: Verbindungsidentität mit dem OneKey-Login-Benutzer und Host-Label wie im Pane-Kopf (In-Memory-Registry).
  • Angepasst: zwei Picker-Tests an die neue Dialogform, file_pane_body_consumes_remaining_height_above_footer an die zusätzliche Zeile und der native Nachweis file_manager_layout (siehe oben).

Verifikation, ehrlich ausgewiesen

  • Compile, Clippy und Rust-Tests: nicht gelaufen. Lokale Builds sind nach Repo-Regel ausgeschlossen. Ein ci-batch-Lauf vor dem Merge ist nicht möglich, weil er nur auf main läuft. Beides steht im nächsten gebündelten ci-batch aus. Der letzte ci-batch-Lauf 37793832881 (b813a4759) scheiterte schon beim Compile an terminal/view.rs, nicht an diesem PR; 5b814cf51 auf main adressiert das, ist aber selbst noch nicht durch einen Lauf belegt. Auch die Tests aus fix(file-manager): F-Tasten immer mit Kurzbeschriftung, Umbruch statt Ausblenden #506 sind daher noch nie gelaufen.
  • Gelaufen: rustfmt --check auf den berührten Dateien, script/check-no-new-cjk, node --check auf die Mockup-Skripte, eigenes Review und drei Codex-Review-Runden (unten).
  • Nur statisch geprüft: die Auffrischung der Identität beim Reconnect und die Übernahme des Login-Benutzers aus der Authentifizierung derselben Verbindung. Beide Pfade brauchen eine echte SSH-Verbindung.
  • Native Ausführung in der App: steht aus.

Review

  • Eigenes Review: Sperre gegen das Ersetzen offener Dialoge durch die Fußzeile ergänzt; der semantische Rebase-Konflikt wurde vor dem Push gefunden.
  • Codex, Runde 1: keine Compile- oder Re-Entrancy-Befunde, drei Korrektheitsbefunde, behoben in 56650c4d3:
    1. Nach einem Retry mit geänderter Registry blieb die Host-Anzeige veraltet.
    2. Bei OneKey wurde der gespeicherte statt des Login-Benutzers angezeigt.
    3. Die Kollisionsprüfung schloss die Quell-Pane aus.
  • Codex, Delta-Runde: Befunde 1 und 3 bestätigt behoben. Ein Rest-Rennen bei Befund 2 (Credential-Änderung während des Verbindungsaufbaus) ist in c3afe0443 behoben: sftp_ops liefert den tatsächlich authentifizierten Benutzer mit der Session.
  • Codex, Runde 3 (nach Rebase, 4791d6ff8): keine Befunde. Ownership, Signaturen und entfernte i18n-Schlüssel sind konsistent; Ziel-Label und Pane-Kopf nennen denselben Host, auch lokal und nach Reconnect.

iret77 added 5 commits October 9, 2026 19:01
…zeile (#464)

Picker und Toasts zeigten als Ziel die interne Registry-ID des Hosts
(`<node_id>:<pfad>`); zwei Panes mit gleichem Host und Pfad sahen
identisch aus. Ein Standardziel lief bei F5/F6 sofort los, ohne dass das
Ziel vorher irgendwo stand.

- Ziel-Labels lauten jetzt `Host · Verzeichnis` mit dem Anzeigenamen des
  Hosts (bzw. "lokal"). Tragen zwei Hosts denselben Namen, nennt das
  Label zusätzlich die Verbindung (Benutzer@Host); zwei Panes im selben
  Verzeichnis unterscheidet die Pane-Referenz. Der Hostname wird beim
  Anlegen des Browsers einmal aufgelöst, damit sich ein Descriptor nie
  unter einem laufenden Transfer ändert.
- Jede Dateimanager-Pane zeigt über der F-Leiste dauerhaft
  "Ziel: Host · Verzeichnis" bzw. "Ziel wählen"; ein Klick öffnet die
  Zielauswahl. Die Auswahl listet den eigenen Tab zuerst, markiert das
  aktuelle Ziel und nennt bei F5/F6 die Quelle.
- Ein ausdrücklich gewähltes Ziel folgt seiner Pane und gilt für F5/F6
  ohne Rückfrage. Ist diese Pane geschlossen oder kein Dateimanager mehr,
  fragen Fußzeile und F5/F6 neu, statt auf die sichtbare Nachbar-Pane
  auszuweichen (#spec F3, Zustandskarte "Transfer").
- Registry-Änderungen benachrichtigen die Browser, damit die Fußzeile
  Verzeichniswechsel und Schließen anderer Panes sofort zeigt.

Revalidierung, Konflikt-, Symlink-, Streaming-, Abbruch- und
Überschreibschutz bleiben unverändert. Tests für Hostname statt
Registry-ID, Namens- und Verzeichniskollisionen, gewähltes Ziel ohne
Rückfall und lange Zielpfade in schmalen Panes. PRODUCT §39, TECH §5A,
#spec F3, README und die Mockup-Zielwahl ziehen mit.
…l-Fußzeile anpassen

Seit #506 heißen die Legendenlayouts `legend-rows-1/2/4`, und eine
schmale Pane bricht die F-Leiste gemäß #spec F2 in zwei oder vier Zeilen
um. Der native Nachweis suchte weiter `legend-compact`/`legend-full` und
wertete jeden Umbruch als Fehler; er wäre im nächsten ci-batch rot
geworden. Er nimmt jetzt das tatsächlich gerenderte Layout, prüft Zellen
auf Überlappung statt auf eine einzige Zeile und belegt zusätzlich, dass
die Ziel-Fußzeile in ihrer Pane über der Legende liegt und das
Verzeichnis der anderen Pane nennt.
…ndung, Labels inklusive Quelle

Befunde aus dem Codex-Zweitreview:

- Hostname und Benutzer@Host wurden nur beim Anlegen der Pane gelesen. Nach
  einem Retry mit geänderter Registry nannte die Ziel-Anzeige den alten Host.
  Die Identität wird jetzt bei jedem erfolgreichen Verbindungsaufbau aus der
  tatsächlich genutzten Konfiguration gesetzt, zusammen mit der neuen
  Route-Generation, sodass kein offener Transfer-Snapshot den Wechsel
  überlebt.
- Bei OneKey zeigte Benutzer@Host den gespeicherten statt des tatsächlich
  verwendeten Benutzers. Die Identität nutzt jetzt den aufgelösten
  Login-Benutzer des Credentials.
- Die Unterscheidung gleichnamiger Hosts sah nur die Ziele, nicht die
  Quelle. Im üblichen Zwei-Pane-Fall lasen sich zwei verschiedene Hosts
  gleichen Namens mit gleichem Pfad deshalb identisch. Fußzeile, Picker und
  Quellzeile verwenden jetzt dieselben Labels über alle offenen
  Dateimanager-Panes.
…Verbindung

Codex-Delta-Review: Nach dem Verbindungsaufbau wurde der OneKey-Benutzer
für die Ziel-Anzeige erneut aus der Registry gelesen. Ändert sich das
Credential während des Aufbaus, lief die Verbindung als der alte Benutzer,
die Anzeige nannte aber den neuen. Die SFTP-Verbindung liefert jetzt den
beim Login tatsächlich verwendeten Benutzer mit; die Ziel-Identität nutzt
genau diesen Snapshot.
… nach #536)

Seit #536 heißt der Pane-Kopf eines Dateimanagers `Host · Verzeichnis` mit
dem SSH-Host des Registry-Eintrags (der Anzeigename nur ersatzweise), lokal
mit dem Label der lokalen Terminal-Pane und `~` für das Home-Verzeichnis.
Die Ziel-Labels nutzten noch den Anzeigenamen und "lokal" – Fußzeile und
Pane-Kopf hätten dieselbe Pane verschieden benannt.

- Ziel-Labels übernehmen jetzt genau das Host-Label des Pane-Kopfs und
  schreiben ein lokales Home als `~`.
- Nach dem Rebase hätte die eigene Host-Variable im Konstruktor die aus
  #536 überschattet und vor `set_identity_host` verschoben (Compile-
  Fehler); der Konstruktor nutzt jetzt das Host-Label aus #536 für beide.
- Beim (Re-)Connect setzen Ziel-Label und Pane-Kopf den Host aus dem
  Server-Snapshot der tatsächlichen Verbindung.
- Nicht mehr genutzte Schlüssel `fm-label-local` und `fm-label-remote-host`
  entfernt; der unbekannte Host heißt wie bei Terminal-Panes.
- Der native Nachweis prüft die Fußzeile über den eindeutigen
  Verzeichnisnamen, unabhängig von der `~`-Kürzung.
@iret77
iret77 force-pushed the fix/464-fm-transferziel branch from 639ba9e to 4791d6f Compare October 9, 2026 17:02
@iret77
iret77 merged commit ebfd3d5 into main Oct 9, 2026
1 check passed
@iret77
iret77 deleted the fix/464-fm-transferziel branch October 9, 2026 22:36
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.

1 participant