From bfe05ceb0783d989643a0da18e36df4dc6cf5b5f Mon Sep 17 00:00:00 2001 From: ChristianVisintin Date: Tue, 1 Dec 2020 11:12:58 +0100 Subject: [PATCH] It is now possible to enter symlinks --- src/ui/activities/filetransfer_activity.rs | 41 +++++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/src/ui/activities/filetransfer_activity.rs b/src/ui/activities/filetransfer_activity.rs index c65e47c..5be127f 100644 --- a/src/ui/activities/filetransfer_activity.rs +++ b/src/ui/activities/filetransfer_activity.rs @@ -916,8 +916,24 @@ impl FileTransferActivity { // Match selected file let local_files: Vec = self.local.files.clone(); if let Some(entry) = local_files.get(self.local.index) { - if let FsEntry::Directory(dir) = entry { - self.local_changedir(dir.abs_path.as_path(), true); + // If directory, enter directory, otherwise check if symlink + match entry { + FsEntry::Directory(dir) => self.local_changedir(dir.abs_path.as_path(), true), + FsEntry::File(file) => { + // Check if symlink + if let Some(realpath) = &file.symlink { + // Stat realpath + match self.context.as_ref().unwrap().local.stat(realpath.as_path()) { + Ok(real_file) => { + // If real file is a directory, enter directory + if let FsEntry::Directory(real_dir) = real_file { + self.local_changedir(real_dir.abs_path.as_path(), true) + } + }, + Err(err) => self.log(LogLevel::Error, format!("Failed to stat file \"{}\": {}", realpath.display(), err).as_ref()) + } + } + } } } } @@ -1082,9 +1098,24 @@ impl FileTransferActivity { // Match selected file let files: Vec = self.remote.files.clone(); if let Some(entry) = files.get(self.remote.index) { - if let FsEntry::Directory(dir) = entry { - // Get current directory - self.remote_changedir(dir.abs_path.as_path(), true); + // If directory, enter directory; if file, check if is symlink + match entry { + FsEntry::Directory(dir) => self.remote_changedir(dir.abs_path.as_path(), true), + FsEntry::File(file) => { + // Check if symlink + if let Some(realpath) = &file.symlink { + // Stat realpath + match self.client.stat(realpath.as_path()) { + Ok(real_file) => { + // If real file is a directory, enter directory + if let FsEntry::Directory(real_dir) = real_file { + self.remote_changedir(real_dir.abs_path.as_path(), true) + } + }, + Err(err) => self.log(LogLevel::Error, format!("Failed to stat file \"{}\": {}", realpath.display(), err).as_ref()) + } + } + } } } }