Skip to content

Commit

Permalink
Fix scp download cannot autorename
Browse files Browse the repository at this point in the history
  • Loading branch information
HsuJv committed Nov 3, 2022
1 parent 5f3af27 commit d79c25f
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 9 deletions.
2 changes: 1 addition & 1 deletion examples/exec/src/main.rs
@@ -1,4 +1,4 @@
use ssh_rs::{ssh, ChannelExec, Session};
use ssh_rs::{ssh, ChannelExec};

fn main() {
let mut session = ssh::create_session();
Expand Down
76 changes: 71 additions & 5 deletions examples/scp/src/main.rs
@@ -1,16 +1,72 @@
use ssh_rs::{ssh, Channel, ChannelScp, Session};
use ssh_rs::{ssh, ChannelScp};

fn main() {
ssh::is_enable_log(true);
let mut session = ssh::create_session();
session.set_user_and_password("ubuntu", "password");
session.connect("127.0.0.1:22").unwrap();
// Usage 1
// let scp: ChannelScp = session.open_scp().unwrap();
// scp.upload("local path", "remote path").unwrap();

// upload a file
let scp: ChannelScp = session.open_scp().unwrap();
scp.upload("./src/main.rs", "./").unwrap();
assert_file("/home/ubuntu/main.rs");

// upload with a rename
let scp: ChannelScp = session.open_scp().unwrap();
scp.upload("./src/main.rs", "./abc").unwrap();
assert_file("/home/ubuntu/abc");

// upload to an implicit dir
let scp: ChannelScp = session.open_scp().unwrap();
scp.upload("./src/main.rs", "./test").unwrap();
assert_file("/home/ubuntu/test/main.rs");

// upload a dir
let scp: ChannelScp = session.open_scp().unwrap();
scp.upload("./src", "./test").unwrap();
assert_file("/home/ubuntu/test/src/main.rs");
assert_file("/home/ubuntu/test/src");

// upload a with a rename
let scp: ChannelScp = session.open_scp().unwrap();
scp.upload("./src", "./crs").unwrap();
assert_file("/home/ubuntu/crs/main.rs");
assert_file("/home/ubuntu/crs");

// download a file
let scp: ChannelScp = session.open_scp().unwrap();
scp.download("./", "test/a").unwrap();
assert_file("./a");

// download with a rename
let scp: ChannelScp = session.open_scp().unwrap();
scp.download("local path", "remote path").unwrap();
scp.download("./b", "test/a").unwrap();
assert_file("./b");

// download to an implicit dir
let scp: ChannelScp = session.open_scp().unwrap();
let _ = std::fs::create_dir("dir");
scp.download("./dir", "test/a").unwrap();
assert_file("./dir/a");
assert_file("./dir");

// download a dir
let scp: ChannelScp = session.open_scp().unwrap();
scp.download("./", "test").unwrap();
assert_file("./test/a");
assert_file("./test");

// download with a rename
let scp: ChannelScp = session.open_scp().unwrap();
scp.download("./dir2", "test").unwrap();
assert_file("./dir2/a");
assert_file("./dir2");

// download with a rename #2
let scp: ChannelScp = session.open_scp().unwrap();
scp.download("./dir2/", "test").unwrap();
assert_file("./dir2/a");
assert_file("./dir2");

// Usage 2
// let channel: Channel = session.open_channel().unwrap();
Expand All @@ -23,3 +79,13 @@ fn main() {

session.close().unwrap();
}

fn assert_file(filename: &str) {
let file = std::path::Path::new(filename);

println!("Assert {}", filename);
assert!(file.exists());

let _ = std::fs::remove_file(file);
let _ = std::fs::remove_dir(file);
}
2 changes: 1 addition & 1 deletion examples/shell/src/main.rs
@@ -1,4 +1,4 @@
use ssh_rs::{ssh, Channel, ChannelShell, Session};
use ssh_rs::{ssh, Channel, ChannelShell};
use std::thread::sleep;
use std::time::Duration;

Expand Down
8 changes: 8 additions & 0 deletions src/channel_scp.rs
Expand Up @@ -130,4 +130,12 @@ impl ScpFile {
local_path: Default::default(),
}
}

pub(crate) fn join(&self, filename: &str) -> PathBuf {
if self.local_path.is_dir() {
self.local_path.join(filename)
} else {
self.local_path.clone()
}
}
}
4 changes: 2 additions & 2 deletions src/channel_scp_d.rs
Expand Up @@ -90,7 +90,7 @@ impl ChannelScp {
Some(v) => scp_file.name = v.to_string(),
}
scp_file.is_dir = true;
let buf = scp_file.local_path.join(&scp_file.name);
let buf = scp_file.join(&scp_file.name);
log::debug!(
"name: [{}] size: [0], type: [dir] start download.",
scp_file.name
Expand Down Expand Up @@ -149,7 +149,7 @@ impl ChannelScp {
scp_file.name,
scp_file.size
);
let path = scp_file.local_path.join(scp_file.name.as_str());
let path = scp_file.join(&scp_file.name);
if path.exists() {
fs::remove_file(path.as_path())?;
}
Expand Down

0 comments on commit d79c25f

Please sign in to comment.