paramikos getcwd() liefert None, solange kein chdir() erfolgt ist. Der
Rueckfall auf "." landete als remote_path in der App, woraus _join()/_abs()
Pfade wie "/./datei" bauten. Der Server loeste die relativ zum Dateisystem-
Root statt zum Home auf -> "No such file" beim Download, "Permission denied"
beim Upload. Das Listing funktionierte, weil listdir(".") serverseitig
relativ zum Home aufgeloest wird -- daher fiel es erst beim Transfer auf.
- connect()/chdir()/listdir() loesen den Pfad ueber sftp.normalize() auf
- _abs() haengt relative Pfade an das CWD an, statt blind "/" voranzustellen
- _copy_tree(): die beiden mkdir-Zweige waren vertauscht. Beim Download
wurde backend.mkdir() auf einen lokalen Pfad angewendet (Verzeichnis
entstand auf dem Server), beim Upload os.makedirs() auf einen entfernten.
Ordner-Transfers waren dadurch in beide Richtungen defekt.
Verifiziert per End-to-End-Test gegen einen echten sshd/SFTP-Server:
Datei- und rekursiver Ordner-Transfer in beide Richtungen.
Closes#3
- Screen-Bindings lösen Actions im Screen-Namespace auf. "quit" traf daher
ins Leere, weil Screen.action_quit nicht existiert – die Taste wurde still
verworfen. Bindings auf "app.quit" umgestellt (q im Browser, Escape im
Verbindungsdialog).
- RenameScreen._ok rief do_rename() auf sich selbst statt auf den darunter
liegenden BrowserScreen (AttributeError). Reihenfolge korrigiert: erst
pop_screen(), dann do_rename().
- RenameScreen mit Escape abbrechbar.
- Neuer Helfer _selected_entry() blendet den ".."-Navigationseintrag aus.
Download, Upload, Löschen und Umbenennen operierten sonst auf "↑ ..".