From 1dc8b8e9c90f961388e133647a0284e8b34184fc Mon Sep 17 00:00:00 2001 From: Uggla Date: Fri, 8 Nov 2024 22:22:14 +0100 Subject: [PATCH] Retrieve file timestamp (access time, birth time, and modification time) based on the arguments specified in the ftime command-line option. --- src/core.rs | 17 +++---- src/display.rs | 30 ++++++----- src/icon.rs | 35 ++++++++----- src/meta/date.rs | 42 ++++++++------- src/meta/filetype.rs | 6 +-- src/meta/mod.rs | 29 ++++++----- src/meta/name.rs | 11 ++-- src/sort.rs | 119 +++++++++++++++++++++++++------------------ 8 files changed, 171 insertions(+), 118 deletions(-) diff --git a/src/core.rs b/src/core.rs index 97472ec40..63219544b 100644 --- a/src/core.rs +++ b/src/core.rs @@ -116,15 +116,14 @@ impl Core { .collect(); for path in paths { - let mut meta = - match Meta::from_path(&path, self.flags.dereference.0, self.flags.permission) { - Ok(meta) => meta, - Err(err) => { - print_error!("{}: {}.", path.display(), err); - exit_code.set_if_greater(ExitCode::MajorIssue); - continue; - } - }; + let mut meta = match Meta::from_path(&path, self.flags.dereference.0, &self.flags) { + Ok(meta) => meta, + Err(err) => { + print_error!("{}: {}.", path.display(), err); + exit_code.set_if_greater(ExitCode::MajorIssue); + continue; + } + }; let cache = if self.flags.blocks.0.contains(&Block::GitStatus) { Some(GitCache::new(&path)) diff --git a/src/display.rs b/src/display.rs index ca037f0b7..56d87998e 100644 --- a/src/display.rs +++ b/src/display.rs @@ -504,7 +504,7 @@ mod tests { use crate::app::Cli; use crate::color; use crate::color::Colors; - use crate::flags::{HyperlinkOption, IconOption, IconTheme as FlagTheme, PermissionFlag}; + use crate::flags::{HyperlinkOption, IconOption, IconTheme as FlagTheme}; use crate::icon::Icons; use crate::meta::{FileType, Name}; use crate::Config; @@ -699,7 +699,7 @@ mod tests { dir.child("one.d").create_dir_all().unwrap(); dir.child("one.d/two").touch().unwrap(); dir.child("one.d/.hidden").touch().unwrap(); - let mut metas = Meta::from_path(Path::new(dir.path()), false, PermissionFlag::Rwx) + let mut metas = Meta::from_path(Path::new(dir.path()), false, &flags) .unwrap() .recurse_into(42, &flags, None) .unwrap() @@ -732,7 +732,7 @@ mod tests { let dir = assert_fs::TempDir::new().unwrap(); dir.child("dir").create_dir_all().unwrap(); dir.child("dir/file").touch().unwrap(); - let metas = Meta::from_path(Path::new(dir.path()), false, PermissionFlag::Rwx) + let metas = Meta::from_path(Path::new(dir.path()), false, &flags) .unwrap() .recurse_into(42, &flags, None) .unwrap() @@ -773,7 +773,7 @@ mod tests { let dir = assert_fs::TempDir::new().unwrap(); dir.child("dir").create_dir_all().unwrap(); dir.child("dir/file").touch().unwrap(); - let metas = Meta::from_path(Path::new(dir.path()), false, PermissionFlag::Rwx) + let metas = Meta::from_path(Path::new(dir.path()), false, &flags) .unwrap() .recurse_into(42, &flags, None) .unwrap() @@ -813,7 +813,7 @@ mod tests { let dir = assert_fs::TempDir::new().unwrap(); dir.child("one.d").create_dir_all().unwrap(); dir.child("one.d/two").touch().unwrap(); - let metas = Meta::from_path(Path::new(dir.path()), false, PermissionFlag::Rwx) + let metas = Meta::from_path(Path::new(dir.path()), false, &flags) .unwrap() .recurse_into(42, &flags, None) .unwrap() @@ -844,7 +844,7 @@ mod tests { let dir = assert_fs::TempDir::new().unwrap(); dir.child("testdir").create_dir_all().unwrap(); dir.child("test").touch().unwrap(); - let metas = Meta::from_path(Path::new(dir.path()), false, PermissionFlag::Rwx) + let metas = Meta::from_path(Path::new(dir.path()), false, &flags) .unwrap() .recurse_into(1, &flags, None) .unwrap() @@ -878,7 +878,7 @@ mod tests { let dir = assert_fs::TempDir::new().unwrap(); dir.child("testdir").create_dir_all().unwrap(); - let metas = Meta::from_path(Path::new(dir.path()), false, PermissionFlag::Rwx) + let metas = Meta::from_path(Path::new(dir.path()), false, &flags) .unwrap() .recurse_into(1, &flags, None) .unwrap() @@ -908,11 +908,14 @@ mod tests { let file_path = tmp_dir.path().join("file"); std::fs::File::create(&file_path).expect("failed to create the file"); - let file = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + + let flags = Flags::default(); + + let file = Meta::from_path(&file_path, false, &flags).unwrap(); let dir_path = tmp_dir.path().join("dir"); std::fs::create_dir(&dir_path).expect("failed to create the dir"); - let dir = Meta::from_path(&dir_path, false, PermissionFlag::Rwx).unwrap(); + let dir = Meta::from_path(&dir_path, false, &flags).unwrap(); assert_eq!( display_folder_path(&dir), @@ -955,15 +958,18 @@ mod tests { let file_path = tmp_dir.path().join("file"); std::fs::File::create(&file_path).expect("failed to create the file"); - let file = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + + let flags = Flags::default(); + + let file = Meta::from_path(&file_path, false, &flags).unwrap(); let dir_path = tmp_dir.path().join("dir"); std::fs::create_dir(&dir_path).expect("failed to create the dir"); - let dir = Meta::from_path(&dir_path, false, PermissionFlag::Rwx).unwrap(); + let dir = Meta::from_path(&dir_path, false, &flags).unwrap(); let link_path = tmp_dir.path().join("link"); std::os::unix::fs::symlink("dir", &link_path).unwrap(); - let link = Meta::from_path(&link_path, false, PermissionFlag::Rwx).unwrap(); + let link = Meta::from_path(&link_path, false, &flags).unwrap(); const YES: bool = true; const NO: bool = false; diff --git a/src/icon.rs b/src/icon.rs index 6fec005f2..3d50485fe 100644 --- a/src/icon.rs +++ b/src/icon.rs @@ -75,7 +75,7 @@ impl Icons { #[cfg(test)] mod test { use super::{IconTheme, Icons}; - use crate::flags::{IconOption, IconTheme as FlagTheme, PermissionFlag}; + use crate::flags::{Flags, IconOption, IconTheme as FlagTheme}; use crate::meta::Meta; use std::fs::File; use tempfile::tempdir; @@ -85,7 +85,8 @@ mod test { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path().join("file.txt"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icons = Icons::new(true, IconOption::Never, FlagTheme::Fancy, " ".to_string()); let icon = icons.get(&meta.name); @@ -97,7 +98,8 @@ mod test { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path().join("file.txt"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icons = Icons::new(false, IconOption::Never, FlagTheme::Fancy, " ".to_string()); let icon = icons.get(&meta.name); @@ -110,7 +112,8 @@ mod test { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path().join("file.txt"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icons = Icons::new(false, IconOption::Auto, FlagTheme::Fancy, " ".to_string()); let icon = icons.get(&meta.name); @@ -122,7 +125,8 @@ mod test { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path().join("file.txt"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icons = Icons::new(true, IconOption::Auto, FlagTheme::Fancy, " ".to_string()); let icon = icons.get(&meta.name); @@ -135,7 +139,8 @@ mod test { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path().join("file"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icon = Icons::new(true, IconOption::Always, FlagTheme::Fancy, " ".to_string()); let icon_str = icon.get(&meta.name); @@ -148,7 +153,8 @@ mod test { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path().join("file"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icon = Icons::new(false, IconOption::Always, FlagTheme::Fancy, " ".to_string()); let icon_str = icon.get(&meta.name); @@ -161,7 +167,8 @@ mod test { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path().join("file"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icon = Icons::new( false, @@ -178,7 +185,8 @@ mod test { fn get_icon_default_directory() { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path(); - let meta = Meta::from_path(file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(file_path, false, &flags).unwrap(); let icon = Icons::new(false, IconOption::Always, FlagTheme::Fancy, " ".to_string()); let icon_str = icon.get(&meta.name); @@ -190,7 +198,8 @@ mod test { fn get_icon_default_directory_unicode() { let tmp_dir = tempdir().expect("failed to create temp dir"); let file_path = tmp_dir.path(); - let meta = Meta::from_path(file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(file_path, false, &flags).unwrap(); let icon = Icons::new( false, @@ -210,7 +219,8 @@ mod test { for (file_name, file_icon) in &IconTheme::get_default_icons_by_name() { let file_path = tmp_dir.path().join(file_name); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icon = Icons::new(false, IconOption::Always, FlagTheme::Fancy, " ".to_string()); let icon_str = icon.get(&meta.name); @@ -226,7 +236,8 @@ mod test { for (ext, file_icon) in &IconTheme::get_default_icons_by_extension() { let file_path = tmp_dir.path().join(format!("file.{ext}")); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let icon = Icons::new(false, IconOption::Always, FlagTheme::Fancy, " ".to_string()); let icon_str = icon.get(&meta.name); diff --git a/src/meta/date.rs b/src/meta/date.rs index 71ce1371d..e28f1d1b4 100644 --- a/src/meta/date.rs +++ b/src/meta/date.rs @@ -1,6 +1,6 @@ use super::locale::current_locale; use crate::color::{ColoredString, Colors, Elem}; -use crate::flags::{DateFlag, Flags}; +use crate::flags::{DateFlag, FileTimeFlag, Flags}; use chrono::{DateTime, Duration, Local}; use chrono_humanize::HumanTime; use std::fs::Metadata; @@ -23,15 +23,23 @@ impl From for Date { } } -impl From<&Metadata> for Date { - fn from(meta: &Metadata) -> Self { - meta.accessed() - .expect("failed to retrieve modified date") - .into() - } -} - impl Date { + pub fn from_metadata(meta: &Metadata, flags: &Flags) -> Self { + match flags.ftime { + FileTimeFlag::Birth => meta + .created() + .expect("failed to retrieve creation date") + .into(), + FileTimeFlag::Access => meta + .accessed() + .expect("failed to retrieve access date") + .into(), + FileTimeFlag::Modification => meta + .modified() + .expect("failed to retrieve modification date") + .into(), + } + } pub fn render(&self, colors: &Colors, flags: &Flags) -> ColoredString { let now = Local::now(); #[allow(deprecated)] @@ -130,7 +138,7 @@ mod test { assert!(success, "failed to exec touch"); let colors = Colors::new(ThemeOption::Default); - let date = Date::from(&file_path.metadata().unwrap()); + let date = Date::from_metadata(&file_path.metadata().unwrap(), &Flags::default()); let flags = Flags::default(); assert_eq!( @@ -158,7 +166,7 @@ mod test { assert!(success, "failed to exec touch"); let colors = Colors::new(ThemeOption::Default); - let date = Date::from(&file_path.metadata().unwrap()); + let date = Date::from_metadata(&file_path.metadata().unwrap(), &Flags::default()); let flags = Flags::default(); assert_eq!( @@ -186,7 +194,7 @@ mod test { assert!(success, "failed to exec touch"); let colors = Colors::new(ThemeOption::Default); - let date = Date::from(&file_path.metadata().unwrap()); + let date = Date::from_metadata(&file_path.metadata().unwrap(), &Flags::default()); let flags = Flags::default(); assert_eq!( @@ -214,7 +222,7 @@ mod test { assert!(success, "failed to exec touch"); let colors = Colors::new(ThemeOption::Default); - let date = Date::from(&file_path.metadata().unwrap()); + let date = Date::from_metadata(&file_path.metadata().unwrap(), &Flags::default()); let flags = Flags { date: DateFlag::Relative, @@ -241,7 +249,7 @@ mod test { assert!(success, "failed to exec touch"); let colors = Colors::new(ThemeOption::Default); - let date = Date::from(&file_path.metadata().unwrap()); + let date = Date::from_metadata(&file_path.metadata().unwrap(), &Flags::default()); let flags = Flags { date: DateFlag::Relative, @@ -268,7 +276,7 @@ mod test { assert!(success, "failed to exec touch"); let colors = Colors::new(ThemeOption::Default); - let date = Date::from(&file_path.metadata().unwrap()); + let date = Date::from_metadata(&file_path.metadata().unwrap(), &Flags::default()); let flags = Flags { date: DateFlag::Iso, @@ -299,7 +307,7 @@ mod test { assert!(success, "failed to exec touch"); let colors = Colors::new(ThemeOption::Default); - let date = Date::from(&file_path.metadata().unwrap()); + let date = Date::from_metadata(&file_path.metadata().unwrap(), &Flags::default()); let flags = Flags { date: DateFlag::Iso, @@ -329,7 +337,7 @@ mod test { assert!(success, "failed to exec touch"); let colors = Colors::new(ThemeOption::Default); - let date = Date::from(&file_path.metadata().unwrap()); + let date = Date::from_metadata(&file_path.metadata().unwrap(), &Flags::default()); let flags = Flags { date: DateFlag::Locale, diff --git a/src/meta/filetype.rs b/src/meta/filetype.rs index 07ca8ab2f..9611bc32f 100644 --- a/src/meta/filetype.rs +++ b/src/meta/filetype.rs @@ -109,8 +109,7 @@ impl FileType { mod test { use super::FileType; use crate::color::{Colors, ThemeOption}; - #[cfg(unix)] - use crate::flags::PermissionFlag; + use crate::flags::Flags; #[cfg(unix)] use crate::meta::permissions_or_attributes::PermissionsOrAttributes; #[cfg(unix)] @@ -148,7 +147,8 @@ mod test { fn test_dir_type() { let tmp_dir = tempdir().expect("failed to create temp dir"); #[cfg(not(windows))] - let meta = crate::meta::Meta::from_path(tmp_dir.path(), false, PermissionFlag::Rwx) + let flags = Flags::default(); + let meta = crate::meta::Meta::from_path(tmp_dir.path(), false, &flags) .expect("failed to get tempdir path"); let metadata = tmp_dir.path().metadata().expect("failed to get metas"); diff --git a/src/meta/mod.rs b/src/meta/mod.rs index e8384fd19..48bbc1f08 100644 --- a/src/meta/mod.rs +++ b/src/meta/mod.rs @@ -103,7 +103,7 @@ impl Meta { let mut parent_meta = Self::from_path( &self.path.join(Component::ParentDir), flags.dereference.0, - flags.permission, + flags, )?; "..".clone_into(&mut parent_meta.name.name); @@ -147,8 +147,7 @@ impl Meta { _ => {} } - let mut entry_meta = match Self::from_path(&path, flags.dereference.0, flags.permission) - { + let mut entry_meta = match Self::from_path(&path, flags.dereference.0, flags) { Ok(res) => res, Err(err) => { print_error!("{}: {}.", path.display(), err); @@ -261,7 +260,8 @@ impl Meta { pub fn from_path( path: &Path, dereference: bool, - permission_flag: PermissionFlag, + // permission_flag: PermissionFlag, + flags: &Flags, ) -> io::Result { let mut metadata = path.symlink_metadata()?; let mut symlink_meta = None; @@ -287,7 +287,7 @@ impl Meta { } #[cfg(unix)] - let (owner, permissions) = match permission_flag { + let (owner, permissions) = match flags.permission { PermissionFlag::Disable => (None, None), _ => ( Some(Owner::from(&metadata)), @@ -341,7 +341,7 @@ impl Meta { Some(INode::from(&metadata)), Some(Links::from(&metadata)), Some(Size::from(&metadata)), - Some(Date::from(&metadata)), + Some(Date::from_metadata(&metadata, flags)), Some(owner), Some(permissions_or_attributes), Some(AccessControl::for_path(path)), @@ -369,6 +369,7 @@ impl Meta { #[cfg(test)] mod tests { + use crate::flags::Flags; use crate::flags::PermissionFlag; use super::Meta; @@ -379,14 +380,19 @@ mod tests { #[test] fn test_from_path_path() { let dir = assert_fs::TempDir::new().unwrap(); - let meta = Meta::from_path(dir.path(), false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(dir.path(), false, &flags).unwrap(); assert_eq!(meta.path, dir.path()) } #[test] fn test_from_path_disable_permission() { let dir = assert_fs::TempDir::new().unwrap(); - let meta = Meta::from_path(dir.path(), false, PermissionFlag::Disable).unwrap(); + let flags = Flags { + permission: PermissionFlag::Disable, + ..Flags::default() + }; + let meta = Meta::from_path(dir.path(), false, &flags).unwrap(); assert!(meta.permissions_or_attributes.is_none()); assert!(meta.owner.is_none()); } @@ -397,8 +403,8 @@ mod tests { let path_a = tmp_dir.path().join("aaa.aa"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); let path_b = tmp_dir.path().join("bbb.bb"); let path_c = tmp_dir.path().join("ccc.cc"); @@ -413,8 +419,7 @@ mod tests { std::os::windows::fs::symlink_file(path_c, &path_b) .expect("failed to create broken symlink"); - let meta_b = - Meta::from_path(&path_b, true, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_b = Meta::from_path(&path_b, true, &flags).expect("failed to get meta"); assert!( meta_a.inode.is_some() diff --git a/src/meta/name.rs b/src/meta/name.rs index 788c8907e..28f79b2be 100644 --- a/src/meta/name.rs +++ b/src/meta/name.rs @@ -220,7 +220,7 @@ mod test { use super::DisplayOption; use super::Name; use crate::color::{self, Colors}; - use crate::flags::PermissionFlag; + use crate::flags::Flags; use crate::flags::{HyperlinkOption, IconOption, IconTheme as FlagTheme}; use crate::icon::Icons; use crate::meta::FileType; @@ -273,7 +273,8 @@ mod test { // Create the directory let dir_path = tmp_dir.path().join("directory"); fs::create_dir(&dir_path).expect("failed to create the dir"); - let meta = Meta::from_path(&dir_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&dir_path, false, &flags).unwrap(); let colors = Colors::new(color::ThemeOption::NoLscolors); @@ -397,7 +398,8 @@ mod test { // Create the file; let file_path = tmp_dir.path().join("file.txt"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let colors = Colors::new(color::ThemeOption::NoColor); @@ -423,7 +425,8 @@ mod test { // Create the file; let file_path = tmp_dir.path().join("file.txt"); File::create(&file_path).expect("failed to create file"); - let meta = Meta::from_path(&file_path, false, PermissionFlag::Rwx).unwrap(); + let flags = Flags::default(); + let meta = Meta::from_path(&file_path, false, &flags).unwrap(); let colors = Colors::new(color::ThemeOption::NoColor); diff --git a/src/sort.rs b/src/sort.rs index 34deb948d..6102fec95 100644 --- a/src/sort.rs +++ b/src/sort.rs @@ -80,7 +80,7 @@ fn by_git_status(a: &Meta, b: &Meta) -> Ordering { #[cfg(test)] mod tests { use super::*; - use crate::flags::{Flags, PermissionFlag}; + use crate::flags::{FileTimeFlag, Flags}; use std::fs::{create_dir, File}; use std::io::prelude::*; use std::process::Command; @@ -93,14 +93,13 @@ mod tests { // Create the file; let path_a = tmp_dir.path().join("zzz"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); // Create a dir; let path_z = tmp_dir.path().join("aaa"); create_dir(&path_z).expect("failed to create dir"); - let meta_z = - Meta::from_path(&path_z, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); let mut flags = Flags::default(); flags.sorting.dir_grouping = DirGrouping::First; @@ -123,14 +122,13 @@ mod tests { // Create the file; let path_a = tmp_dir.path().join("zzz"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); // Create a dir; let path_z = tmp_dir.path().join("aaa"); create_dir(&path_z).expect("failed to create dir"); - let meta_z = - Meta::from_path(&path_z, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); let mut flags = Flags::default(); flags.sorting.dir_grouping = DirGrouping::Last; @@ -151,14 +149,13 @@ mod tests { // Create the file; let path_a = tmp_dir.path().join("aaa"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); // Create a dir; let path_z = tmp_dir.path().join("zzz"); create_dir(&path_z).expect("failed to create dir"); - let meta_z = - Meta::from_path(&path_z, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); let mut flags = Flags::default(); flags.sorting.dir_grouping = DirGrouping::None; @@ -181,14 +178,13 @@ mod tests { // Create the file; let path_a = tmp_dir.path().join("zzz"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); // Create a dir; let path_z = tmp_dir.path().join("aaa"); create_dir(&path_z).expect("failed to create dir"); - let meta_z = - Meta::from_path(&path_z, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); let mut flags = Flags::default(); flags.sorting.dir_grouping = DirGrouping::None; @@ -211,10 +207,11 @@ mod tests { // Create the file; let path_a = tmp_dir.path().join("aaa"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); // Create the file; + std::thread::sleep(std::time::Duration::from_secs(1)); let path_z = tmp_dir.path().join("zzz"); File::create(&path_z).expect("failed to create file"); @@ -238,8 +235,7 @@ mod tests { .success(); assert!(success, "failed to change file timestamp"); - let meta_z = - Meta::from_path(&path_z, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); let mut flags = Flags::default(); flags.sorting.column = SortColumn::Time; @@ -252,6 +248,41 @@ mod tests { flags.sorting.order = SortOrder::Reverse; let sorter = assemble_sorters(&flags); assert_eq!(by_meta(&sorter, &meta_a, &meta_z), Ordering::Greater); + + // Sort by birth time + flags.sorting.order = SortOrder::Default; + flags.ftime = FileTimeFlag::Birth; + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); + let sorter = assemble_sorters(&flags); + assert_eq!(by_meta(&sorter, &meta_a, &meta_z), Ordering::Greater); + + // Sort by modification time + flags.sorting.order = SortOrder::Default; + flags.ftime = FileTimeFlag::Modification; + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); + let sorter = assemble_sorters(&flags); + assert_eq!(by_meta(&sorter, &meta_a, &meta_z), Ordering::Less); + + // Sort by access time + flags.sorting.order = SortOrder::Default; + flags.ftime = FileTimeFlag::Access; + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); + let sorter = assemble_sorters(&flags); + assert_eq!(by_meta(&sorter, &meta_a, &meta_z), Ordering::Less); + + // Read the z file + let mut file_z = File::open(&path_z).expect("failed to open file"); + let mut buf: Vec = Vec::new(); + let _ = file_z.read_to_end(&mut buf).expect("failed to read file"); + + flags.ftime = FileTimeFlag::Access; + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); + let sorter = assemble_sorters(&flags); + assert_eq!(by_meta(&sorter, &meta_a, &meta_z), Ordering::Greater); } #[test] @@ -261,26 +292,23 @@ mod tests { // Create the file with rs extension; let path_a = tmp_dir.path().join("aaa.rs"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); // Create the file with rs extension; let path_z = tmp_dir.path().join("zzz.rs"); File::create(&path_z).expect("failed to create file"); - let meta_z = - Meta::from_path(&path_z, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_z = Meta::from_path(&path_z, false, &flags).expect("failed to get meta"); // Create the file with js extension; let path_j = tmp_dir.path().join("zzz.js"); File::create(&path_j).expect("failed to create file"); - let meta_j = - Meta::from_path(&path_j, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_j = Meta::from_path(&path_j, false, &flags).expect("failed to get meta"); // Create the file with txt extension; let path_t = tmp_dir.path().join("zzz.txt"); File::create(&path_t).expect("failed to create file"); - let meta_t = - Meta::from_path(&path_t, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_t = Meta::from_path(&path_t, false, &flags).expect("failed to get meta"); let mut flags = Flags::default(); flags.sorting.column = SortColumn::Extension; @@ -302,18 +330,16 @@ mod tests { let path_a = tmp_dir.path().join("2"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); let path_b = tmp_dir.path().join("11"); File::create(&path_b).expect("failed to create file"); - let meta_b = - Meta::from_path(&path_b, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_b = Meta::from_path(&path_b, false, &flags).expect("failed to get meta"); let path_c = tmp_dir.path().join("12"); File::create(&path_c).expect("failed to create file"); - let meta_c = - Meta::from_path(&path_c, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_c = Meta::from_path(&path_c, false, &flags).expect("failed to get meta"); let mut flags = Flags::default(); flags.sorting.column = SortColumn::Version; @@ -331,23 +357,20 @@ mod tests { let path_a = tmp_dir.path().join("aaa.aa"); File::create(&path_a).expect("failed to create file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); let path_b = tmp_dir.path().join("aaa"); create_dir(&path_b).expect("failed to create dir"); - let meta_b = - Meta::from_path(&path_b, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_b = Meta::from_path(&path_b, false, &flags).expect("failed to get meta"); let path_c = tmp_dir.path().join("zzz.zz"); File::create(&path_c).expect("failed to create file"); - let meta_c = - Meta::from_path(&path_c, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_c = Meta::from_path(&path_c, false, &flags).expect("failed to get meta"); let path_d = tmp_dir.path().join("zzz"); create_dir(&path_d).expect("failed to create dir"); - let meta_d = - Meta::from_path(&path_d, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_d = Meta::from_path(&path_d, false, &flags).expect("failed to get meta"); let mut flags = Flags::default(); flags.sorting.column = SortColumn::None; @@ -380,16 +403,15 @@ mod tests { .expect("failed to create file") .write_all(b"1, 2, 3") .expect("failed to write to file"); - let meta_a = - Meta::from_path(&path_a, false, PermissionFlag::Rwx).expect("failed to get meta"); + let flags = Flags::default(); + let meta_a = Meta::from_path(&path_a, false, &flags).expect("failed to get meta"); let path_b = tmp_dir.path().join("bbb.bb"); File::create(&path_b) .expect("failed to create file") .write_all(b"1, 2, 3, 4, 5, 6, 7, 8, 9, 10") .expect("failed to write file"); - let meta_b = - Meta::from_path(&path_b, false, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_b = Meta::from_path(&path_b, false, &flags).expect("failed to get meta"); let path_c = tmp_dir.path().join("ccc.cc"); let path_d = tmp_dir.path().join("ddd.dd"); @@ -404,8 +426,7 @@ mod tests { std::os::windows::fs::symlink_file(path_d, &path_c) .expect("failed to create broken symlink"); - let meta_c = - Meta::from_path(&path_c, true, PermissionFlag::Rwx).expect("failed to get meta"); + let meta_c = Meta::from_path(&path_c, true, &flags).expect("failed to get meta"); assert_eq!(by_size(&meta_a, &meta_a), Ordering::Equal); assert_eq!(by_size(&meta_a, &meta_b), Ordering::Greater);