mirror of
https://github.com/veeso/termscp.git
synced 2025-12-07 09:36:00 -08:00
absolutize path common functions
This commit is contained in:
@@ -28,6 +28,7 @@
|
|||||||
use super::{FileTransfer, FileTransferError, FileTransferErrorType};
|
use super::{FileTransfer, FileTransferError, FileTransferErrorType};
|
||||||
use crate::fs::{FsDirectory, FsEntry, FsFile, UnixPex};
|
use crate::fs::{FsDirectory, FsEntry, FsFile, UnixPex};
|
||||||
use crate::utils::fmt::shadow_password;
|
use crate::utils::fmt::shadow_password;
|
||||||
|
use crate::utils::path;
|
||||||
|
|
||||||
// Includes
|
// Includes
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
@@ -125,14 +126,7 @@ impl FtpFileTransfer {
|
|||||||
None => None,
|
None => None,
|
||||||
Some(p) => {
|
Some(p) => {
|
||||||
// Make abs path
|
// Make abs path
|
||||||
let abs_path: PathBuf = match p.is_absolute() {
|
let abs_path: PathBuf = path::absolutize(wrkdir, p);
|
||||||
true => p.to_path_buf(),
|
|
||||||
false => {
|
|
||||||
let mut abs = wrkdir.to_path_buf();
|
|
||||||
abs.push(p);
|
|
||||||
abs
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Some(Box::new(FsEntry::File(FsFile {
|
Some(Box::new(FsEntry::File(FsFile {
|
||||||
name: p
|
name: p
|
||||||
.file_name()
|
.file_name()
|
||||||
|
|||||||
@@ -76,6 +76,21 @@ impl ScpFileTransfer {
|
|||||||
p.to_path_buf()
|
p.to_path_buf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ### absolutize
|
||||||
|
///
|
||||||
|
/// Absolutize target path if relative.
|
||||||
|
/// This also converts backslashes to slashes if relative
|
||||||
|
fn absolutize(wrkdir: &Path, target: &Path) -> PathBuf {
|
||||||
|
match target.is_absolute() {
|
||||||
|
true => target.to_path_buf(),
|
||||||
|
false => {
|
||||||
|
let mut p: PathBuf = wrkdir.to_path_buf();
|
||||||
|
p.push(target);
|
||||||
|
Self::resolve(p.as_path())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// ### parse_ls_output
|
/// ### parse_ls_output
|
||||||
///
|
///
|
||||||
/// Parse a line of `ls -l` output and tokenize the output into a `FsEntry`
|
/// Parse a line of `ls -l` output and tokenize the output into a `FsEntry`
|
||||||
@@ -506,14 +521,7 @@ impl FileTransfer for ScpFileTransfer {
|
|||||||
match self.is_connected() {
|
match self.is_connected() {
|
||||||
true => {
|
true => {
|
||||||
let p: PathBuf = self.wrkdir.clone();
|
let p: PathBuf = self.wrkdir.clone();
|
||||||
let remote_path: PathBuf = match dir.is_absolute() {
|
let remote_path: PathBuf = Self::absolutize(&Path::new("."), dir);
|
||||||
true => PathBuf::from(dir),
|
|
||||||
false => {
|
|
||||||
let mut p: PathBuf = PathBuf::from(".");
|
|
||||||
p.push(dir);
|
|
||||||
Self::resolve(p.as_path())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
info!("Changing working directory to {}", remote_path.display());
|
info!("Changing working directory to {}", remote_path.display());
|
||||||
// Change directory
|
// Change directory
|
||||||
match self.perform_shell_cmd_with_path(
|
match self.perform_shell_cmd_with_path(
|
||||||
@@ -774,14 +782,7 @@ impl FileTransfer for ScpFileTransfer {
|
|||||||
///
|
///
|
||||||
/// Stat file and return FsEntry
|
/// Stat file and return FsEntry
|
||||||
fn stat(&mut self, path: &Path) -> Result<FsEntry, FileTransferError> {
|
fn stat(&mut self, path: &Path) -> Result<FsEntry, FileTransferError> {
|
||||||
let path: PathBuf = match path.is_absolute() {
|
let path: PathBuf = Self::absolutize(self.wrkdir.as_path(), path);
|
||||||
true => PathBuf::from(path),
|
|
||||||
false => {
|
|
||||||
let mut p: PathBuf = self.wrkdir.clone();
|
|
||||||
p.push(path);
|
|
||||||
Self::resolve(p.as_path())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
match self.is_connected() {
|
match self.is_connected() {
|
||||||
true => {
|
true => {
|
||||||
let p: PathBuf = self.wrkdir.clone();
|
let p: PathBuf = self.wrkdir.clone();
|
||||||
@@ -857,15 +858,7 @@ impl FileTransfer for ScpFileTransfer {
|
|||||||
) -> Result<Box<dyn Write>, FileTransferError> {
|
) -> Result<Box<dyn Write>, FileTransferError> {
|
||||||
match self.session.as_ref() {
|
match self.session.as_ref() {
|
||||||
Some(session) => {
|
Some(session) => {
|
||||||
let file_name: PathBuf = match file_name.is_absolute() {
|
let file_name: PathBuf = Self::absolutize(self.wrkdir.as_path(), file_name);
|
||||||
true => PathBuf::from(file_name),
|
|
||||||
false => {
|
|
||||||
let mut p: PathBuf = self.wrkdir.clone();
|
|
||||||
p.push(file_name);
|
|
||||||
Self::resolve(p.as_path())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let file_name: PathBuf = Self::resolve(file_name.as_path());
|
|
||||||
info!(
|
info!(
|
||||||
"Sending file {} to {}",
|
"Sending file {} to {}",
|
||||||
local.abs_path.display(),
|
local.abs_path.display(),
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ use std::os::unix::fs::{MetadataExt, PermissionsExt};
|
|||||||
|
|
||||||
// Locals
|
// Locals
|
||||||
use crate::fs::{FsDirectory, FsEntry, FsFile, UnixPex};
|
use crate::fs::{FsDirectory, FsEntry, FsFile, UnixPex};
|
||||||
|
use crate::utils::path;
|
||||||
|
|
||||||
/// ## HostErrorType
|
/// ## HostErrorType
|
||||||
///
|
///
|
||||||
@@ -803,15 +804,7 @@ impl Localhost {
|
|||||||
///
|
///
|
||||||
/// Convert path to absolute path
|
/// Convert path to absolute path
|
||||||
fn to_abs_path(&self, p: &Path) -> PathBuf {
|
fn to_abs_path(&self, p: &Path) -> PathBuf {
|
||||||
// Convert to abs path
|
path::absolutize(self.wrkdir.as_path(), p)
|
||||||
match p.is_relative() {
|
|
||||||
true => {
|
|
||||||
let mut path: PathBuf = self.wrkdir.clone();
|
|
||||||
path.push(p);
|
|
||||||
path
|
|
||||||
}
|
|
||||||
false => PathBuf::from(p),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
use super::{ConfigClient, FileTransferActivity, LogLevel, LogRecord};
|
use super::{ConfigClient, FileTransferActivity, LogLevel, LogRecord};
|
||||||
use crate::system::environment;
|
use crate::system::environment;
|
||||||
use crate::system::sshkey_storage::SshKeyStorage;
|
use crate::system::sshkey_storage::SshKeyStorage;
|
||||||
|
use crate::utils::path;
|
||||||
// Ext
|
// Ext
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
@@ -124,27 +125,13 @@ impl FileTransferActivity {
|
|||||||
///
|
///
|
||||||
/// Convert a path to absolute according to local explorer
|
/// Convert a path to absolute according to local explorer
|
||||||
pub(super) fn local_to_abs_path(&self, path: &Path) -> PathBuf {
|
pub(super) fn local_to_abs_path(&self, path: &Path) -> PathBuf {
|
||||||
match path.is_relative() {
|
path::absolutize(self.local().wrkdir.as_path(), path)
|
||||||
true => {
|
|
||||||
let mut d: PathBuf = self.local().wrkdir.clone();
|
|
||||||
d.push(path);
|
|
||||||
d
|
|
||||||
}
|
|
||||||
false => path.to_path_buf(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ### remote_to_abs_path
|
/// ### remote_to_abs_path
|
||||||
///
|
///
|
||||||
/// Convert a path to absolute according to remote explorer
|
/// Convert a path to absolute according to remote explorer
|
||||||
pub(super) fn remote_to_abs_path(&self, path: &Path) -> PathBuf {
|
pub(super) fn remote_to_abs_path(&self, path: &Path) -> PathBuf {
|
||||||
match path.is_relative() {
|
path::absolutize(self.remote().wrkdir.as_path(), path)
|
||||||
true => {
|
|
||||||
let mut wrkdir: PathBuf = self.remote().wrkdir.clone();
|
|
||||||
wrkdir.push(path);
|
|
||||||
wrkdir
|
|
||||||
}
|
|
||||||
false => path.to_path_buf(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ pub mod file;
|
|||||||
pub mod fmt;
|
pub mod fmt;
|
||||||
pub mod git;
|
pub mod git;
|
||||||
pub mod parser;
|
pub mod parser;
|
||||||
|
pub mod path;
|
||||||
pub mod random;
|
pub mod random;
|
||||||
pub mod ui;
|
pub mod ui;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user