mirror of
https://github.com/veeso/termscp.git
synced 2025-12-07 01:26:04 -08:00
Create new file with <N>
This commit is contained in:
@@ -35,7 +35,9 @@ FIXME: Released on
|
|||||||
- Enhancements:
|
- Enhancements:
|
||||||
- Replaced `sha256` sum with last modification time check, to verify if a file has been changed in the text editor
|
- Replaced `sha256` sum with last modification time check, to verify if a file has been changed in the text editor
|
||||||
- Default protocol changed to default protocol in configuration when providing address as CLI argument
|
- Default protocol changed to default protocol in configuration when providing address as CLI argument
|
||||||
- dependencies:
|
- Keybindings:
|
||||||
|
- `N`: New file
|
||||||
|
- Dependencies:
|
||||||
- removed `data-encoding`
|
- removed `data-encoding`
|
||||||
- updated `rand` to `0.8.0`
|
- updated `rand` to `0.8.0`
|
||||||
- removed `ring`
|
- removed `ring`
|
||||||
|
|||||||
@@ -297,6 +297,7 @@ You can access the SSH key storage, from configuration moving to the `SSH Keys`
|
|||||||
| `<H>` | Show help | Help |
|
| `<H>` | Show help | Help |
|
||||||
| `<I>` | Show info about selected file or directory | Info |
|
| `<I>` | Show info about selected file or directory | Info |
|
||||||
| `<L>` | Reload current directory's content | List |
|
| `<L>` | Reload current directory's content | List |
|
||||||
|
| `<N>` | Create new file with provided name | New |
|
||||||
| `<O>` | Edit file; see [Text editor](#text-editor-) | Open |
|
| `<O>` | Edit file; see [Text editor](#text-editor-) | Open |
|
||||||
| `<Q>` | Quit TermSCP | Quit |
|
| `<Q>` | Quit TermSCP | Quit |
|
||||||
| `<R>` | Rename file | Rename |
|
| `<R>` | Rename file | Rename |
|
||||||
|
|||||||
@@ -19,8 +19,9 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Locals
|
||||||
use super::{FileExplorerTab, FileTransferActivity, FsEntry, LogLevel};
|
use super::{FileExplorerTab, FileTransferActivity, FsEntry, LogLevel};
|
||||||
|
// Ext
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
impl FileTransferActivity {
|
impl FileTransferActivity {
|
||||||
@@ -371,4 +372,98 @@ impl FileTransferActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ### callback_new_file
|
||||||
|
///
|
||||||
|
/// Create a new file in current directory with `input` as name
|
||||||
|
pub(super) fn callback_new_file(&mut self, input: String) {
|
||||||
|
match self.tab {
|
||||||
|
FileExplorerTab::Local => {
|
||||||
|
// Check if file exists
|
||||||
|
for file in self.local.files.iter() {
|
||||||
|
if input == file.get_name() {
|
||||||
|
self.log_and_alert(
|
||||||
|
LogLevel::Warn,
|
||||||
|
format!("File \"{}\" already exists", input,),
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Create file
|
||||||
|
let file_path: PathBuf = PathBuf::from(input.as_str());
|
||||||
|
if let Some(ctx) = self.context.as_mut() {
|
||||||
|
if let Err(err) = ctx.local.open_file_write(file_path.as_path()) {
|
||||||
|
self.log_and_alert(
|
||||||
|
LogLevel::Error,
|
||||||
|
format!("Could not create file \"{}\": {}", file_path.display(), err),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Reload files
|
||||||
|
let path: PathBuf = self.local.wrkdir.clone();
|
||||||
|
self.local_scan(path.as_path());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FileExplorerTab::Remote => {
|
||||||
|
// Check if file exists
|
||||||
|
for file in self.remote.files.iter() {
|
||||||
|
if input == file.get_name() {
|
||||||
|
self.log_and_alert(
|
||||||
|
LogLevel::Warn,
|
||||||
|
format!("File \"{}\" already exists", input,),
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Get path on remote
|
||||||
|
let file_path: PathBuf = PathBuf::from(input.as_str());
|
||||||
|
// Create file (on local)
|
||||||
|
match tempfile::NamedTempFile::new() {
|
||||||
|
Err(err) => self.log_and_alert(
|
||||||
|
LogLevel::Error,
|
||||||
|
format!("Could not create tempfile: {}", err),
|
||||||
|
),
|
||||||
|
Ok(tfile) => {
|
||||||
|
// Stat tempfile
|
||||||
|
if let Some(ctx) = self.context.as_mut() {
|
||||||
|
let local_file: FsEntry = match ctx.local.stat(tfile.path()) {
|
||||||
|
Err(err) => {
|
||||||
|
self.log_and_alert(
|
||||||
|
LogLevel::Error,
|
||||||
|
format!("Could not stat tempfile: {}", err),
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Ok(f) => f,
|
||||||
|
};
|
||||||
|
if let FsEntry::File(local_file) = local_file {
|
||||||
|
// Create file
|
||||||
|
match self.client.send_file(&local_file, file_path.as_path()) {
|
||||||
|
Err(err) => self.log_and_alert(
|
||||||
|
LogLevel::Error,
|
||||||
|
format!(
|
||||||
|
"Could not create file \"{}\": {}",
|
||||||
|
file_path.display(),
|
||||||
|
err
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Ok(writer) => {
|
||||||
|
// Finalize write
|
||||||
|
if let Err(err) = self.client.on_sent(writer) {
|
||||||
|
self.log_and_alert(
|
||||||
|
LogLevel::Warn,
|
||||||
|
format!("Could not finalize file: {}", err),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Reload files
|
||||||
|
let path: PathBuf = self.remote.wrkdir.clone();
|
||||||
|
self.remote_scan(path.as_path());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -228,6 +228,13 @@ impl FileTransferActivity {
|
|||||||
let pwd: PathBuf = self.local.wrkdir.clone();
|
let pwd: PathBuf = self.local.wrkdir.clone();
|
||||||
self.local_scan(pwd.as_path());
|
self.local_scan(pwd.as_path());
|
||||||
}
|
}
|
||||||
|
'n' | 'N' => {
|
||||||
|
// New file
|
||||||
|
self.input_mode = InputMode::Popup(PopupType::Input(
|
||||||
|
String::from("New file"),
|
||||||
|
Self::callback_new_file,
|
||||||
|
));
|
||||||
|
}
|
||||||
'o' | 'O' => {
|
'o' | 'O' => {
|
||||||
// Edit local file
|
// Edit local file
|
||||||
if self.local.files.get(self.local.index).is_some() {
|
if self.local.files.get(self.local.index).is_some() {
|
||||||
@@ -446,6 +453,13 @@ impl FileTransferActivity {
|
|||||||
// Reload file entries
|
// Reload file entries
|
||||||
self.reload_remote_dir();
|
self.reload_remote_dir();
|
||||||
}
|
}
|
||||||
|
'n' | 'N' => {
|
||||||
|
// New file
|
||||||
|
self.input_mode = InputMode::Popup(PopupType::Input(
|
||||||
|
String::from("New file"),
|
||||||
|
Self::callback_new_file,
|
||||||
|
));
|
||||||
|
}
|
||||||
'o' | 'O' => {
|
'o' | 'O' => {
|
||||||
// Edit remote file
|
// Edit remote file
|
||||||
if self.remote.files.get(self.remote.index).is_some() {
|
if self.remote.files.get(self.remote.index).is_some() {
|
||||||
|
|||||||
Reference in New Issue
Block a user