mirror of
https://github.com/nushell/nushell
synced 2024-12-26 21:13:19 +00:00
remove -d and -t from touch (#6629)
* remove -d and -t from touch * remove unused test import
This commit is contained in:
parent
f2ad7fae1f
commit
ec711cb79d
2 changed files with 3 additions and 888 deletions
|
@ -1,7 +1,7 @@
|
||||||
use std::fs::OpenOptions;
|
use std::fs::OpenOptions;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use chrono::{DateTime, Datelike, Local};
|
use chrono::{DateTime, Local};
|
||||||
use filetime::FileTime;
|
use filetime::FileTime;
|
||||||
|
|
||||||
use nu_engine::CallExt;
|
use nu_engine::CallExt;
|
||||||
|
@ -9,13 +9,6 @@ use nu_protocol::ast::Call;
|
||||||
use nu_protocol::engine::{Command, EngineState, Stack};
|
use nu_protocol::engine::{Command, EngineState, Stack};
|
||||||
use nu_protocol::{Category, Example, PipelineData, ShellError, Signature, Spanned, SyntaxShape};
|
use nu_protocol::{Category, Example, PipelineData, ShellError, Signature, Spanned, SyntaxShape};
|
||||||
|
|
||||||
use crate::parse_date_from_string;
|
|
||||||
|
|
||||||
enum AddYear {
|
|
||||||
Full,
|
|
||||||
FirstDigits,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Touch;
|
pub struct Touch;
|
||||||
|
|
||||||
|
@ -35,18 +28,6 @@ impl Command for Touch {
|
||||||
SyntaxShape::Filepath,
|
SyntaxShape::Filepath,
|
||||||
"the path of the file you want to create",
|
"the path of the file you want to create",
|
||||||
)
|
)
|
||||||
.named(
|
|
||||||
"timestamp",
|
|
||||||
SyntaxShape::String,
|
|
||||||
"change the file or directory time to a timestamp. Format: [[CC]YY]MMDDhhmm[.ss]\n\n If neither YY or CC is given, the current year will be assumed. If YY is specified, but CC is not, CC will be derived as follows:\n \tIf YY is between [69, 99], CC is 19\n \tIf YY is between [00, 68], CC is 20\n Note: It is expected that in a future version of this standard the default century inferred from a 2-digit year will change",
|
|
||||||
Some('t'),
|
|
||||||
)
|
|
||||||
.named(
|
|
||||||
"date",
|
|
||||||
SyntaxShape::String,
|
|
||||||
"change the file or directory time to a date",
|
|
||||||
Some('d'),
|
|
||||||
)
|
|
||||||
.named(
|
.named(
|
||||||
"reference",
|
"reference",
|
||||||
SyntaxShape::String,
|
SyntaxShape::String,
|
||||||
|
@ -85,8 +66,6 @@ impl Command for Touch {
|
||||||
) -> Result<PipelineData, ShellError> {
|
) -> Result<PipelineData, ShellError> {
|
||||||
let mut change_mtime: bool = call.has_flag("modified");
|
let mut change_mtime: bool = call.has_flag("modified");
|
||||||
let mut change_atime: bool = call.has_flag("access");
|
let mut change_atime: bool = call.has_flag("access");
|
||||||
let use_stamp: bool = call.has_flag("timestamp");
|
|
||||||
let use_date: bool = call.has_flag("date");
|
|
||||||
let use_reference: bool = call.has_flag("reference");
|
let use_reference: bool = call.has_flag("reference");
|
||||||
let no_create: bool = call.has_flag("no-create");
|
let no_create: bool = call.has_flag("no-create");
|
||||||
let target: String = call.req(engine_state, stack, 0)?;
|
let target: String = call.req(engine_state, stack, 0)?;
|
||||||
|
@ -105,111 +84,6 @@ impl Command for Touch {
|
||||||
date = Some(Local::now());
|
date = Some(Local::now());
|
||||||
}
|
}
|
||||||
|
|
||||||
if use_stamp || use_date {
|
|
||||||
let (val, span) = if use_stamp {
|
|
||||||
let stamp: Option<Spanned<String>> =
|
|
||||||
call.get_flag(engine_state, stack, "timestamp")?;
|
|
||||||
let (stamp, span) = match stamp {
|
|
||||||
Some(stamp) => (stamp.item, stamp.span),
|
|
||||||
None => {
|
|
||||||
return Err(ShellError::MissingParameter(
|
|
||||||
"timestamp".to_string(),
|
|
||||||
call.head,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Checks for the seconds stamp and removes the '.' delimiter if any
|
|
||||||
let (val, has_sec): (String, bool) = match stamp.split_once('.') {
|
|
||||||
Some((dtime, sec)) => match sec.parse::<u8>() {
|
|
||||||
Ok(sec) if sec < 60 => (format!("{}{}", dtime, sec), true),
|
|
||||||
_ => {
|
|
||||||
return Err(ShellError::UnsupportedInput(
|
|
||||||
"input has an invalid timestamp".to_string(),
|
|
||||||
span,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
},
|
|
||||||
None => (stamp.to_string(), false),
|
|
||||||
};
|
|
||||||
|
|
||||||
let size = val.len();
|
|
||||||
|
|
||||||
// Each stamp is a 2 digit number and the whole stamp must not be less than 4 or greater than 7 pairs
|
|
||||||
if (size % 2 != 0 || !(8..=14).contains(&size)) || val.parse::<u64>().is_err() {
|
|
||||||
return Err(ShellError::UnsupportedInput(
|
|
||||||
"input has an invalid timestamp".to_string(),
|
|
||||||
span,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let add_year: Option<AddYear> = if has_sec {
|
|
||||||
match size {
|
|
||||||
10 => Some(AddYear::Full),
|
|
||||||
12 => Some(AddYear::FirstDigits),
|
|
||||||
14 => None,
|
|
||||||
_ => {
|
|
||||||
return Err(ShellError::UnsupportedInput(
|
|
||||||
"input has an invalid timestamp".to_string(),
|
|
||||||
span,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
match size {
|
|
||||||
8 => Some(AddYear::Full),
|
|
||||||
10 => Some(AddYear::FirstDigits),
|
|
||||||
12 => None,
|
|
||||||
_ => {
|
|
||||||
return Err(ShellError::UnsupportedInput(
|
|
||||||
"input has an invalid timestamp".to_string(),
|
|
||||||
span,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(add_year) = add_year {
|
|
||||||
let year = Local::now().year();
|
|
||||||
match add_year {
|
|
||||||
AddYear::Full => (format!("{}{}", year, val), span),
|
|
||||||
AddYear::FirstDigits => {
|
|
||||||
// Compliance with the Unix version of touch
|
|
||||||
let yy = val[0..2]
|
|
||||||
.parse::<u8>()
|
|
||||||
.expect("should be a valid 2 digit number");
|
|
||||||
let mut year = 20;
|
|
||||||
if (69..=99).contains(&yy) {
|
|
||||||
year = 19;
|
|
||||||
}
|
|
||||||
(format!("{}{}", year, val), span)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
(val, span)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let date_string: Option<Spanned<String>> =
|
|
||||||
call.get_flag(engine_state, stack, "date")?;
|
|
||||||
match date_string {
|
|
||||||
Some(date_string) => (date_string.item, date_string.span),
|
|
||||||
None => {
|
|
||||||
return Err(ShellError::MissingParameter("date".to_string(), call.head));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
date = if let Ok(parsed_date) = parse_date_from_string(&val, span) {
|
|
||||||
Some(parsed_date.into())
|
|
||||||
} else {
|
|
||||||
let flag = if use_stamp { "timestamp" } else { "date" };
|
|
||||||
return Err(ShellError::UnsupportedInput(
|
|
||||||
format!("input has an invalid {}", flag),
|
|
||||||
span,
|
|
||||||
));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if use_reference {
|
if use_reference {
|
||||||
let reference: Option<Spanned<String>> =
|
let reference: Option<Spanned<String>> =
|
||||||
call.get_flag(engine_state, stack, "reference")?;
|
call.get_flag(engine_state, stack, "reference")?;
|
||||||
|
@ -336,11 +210,6 @@ impl Command for Touch {
|
||||||
example: "touch -m fixture.json",
|
example: "touch -m fixture.json",
|
||||||
result: None,
|
result: None,
|
||||||
},
|
},
|
||||||
Example {
|
|
||||||
description: "Creates files d and e and set its last modified time to a timestamp",
|
|
||||||
example: "touch -m -t 201908241230.30 d e",
|
|
||||||
result: None,
|
|
||||||
},
|
|
||||||
Example {
|
Example {
|
||||||
description: "Changes the last modified time of files a, b and c to a date",
|
description: "Changes the last modified time of files a, b and c to a date",
|
||||||
example: r#"touch -m -d "yesterday" a b c"#,
|
example: r#"touch -m -d "yesterday" a b c"#,
|
||||||
|
@ -356,11 +225,6 @@ impl Command for Touch {
|
||||||
example: r#"touch -a -d "August 24, 2019; 12:30:30" fixture.json"#,
|
example: r#"touch -a -d "August 24, 2019; 12:30:30" fixture.json"#,
|
||||||
result: None,
|
result: None,
|
||||||
},
|
},
|
||||||
Example {
|
|
||||||
description: "Changes both last modified and accessed time of a, b and c to a timestamp only if they exist",
|
|
||||||
example: r#"touch -c -t 201908241230.30 a b c"#,
|
|
||||||
result: None,
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use chrono::{Date, DateTime, Local, TimeZone};
|
use chrono::{Date, DateTime, Local};
|
||||||
use nu_test_support::fs::Stub;
|
use nu_test_support::fs::Stub;
|
||||||
use nu_test_support::nu;
|
use nu_test_support::nu;
|
||||||
use nu_test_support::playground::Playground;
|
use nu_test_support::playground::Playground;
|
||||||
|
@ -32,185 +32,6 @@ fn creates_two_files() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_time_of_file() {
|
|
||||||
Playground::setup("change_time_test_3", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 201908241230.30 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn create_and_change_modified_time_of_file() {
|
|
||||||
Playground::setup("change_time_test_4", |dirs, _sandbox| {
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 201908241230 i_will_be_created.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("i_will_be_created.txt");
|
|
||||||
assert!(path.exists());
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 0);
|
|
||||||
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_time_of_file_no_year() {
|
|
||||||
Playground::setup("change_time_test_5", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 08241230.12 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2022, 8, 24).and_hms(12, 30, 12);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_time_of_file_no_year_no_second() {
|
|
||||||
Playground::setup("change_time_test_6", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 08241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2022, 8, 24).and_hms(12, 30, 0);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_time_of_files() {
|
|
||||||
Playground::setup("change_time_test_7", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![
|
|
||||||
Stub::EmptyFile("file.txt"),
|
|
||||||
Stub::EmptyFile("file2.txt"),
|
|
||||||
]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 1908241230.30 file.txt file2.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file2.txt");
|
|
||||||
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn errors_if_change_modified_time_of_file_with_invalid_timestamp() {
|
|
||||||
Playground::setup("change_time_test_8", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
let mut outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 1908241230.3030 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 1908241230.3O file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 08241230.3 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 8241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 01908241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 082412.3012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 0824.123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 08.24123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -t 0.824123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn change_modified_time_of_file_to_today() {
|
fn change_modified_time_of_file_to_today() {
|
||||||
Playground::setup("change_time_test_9", |dirs, sandbox| {
|
Playground::setup("change_time_test_9", |dirs, sandbox| {
|
||||||
|
@ -232,234 +53,6 @@ fn change_modified_time_of_file_to_today() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_time_to_date() {
|
|
||||||
Playground::setup("change_time_test_10", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -m -d "August 24, 2019; 12:30:30" file.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_time_to_time_of_reference() {
|
|
||||||
Playground::setup("change_time_test_11", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![
|
|
||||||
Stub::EmptyFile("file.txt"),
|
|
||||||
Stub::EmptyFile("reference.txt"),
|
|
||||||
]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -m -t 201908241230.30 reference.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -m -r reference.txt file.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
let ref_path = dirs.test().join("reference.txt");
|
|
||||||
|
|
||||||
let time: DateTime<Local> = DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
let ref_time: DateTime<Local> =
|
|
||||||
DateTime::from(ref_path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, ref_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_access_time_of_file() {
|
|
||||||
Playground::setup("change_time_test_12", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 201908241230.30 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn create_and_change_access_time_of_file() {
|
|
||||||
Playground::setup("change_time_test_13", |dirs, _sandbox| {
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 201908241230 i_will_be_created.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("i_will_be_created.txt");
|
|
||||||
assert!(path.exists());
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 0);
|
|
||||||
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_access_time_of_file_no_year() {
|
|
||||||
Playground::setup("change_time_test_14", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 08241230.12 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2022, 8, 24).and_hms(12, 30, 12);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_access_time_of_file_no_year_no_second() {
|
|
||||||
Playground::setup("change_time_test_15", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 08241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2022, 8, 24).and_hms(12, 30, 0);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_access_time_of_files() {
|
|
||||||
Playground::setup("change_time_test_16", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![
|
|
||||||
Stub::EmptyFile("file.txt"),
|
|
||||||
Stub::EmptyFile("file2.txt"),
|
|
||||||
]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 1908241230.30 file.txt file2.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file2.txt");
|
|
||||||
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn errors_if_change_access_time_of_file_with_invalid_timestamp() {
|
|
||||||
Playground::setup("change_time_test_17", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
let mut outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 1908241230.3030 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 1908241230.3O file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 08241230.3 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 8241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 01908241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 082412.3012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 0824.123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 08.24123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -t 0.824123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn change_access_time_of_file_to_today() {
|
fn change_access_time_of_file_to_today() {
|
||||||
Playground::setup("change_time_test_18", |dirs, sandbox| {
|
Playground::setup("change_time_test_18", |dirs, sandbox| {
|
||||||
|
@ -481,246 +74,6 @@ fn change_access_time_of_file_to_today() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_access_time_to_date() {
|
|
||||||
Playground::setup("change_time_test_19", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -a -d "August 24, 2019; 12:30:30" file.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let actual_time: DateTime<Local> =
|
|
||||||
DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, actual_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_access_time_to_time_of_reference() {
|
|
||||||
Playground::setup("change_time_test_20", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![
|
|
||||||
Stub::EmptyFile("file.txt"),
|
|
||||||
Stub::EmptyFile("reference.txt"),
|
|
||||||
]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -a -t 201908241230.30 reference.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -a -r reference.txt file.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
let ref_path = dirs.test().join("reference.txt");
|
|
||||||
|
|
||||||
let time: DateTime<Local> = DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
let ref_time: DateTime<Local> =
|
|
||||||
DateTime::from(ref_path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, ref_time);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_and_access_time_of_file() {
|
|
||||||
Playground::setup("change_time_test_21", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -a -t 201908241230.30 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
let metadata = path.metadata().unwrap();
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let atime: DateTime<Local> = DateTime::from(metadata.accessed().unwrap());
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(metadata.modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, atime);
|
|
||||||
assert_eq!(time, mtime);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn create_and_change_modified_and_access_time_of_file() {
|
|
||||||
Playground::setup("change_time_test_22", |dirs, _sandbox| {
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -t 201908241230 i_will_be_created.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = dirs.test().join("i_will_be_created.txt");
|
|
||||||
assert!(path.exists());
|
|
||||||
|
|
||||||
let metadata = path.metadata().unwrap();
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 0);
|
|
||||||
|
|
||||||
let atime: DateTime<Local> = DateTime::from(metadata.accessed().unwrap());
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(metadata.modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, atime);
|
|
||||||
assert_eq!(time, mtime);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_and_access_time_of_file_no_year() {
|
|
||||||
Playground::setup("change_time_test_23", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -m -t 08241230.12 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let metadata = dirs.test().join("file.txt").metadata().unwrap();
|
|
||||||
|
|
||||||
let time = Local.ymd(2022, 8, 24).and_hms(12, 30, 12);
|
|
||||||
|
|
||||||
let atime: DateTime<Local> = DateTime::from(metadata.accessed().unwrap());
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(metadata.modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, atime);
|
|
||||||
assert_eq!(time, mtime);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_and_access_time_of_file_no_year_no_second() {
|
|
||||||
Playground::setup("change_time_test_24", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -t 08241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let metadata = dirs.test().join("file.txt").metadata().unwrap();
|
|
||||||
|
|
||||||
let time = Local.ymd(2022, 8, 24).and_hms(12, 30, 0);
|
|
||||||
|
|
||||||
let atime: DateTime<Local> = DateTime::from(metadata.accessed().unwrap());
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(metadata.modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, atime);
|
|
||||||
assert_eq!(time, mtime);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_and_access_time_of_files() {
|
|
||||||
Playground::setup("change_time_test_25", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![
|
|
||||||
Stub::EmptyFile("file.txt"),
|
|
||||||
Stub::EmptyFile("file2.txt"),
|
|
||||||
]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -m -t 1908241230.30 file.txt file2.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
let metadata = dirs.test().join("file.txt").metadata().unwrap();
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let atime: DateTime<Local> = DateTime::from(metadata.accessed().unwrap());
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(metadata.modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, atime);
|
|
||||||
assert_eq!(time, mtime);
|
|
||||||
|
|
||||||
let metadata = dirs.test().join("file2.txt").metadata().unwrap();
|
|
||||||
|
|
||||||
let atime: DateTime<Local> = DateTime::from(metadata.accessed().unwrap());
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(metadata.modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, atime);
|
|
||||||
assert_eq!(time, mtime);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn errors_if_change_modified_and_access_time_of_file_with_invalid_timestamp() {
|
|
||||||
Playground::setup("change_time_test_26", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
let mut outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -t 1908241230.3030 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -a -m -t 1908241230.3O file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -t 08241230.3 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -a -t 8241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -t 01908241230 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -a -t 082412.3012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -a -t 0824.123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -a -t 08.24123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
"touch -m -a -t 0.824123012 file.txt"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn change_modified_and_access_time_of_file_to_today() {
|
fn change_modified_and_access_time_of_file_to_today() {
|
||||||
Playground::setup("change_time_test_27", |dirs, sandbox| {
|
Playground::setup("change_time_test_27", |dirs, sandbox| {
|
||||||
|
@ -743,97 +96,12 @@ fn change_modified_and_access_time_of_file_to_today() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_and_access_time_to_date() {
|
|
||||||
Playground::setup("change_time_test_28", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![Stub::EmptyFile("file.txt")]);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -d "August 24, 2019; 12:30:30" file.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
let metadata = dirs.test().join("file.txt").metadata().unwrap();
|
|
||||||
|
|
||||||
let time = Local.ymd(2019, 8, 24).and_hms(12, 30, 30);
|
|
||||||
let atime: DateTime<Local> = DateTime::from(metadata.accessed().unwrap());
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(metadata.modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(time, atime);
|
|
||||||
assert_eq!(time, mtime);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn change_modified_and_access_time_to_time_of_reference() {
|
|
||||||
Playground::setup("change_time_test_29", |dirs, sandbox| {
|
|
||||||
sandbox.with_files(vec![
|
|
||||||
Stub::EmptyFile("file.txt"),
|
|
||||||
Stub::EmptyFile("reference.txt"),
|
|
||||||
]);
|
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
|
||||||
let ref_path = dirs.test().join("reference.txt");
|
|
||||||
|
|
||||||
// Set the same time for the modified and access time of the reference file
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -a -m -t 201908241230.30 reference.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -r reference.txt file.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
let atime: DateTime<Local> = DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
let ref_atime: DateTime<Local> =
|
|
||||||
DateTime::from(ref_path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(atime, ref_atime);
|
|
||||||
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
let ref_mtime: DateTime<Local> =
|
|
||||||
DateTime::from(ref_path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(mtime, ref_mtime);
|
|
||||||
|
|
||||||
// Set different time for the modified and access time of the reference file
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -a -t 201908241230.30 reference.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -m -t 202009251340.40 reference.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -a -m -r reference.txt file.txt"#
|
|
||||||
);
|
|
||||||
|
|
||||||
let atime: DateTime<Local> = DateTime::from(path.metadata().unwrap().accessed().unwrap());
|
|
||||||
let ref_atime: DateTime<Local> =
|
|
||||||
DateTime::from(ref_path.metadata().unwrap().accessed().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(atime, ref_atime);
|
|
||||||
|
|
||||||
let mtime: DateTime<Local> = DateTime::from(path.metadata().unwrap().modified().unwrap());
|
|
||||||
let ref_mtime: DateTime<Local> =
|
|
||||||
DateTime::from(ref_path.metadata().unwrap().modified().unwrap());
|
|
||||||
|
|
||||||
assert_eq!(mtime, ref_mtime);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn not_create_file_if_it_not_exists() {
|
fn not_create_file_if_it_not_exists() {
|
||||||
Playground::setup("change_time_test_28", |dirs, _sandbox| {
|
Playground::setup("change_time_test_28", |dirs, _sandbox| {
|
||||||
nu!(
|
nu!(
|
||||||
cwd: dirs.test(),
|
cwd: dirs.test(),
|
||||||
r#"touch -c -d "August 24, 2019; 12:30:30" file.txt"#
|
r#"touch -c file.txt"#
|
||||||
);
|
);
|
||||||
|
|
||||||
let path = dirs.test().join("file.txt");
|
let path = dirs.test().join("file.txt");
|
||||||
|
@ -850,20 +118,3 @@ fn not_create_file_if_it_not_exists() {
|
||||||
assert!(!path.exists());
|
assert!(!path.exists());
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_invalid_timestamp() {
|
|
||||||
Playground::setup("test_invalid_timestamp", |dirs, _sandbox| {
|
|
||||||
let outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -t 20220729. file.txt"#
|
|
||||||
);
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
|
|
||||||
let outcome = nu!(
|
|
||||||
cwd: dirs.test(),
|
|
||||||
r#"touch -t 20220729120099 file.txt"#
|
|
||||||
);
|
|
||||||
assert!(outcome.err.contains("input has an invalid timestamp"));
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue