|
@@ -6,6 +6,7 @@ use output::time::TimeFormat;
|
|
|
use options::{flags, Misfire, Vars};
|
|
use options::{flags, Misfire, Vars};
|
|
|
use options::parser::MatchedFlags;
|
|
use options::parser::MatchedFlags;
|
|
|
|
|
|
|
|
|
|
+use fs::PlatformMetadata;
|
|
|
use fs::feature::xattr;
|
|
use fs::feature::xattr;
|
|
|
|
|
|
|
|
|
|
|
|
@@ -296,38 +297,58 @@ impl TimeTypes {
|
|
|
fn deduce(matches: &MatchedFlags) -> Result<TimeTypes, Misfire> {
|
|
fn deduce(matches: &MatchedFlags) -> Result<TimeTypes, Misfire> {
|
|
|
let possible_word = matches.get(&flags::TIME)?;
|
|
let possible_word = matches.get(&flags::TIME)?;
|
|
|
let modified = matches.has(&flags::MODIFIED)?;
|
|
let modified = matches.has(&flags::MODIFIED)?;
|
|
|
- let created = matches.has(&flags::CREATED)?;
|
|
|
|
|
|
|
+ let changed = matches.has(&flags::CHANGED)?;
|
|
|
let accessed = matches.has(&flags::ACCESSED)?;
|
|
let accessed = matches.has(&flags::ACCESSED)?;
|
|
|
|
|
+ let created = matches.has(&flags::CREATED)?;
|
|
|
|
|
|
|
|
- if let Some(word) = possible_word {
|
|
|
|
|
|
|
+ let time_types = if let Some(word) = possible_word {
|
|
|
if modified {
|
|
if modified {
|
|
|
- Err(Misfire::Useless(&flags::MODIFIED, true, &flags::TIME))
|
|
|
|
|
|
|
+ return Err(Misfire::Useless(&flags::MODIFIED, true, &flags::TIME));
|
|
|
}
|
|
}
|
|
|
- else if created {
|
|
|
|
|
- Err(Misfire::Useless(&flags::CREATED, true, &flags::TIME))
|
|
|
|
|
|
|
+ else if changed {
|
|
|
|
|
+ return Err(Misfire::Useless(&flags::CHANGED, true, &flags::TIME));
|
|
|
}
|
|
}
|
|
|
else if accessed {
|
|
else if accessed {
|
|
|
- Err(Misfire::Useless(&flags::ACCESSED, true, &flags::TIME))
|
|
|
|
|
|
|
+ return Err(Misfire::Useless(&flags::ACCESSED, true, &flags::TIME));
|
|
|
|
|
+ }
|
|
|
|
|
+ else if created {
|
|
|
|
|
+ return Err(Misfire::Useless(&flags::CREATED, true, &flags::TIME));
|
|
|
}
|
|
}
|
|
|
else if word == "mod" || word == "modified" {
|
|
else if word == "mod" || word == "modified" {
|
|
|
- Ok(TimeTypes { accessed: false, modified: true, created: false })
|
|
|
|
|
|
|
+ TimeTypes { modified: true, changed: false, accessed: false, created: false }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if word == "ch" || word == "changed" {
|
|
|
|
|
+ TimeTypes { modified: false, changed: true, accessed: false, created: false }
|
|
|
}
|
|
}
|
|
|
else if word == "acc" || word == "accessed" {
|
|
else if word == "acc" || word == "accessed" {
|
|
|
- Ok(TimeTypes { accessed: true, modified: false, created: false })
|
|
|
|
|
|
|
+ TimeTypes { modified: false, changed: false, accessed: true, created: false }
|
|
|
}
|
|
}
|
|
|
else if word == "cr" || word == "created" {
|
|
else if word == "cr" || word == "created" {
|
|
|
- Ok(TimeTypes { accessed: false, modified: false, created: true })
|
|
|
|
|
|
|
+ TimeTypes { modified: false, changed: false, accessed: false, created: true }
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- Err(Misfire::BadArgument(&flags::TIME, word.into()))
|
|
|
|
|
|
|
+ return Err(Misfire::BadArgument(&flags::TIME, word.into()));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- else if modified || created || accessed {
|
|
|
|
|
- Ok(TimeTypes { accessed, modified, created })
|
|
|
|
|
|
|
+ else if modified || changed || accessed || created {
|
|
|
|
|
+ TimeTypes { modified, changed, accessed, created }
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
- Ok(TimeTypes::default())
|
|
|
|
|
|
|
+ TimeTypes::default()
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ let mut fields = vec![];
|
|
|
|
|
+ if time_types.modified { fields.push(PlatformMetadata::ModifiedTime); }
|
|
|
|
|
+ if time_types.changed { fields.push(PlatformMetadata::ChangedTime); }
|
|
|
|
|
+ if time_types.accessed { fields.push(PlatformMetadata::AccessedTime); }
|
|
|
|
|
+ if time_types.created { fields.push(PlatformMetadata::CreatedTime); }
|
|
|
|
|
+
|
|
|
|
|
+ for field in fields {
|
|
|
|
|
+ if let Err(misfire) = field.check_supported() {
|
|
|
|
|
+ return Err(misfire);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ Ok(time_types)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -358,7 +379,8 @@ mod test {
|
|
|
use options::test::Strictnesses::*;
|
|
use options::test::Strictnesses::*;
|
|
|
|
|
|
|
|
static TEST_ARGS: &[&Arg] = &[ &flags::BINARY, &flags::BYTES, &flags::TIME_STYLE,
|
|
static TEST_ARGS: &[&Arg] = &[ &flags::BINARY, &flags::BYTES, &flags::TIME_STYLE,
|
|
|
- &flags::TIME, &flags::MODIFIED, &flags::CREATED, &flags::ACCESSED,
|
|
|
|
|
|
|
+ &flags::TIME, &flags::MODIFIED, &flags::CHANGED,
|
|
|
|
|
+ &flags::CREATED, &flags::ACCESSED,
|
|
|
&flags::HEADER, &flags::GROUP, &flags::INODE, &flags::GIT,
|
|
&flags::HEADER, &flags::GROUP, &flags::INODE, &flags::GIT,
|
|
|
&flags::LINKS, &flags::BLOCKS, &flags::LONG, &flags::LEVEL,
|
|
&flags::LINKS, &flags::BLOCKS, &flags::LONG, &flags::LEVEL,
|
|
|
&flags::GRID, &flags::ACROSS, &flags::ONE_LINE ];
|
|
&flags::GRID, &flags::ACROSS, &flags::ONE_LINE ];
|
|
@@ -493,32 +515,47 @@ mod test {
|
|
|
test!(empty: TimeTypes <- []; Both => Ok(TimeTypes::default()));
|
|
test!(empty: TimeTypes <- []; Both => Ok(TimeTypes::default()));
|
|
|
|
|
|
|
|
// Modified
|
|
// Modified
|
|
|
- test!(modified: TimeTypes <- ["--modified"]; Both => Ok(TimeTypes { accessed: false, modified: true, created: false }));
|
|
|
|
|
- test!(m: TimeTypes <- ["-m"]; Both => Ok(TimeTypes { accessed: false, modified: true, created: false }));
|
|
|
|
|
- test!(time_mod: TimeTypes <- ["--time=modified"]; Both => Ok(TimeTypes { accessed: false, modified: true, created: false }));
|
|
|
|
|
- test!(time_m: TimeTypes <- ["-tmod"]; Both => Ok(TimeTypes { accessed: false, modified: true, created: false }));
|
|
|
|
|
|
|
+ test!(modified: TimeTypes <- ["--modified"]; Both => Ok(TimeTypes { modified: true, changed: false, accessed: false, created: false }));
|
|
|
|
|
+ test!(m: TimeTypes <- ["-m"]; Both => Ok(TimeTypes { modified: true, changed: false, accessed: false, created: false }));
|
|
|
|
|
+ test!(time_mod: TimeTypes <- ["--time=modified"]; Both => Ok(TimeTypes { modified: true, changed: false, accessed: false, created: false }));
|
|
|
|
|
+ test!(time_m: TimeTypes <- ["-tmod"]; Both => Ok(TimeTypes { modified: true, changed: false, accessed: false, created: false }));
|
|
|
|
|
+
|
|
|
|
|
+ // Changed
|
|
|
|
|
+ #[cfg(target_family = "unix")]
|
|
|
|
|
+ test!(changed: TimeTypes <- ["--changed"]; Both => Ok(TimeTypes { modified: false, changed: true, accessed: false, created: false }));
|
|
|
|
|
+ #[cfg(target_family = "unix")]
|
|
|
|
|
+ test!(time_ch: TimeTypes <- ["--time=changed"]; Both => Ok(TimeTypes { modified: false, changed: true, accessed: false, created: false }));
|
|
|
|
|
+ #[cfg(target_family = "unix")]
|
|
|
|
|
+ test!(time_c: TimeTypes <- ["-t", "ch"]; Both => Ok(TimeTypes { modified: false, changed: true, accessed: false, created: false }));
|
|
|
|
|
|
|
|
// Accessed
|
|
// Accessed
|
|
|
- test!(acc: TimeTypes <- ["--accessed"]; Both => Ok(TimeTypes { accessed: true, modified: false, created: false }));
|
|
|
|
|
- test!(a: TimeTypes <- ["-u"]; Both => Ok(TimeTypes { accessed: true, modified: false, created: false }));
|
|
|
|
|
- test!(time_acc: TimeTypes <- ["--time", "accessed"]; Both => Ok(TimeTypes { accessed: true, modified: false, created: false }));
|
|
|
|
|
- test!(time_a: TimeTypes <- ["-t", "acc"]; Both => Ok(TimeTypes { accessed: true, modified: false, created: false }));
|
|
|
|
|
|
|
+ test!(acc: TimeTypes <- ["--accessed"]; Both => Ok(TimeTypes { modified: false, changed: false, accessed: true, created: false }));
|
|
|
|
|
+ test!(a: TimeTypes <- ["-u"]; Both => Ok(TimeTypes { modified: false, changed: false, accessed: true, created: false }));
|
|
|
|
|
+ test!(time_acc: TimeTypes <- ["--time", "accessed"]; Both => Ok(TimeTypes { modified: false, changed: false, accessed: true, created: false }));
|
|
|
|
|
+ test!(time_a: TimeTypes <- ["-t", "acc"]; Both => Ok(TimeTypes { modified: false, changed: false, accessed: true, created: false }));
|
|
|
|
|
|
|
|
// Created
|
|
// Created
|
|
|
- test!(cr: TimeTypes <- ["--created"]; Both => Ok(TimeTypes { accessed: false, modified: false, created: true }));
|
|
|
|
|
- test!(c: TimeTypes <- ["-U"]; Both => Ok(TimeTypes { accessed: false, modified: false, created: true }));
|
|
|
|
|
- test!(time_cr: TimeTypes <- ["--time=created"]; Both => Ok(TimeTypes { accessed: false, modified: false, created: true }));
|
|
|
|
|
- test!(time_c: TimeTypes <- ["-tcr"]; Both => Ok(TimeTypes { accessed: false, modified: false, created: true }));
|
|
|
|
|
|
|
+ #[cfg(not(target_os = "linux"))]
|
|
|
|
|
+ test!(cr: TimeTypes <- ["--created"]; Both => Ok(TimeTypes { modified: false, changed: false, accessed: false, created: true }));
|
|
|
|
|
+ #[cfg(target_os = "linux")]
|
|
|
|
|
+ test!(cr: TimeTypes <- ["--created"]; Both => err Misfire::Unsupported("creation time is not available on this platform currently".to_string()));
|
|
|
|
|
+ #[cfg(not(target_os = "linux"))]
|
|
|
|
|
+ test!(c: TimeTypes <- ["-U"]; Both => Ok(TimeTypes { modified: false, changed: false, accessed: false, created: true }));
|
|
|
|
|
+ #[cfg(not(target_os = "linux"))]
|
|
|
|
|
+ test!(time_cr: TimeTypes <- ["--time=created"]; Both => Ok(TimeTypes { modified: false, changed: false, accessed: false, created: true }));
|
|
|
|
|
+ #[cfg(not(target_os = "linux"))]
|
|
|
|
|
+ test!(time_c: TimeTypes <- ["-tcr"]; Both => Ok(TimeTypes { modified: false, changed: false, accessed: false, created: true }));
|
|
|
|
|
|
|
|
// Multiples
|
|
// Multiples
|
|
|
- test!(time_uu: TimeTypes <- ["-uU"]; Both => Ok(TimeTypes { accessed: true, modified: false, created: true }));
|
|
|
|
|
|
|
+ test!(time_uu: TimeTypes <- ["-u", "--modified"]; Both => Ok(TimeTypes { modified: true, changed: false, accessed: true, created: false }));
|
|
|
|
|
+
|
|
|
|
|
|
|
|
// Errors
|
|
// Errors
|
|
|
test!(time_tea: TimeTypes <- ["--time=tea"]; Both => err Misfire::BadArgument(&flags::TIME, OsString::from("tea")));
|
|
test!(time_tea: TimeTypes <- ["--time=tea"]; Both => err Misfire::BadArgument(&flags::TIME, OsString::from("tea")));
|
|
|
test!(time_ea: TimeTypes <- ["-tea"]; Both => err Misfire::BadArgument(&flags::TIME, OsString::from("ea")));
|
|
test!(time_ea: TimeTypes <- ["-tea"]; Both => err Misfire::BadArgument(&flags::TIME, OsString::from("ea")));
|
|
|
|
|
|
|
|
// Overriding
|
|
// Overriding
|
|
|
- test!(overridden: TimeTypes <- ["-tcr", "-tmod"]; Last => Ok(TimeTypes { accessed: false, modified: true, created: false }));
|
|
|
|
|
|
|
+ test!(overridden: TimeTypes <- ["-tcr", "-tmod"]; Last => Ok(TimeTypes { modified: true, changed: false, accessed: false, created: false }));
|
|
|
test!(overridden_2: TimeTypes <- ["-tcr", "-tmod"]; Complain => err Misfire::Duplicate(Flag::Short(b't'), Flag::Short(b't')));
|
|
test!(overridden_2: TimeTypes <- ["-tcr", "-tmod"]; Complain => err Misfire::Duplicate(Flag::Short(b't'), Flag::Short(b't')));
|
|
|
}
|
|
}
|
|
|
|
|
|