forked from extern/nushell
Add back --append
flag to save
command (#4744)
This commit is contained in:
parent
a4a8f5df54
commit
1527b34d9c
@ -24,6 +24,7 @@ impl Command for Save {
|
|||||||
Signature::build("save")
|
Signature::build("save")
|
||||||
.required("filename", SyntaxShape::Filepath, "the filename to use")
|
.required("filename", SyntaxShape::Filepath, "the filename to use")
|
||||||
.switch("raw", "save file as raw binary", Some('r'))
|
.switch("raw", "save file as raw binary", Some('r'))
|
||||||
|
.switch("append", "append input to the end of the file", None)
|
||||||
.category(Category::FileSystem)
|
.category(Category::FileSystem)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,6 +36,7 @@ impl Command for Save {
|
|||||||
input: PipelineData,
|
input: PipelineData,
|
||||||
) -> Result<nu_protocol::PipelineData, nu_protocol::ShellError> {
|
) -> Result<nu_protocol::PipelineData, nu_protocol::ShellError> {
|
||||||
let raw = call.has_flag("raw");
|
let raw = call.has_flag("raw");
|
||||||
|
let append = call.has_flag("append");
|
||||||
|
|
||||||
let span = call.head;
|
let span = call.head;
|
||||||
|
|
||||||
@ -42,7 +44,15 @@ impl Command for Save {
|
|||||||
let arg_span = path.span;
|
let arg_span = path.span;
|
||||||
let path = Path::new(&path.item);
|
let path = Path::new(&path.item);
|
||||||
|
|
||||||
let mut file = match std::fs::File::create(path) {
|
let file = match (append, path.exists()) {
|
||||||
|
(true, true) => std::fs::OpenOptions::new()
|
||||||
|
.write(true)
|
||||||
|
.append(true)
|
||||||
|
.open(path),
|
||||||
|
_ => std::fs::File::create(path),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut file = match file {
|
||||||
Ok(file) => file,
|
Ok(file) => file,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
return Ok(PipelineData::Value(
|
return Ok(PipelineData::Value(
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
use nu_test_support::fs::{file_contents, Stub::FileWithContent};
|
use nu_test_support::fs::{file_contents, Stub::FileWithContent};
|
||||||
use nu_test_support::nu;
|
use nu_test_support::nu;
|
||||||
use nu_test_support::playground::Playground;
|
use nu_test_support::playground::Playground;
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn figures_out_intelligently_where_to_write_out_with_metadata() {
|
fn figures_out_intelligently_where_to_write_out_with_metadata() {
|
||||||
@ -48,8 +49,6 @@ fn writes_out_csv() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: jt: needs more work
|
|
||||||
#[ignore]
|
|
||||||
#[test]
|
#[test]
|
||||||
fn save_append_will_create_file_if_not_exists() {
|
fn save_append_will_create_file_if_not_exists() {
|
||||||
Playground::setup("save_test_3", |dirs, sandbox| {
|
Playground::setup("save_test_3", |dirs, sandbox| {
|
||||||
@ -64,6 +63,31 @@ fn save_append_will_create_file_if_not_exists() {
|
|||||||
|
|
||||||
let actual = file_contents(expected_file);
|
let actual = file_contents(expected_file);
|
||||||
println!("{}", actual);
|
println!("{}", actual);
|
||||||
assert!(actual == "hello");
|
assert_eq!(actual, "hello");
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn save_append_will_not_overwrite_content() {
|
||||||
|
Playground::setup("save_test_4", |dirs, sandbox| {
|
||||||
|
sandbox.with_files(vec![]);
|
||||||
|
|
||||||
|
let expected_file = dirs.test().join("new-file.txt");
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut file =
|
||||||
|
std::fs::File::create(&expected_file).expect("Failed to create test file");
|
||||||
|
file.write_all("hello ".as_bytes())
|
||||||
|
.expect("Failed to write to test file")
|
||||||
|
}
|
||||||
|
|
||||||
|
nu!(
|
||||||
|
cwd: dirs.root(),
|
||||||
|
r#"echo world | save --append save_test_4/new-file.txt"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
let actual = file_contents(expected_file);
|
||||||
|
println!("{}", actual);
|
||||||
|
assert_eq!(actual, "hello world");
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user