From efa372cb3bbb3e09050d4915ae06736d1fd29ffe Mon Sep 17 00:00:00 2001 From: Benjamin Sago Date: Sat, 16 Apr 2016 18:59:25 +0100 Subject: [PATCH] Source file rearrangements This commit moves file, dir, and the feature modules into one parent 'fs' module. Now there are three main 'areas' of the code: main and options, the filesystem-touching code, and the output-displaying code. It should be the case that nothing in 'output' touches 'std::fs'. --- src/{ => fs}/dir.rs | 4 +- src/{ => fs}/feature/git.rs | 40 ++++++++--------- src/{ => fs}/feature/mod.rs | 0 src/{ => fs}/feature/xattr.rs | 0 src/fs/fields.rs | 74 +++++++++++++++++++++++++++++++ src/{ => fs}/file.rs | 82 +---------------------------------- src/{ => fs}/filetype.rs | 2 +- src/fs/mod.rs | 9 ++++ src/main.rs | 8 +--- src/options.rs | 6 +-- src/output/column.rs | 2 +- src/output/details.rs | 11 ++--- src/output/grid.rs | 2 +- src/output/grid_details.rs | 5 +-- src/output/lines.rs | 2 +- src/output/mod.rs | 2 +- 16 files changed, 123 insertions(+), 126 deletions(-) rename src/{ => fs}/dir.rs (98%) rename src/{ => fs}/feature/git.rs (51%) rename src/{ => fs}/feature/mod.rs (100%) rename src/{ => fs}/feature/xattr.rs (100%) create mode 100644 src/fs/fields.rs rename src/{ => fs}/file.rs (89%) rename src/{ => fs}/filetype.rs (99%) create mode 100644 src/fs/mod.rs diff --git a/src/dir.rs b/src/fs/dir.rs similarity index 98% rename from src/dir.rs rename to src/fs/dir.rs index 7453745..5d3fb26 100644 --- a/src/dir.rs +++ b/src/fs/dir.rs @@ -3,8 +3,8 @@ use std::fs; use std::path::{Path, PathBuf}; use std::slice::Iter as SliceIter; -use feature::Git; -use file::{File, fields}; +use fs::feature::Git; +use fs::{File, fields}; /// A **Dir** provides a cached list of the file paths in a directory that's diff --git a/src/feature/git.rs b/src/fs/feature/git.rs similarity index 51% rename from src/feature/git.rs rename to src/fs/feature/git.rs index faa3d51..121e302 100644 --- a/src/feature/git.rs +++ b/src/fs/feature/git.rs @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf}; use git2; -use file::fields; +use fs::fields as f; /// Container of Git statuses for all the files in this folder's Git repository. @@ -29,48 +29,48 @@ impl Git { } /// Get the status for the file at the given path, if present. - pub fn status(&self, path: &Path) -> fields::Git { + pub fn status(&self, path: &Path) -> f::Git { let status = self.statuses.iter() .find(|p| p.0.as_path() == path); match status { - Some(&(_, s)) => fields::Git { staged: index_status(s), unstaged: working_tree_status(s) }, - None => fields::Git { staged: fields::GitStatus::NotModified, unstaged: fields::GitStatus::NotModified } + Some(&(_, s)) => f::Git { staged: index_status(s), unstaged: working_tree_status(s) }, + None => f::Git { staged: f::GitStatus::NotModified, unstaged: f::GitStatus::NotModified } } } /// Get the combined status for all the files whose paths begin with the /// path that gets passed in. This is used for getting the status of /// directories, which don't really have an 'official' status. - pub fn dir_status(&self, dir: &Path) -> fields::Git { + pub fn dir_status(&self, dir: &Path) -> f::Git { let s = self.statuses.iter() .filter(|p| p.0.starts_with(dir)) .fold(git2::Status::empty(), |a, b| a | b.1); - fields::Git { staged: index_status(s), unstaged: working_tree_status(s) } + f::Git { staged: index_status(s), unstaged: working_tree_status(s) } } } /// The character to display if the file has been modified, but not staged. -fn working_tree_status(status: git2::Status) -> fields::GitStatus { +fn working_tree_status(status: git2::Status) -> f::GitStatus { match status { - s if s.contains(git2::STATUS_WT_NEW) => fields::GitStatus::New, - s if s.contains(git2::STATUS_WT_MODIFIED) => fields::GitStatus::Modified, - s if s.contains(git2::STATUS_WT_DELETED) => fields::GitStatus::Deleted, - s if s.contains(git2::STATUS_WT_RENAMED) => fields::GitStatus::Renamed, - s if s.contains(git2::STATUS_WT_TYPECHANGE) => fields::GitStatus::TypeChange, - _ => fields::GitStatus::NotModified, + s if s.contains(git2::STATUS_WT_NEW) => f::GitStatus::New, + s if s.contains(git2::STATUS_WT_MODIFIED) => f::GitStatus::Modified, + s if s.contains(git2::STATUS_WT_DELETED) => f::GitStatus::Deleted, + s if s.contains(git2::STATUS_WT_RENAMED) => f::GitStatus::Renamed, + s if s.contains(git2::STATUS_WT_TYPECHANGE) => f::GitStatus::TypeChange, + _ => f::GitStatus::NotModified, } } /// The character to display if the file has been modified, and the change /// has been staged. -fn index_status(status: git2::Status) -> fields::GitStatus { +fn index_status(status: git2::Status) -> f::GitStatus { match status { - s if s.contains(git2::STATUS_INDEX_NEW) => fields::GitStatus::New, - s if s.contains(git2::STATUS_INDEX_MODIFIED) => fields::GitStatus::Modified, - s if s.contains(git2::STATUS_INDEX_DELETED) => fields::GitStatus::Deleted, - s if s.contains(git2::STATUS_INDEX_RENAMED) => fields::GitStatus::Renamed, - s if s.contains(git2::STATUS_INDEX_TYPECHANGE) => fields::GitStatus::TypeChange, - _ => fields::GitStatus::NotModified, + s if s.contains(git2::STATUS_INDEX_NEW) => f::GitStatus::New, + s if s.contains(git2::STATUS_INDEX_MODIFIED) => f::GitStatus::Modified, + s if s.contains(git2::STATUS_INDEX_DELETED) => f::GitStatus::Deleted, + s if s.contains(git2::STATUS_INDEX_RENAMED) => f::GitStatus::Renamed, + s if s.contains(git2::STATUS_INDEX_TYPECHANGE) => f::GitStatus::TypeChange, + _ => f::GitStatus::NotModified, } } diff --git a/src/feature/mod.rs b/src/fs/feature/mod.rs similarity index 100% rename from src/feature/mod.rs rename to src/fs/feature/mod.rs diff --git a/src/feature/xattr.rs b/src/fs/feature/xattr.rs similarity index 100% rename from src/feature/xattr.rs rename to src/fs/feature/xattr.rs diff --git a/src/fs/fields.rs b/src/fs/fields.rs new file mode 100644 index 0000000..a70cb22 --- /dev/null +++ b/src/fs/fields.rs @@ -0,0 +1,74 @@ +#![allow(non_camel_case_types)] + +/// Wrapper types for the values returned from `File` objects. +/// +/// The methods of `File` don't return formatted strings; neither do they +/// return raw numbers representing timestamps or user IDs. Instead, they will +/// return an object in this `fields` module. These objects are later rendered +/// into formatted strings in the `output/details` module. +pub type blkcnt_t = u64; +pub type gid_t = u32; +pub type ino_t = u64; +pub type nlink_t = u64; +pub type time_t = i64; +pub type uid_t = u32; + +pub enum Type { + File, Directory, Pipe, Link, Special, +} + +pub struct Permissions { + pub file_type: Type, + pub user_read: bool, + pub user_write: bool, + pub user_execute: bool, + pub group_read: bool, + pub group_write: bool, + pub group_execute: bool, + pub other_read: bool, + pub other_write: bool, + pub other_execute: bool, +} + +pub struct Links { + pub count: nlink_t, + pub multiple: bool, +} + +pub struct Inode(pub ino_t); + +pub enum Blocks { + Some(blkcnt_t), + None, +} + +pub struct User(pub uid_t); + +pub struct Group(pub gid_t); + +pub enum Size { + Some(u64), + None, +} + +pub struct Time(pub time_t); + +pub enum GitStatus { + NotModified, + New, + Modified, + Deleted, + Renamed, + TypeChange, +} + +pub struct Git { + pub staged: GitStatus, + pub unstaged: GitStatus, +} + +impl Git { + pub fn empty() -> Git { + Git { staged: GitStatus::NotModified, unstaged: GitStatus::NotModified } + } +} diff --git a/src/file.rs b/src/fs/file.rs similarity index 89% rename from src/file.rs rename to src/fs/file.rs index 7f7c692..24ec77e 100644 --- a/src/file.rs +++ b/src/fs/file.rs @@ -7,9 +7,8 @@ use std::io::Result as IOResult; use std::os::unix::fs::{MetadataExt, PermissionsExt}; use std::path::{Path, PathBuf}; -use dir::Dir; - -use self::fields as f; +use fs::dir::Dir; +use fs::fields as f; /// Constant table copied from https://doc.rust-lang.org/src/std/sys/unix/ext/fs.rs.html#11-259 @@ -409,83 +408,6 @@ fn ext(path: &Path) -> Option { } -/// Wrapper types for the values returned from `File` objects. -/// -/// The methods of `File` don't return formatted strings; neither do they -/// return raw numbers representing timestamps or user IDs. Instead, they will -/// return an object in this `fields` module. These objects are later rendered -/// into formatted strings in the `output/details` module. -#[allow(non_camel_case_types)] -pub mod fields { - pub type blkcnt_t = u64; - pub type gid_t = u32; - pub type ino_t = u64; - pub type nlink_t = u64; - pub type time_t = i64; - pub type uid_t = u32; - - pub enum Type { - File, Directory, Pipe, Link, Special, - } - - pub struct Permissions { - pub file_type: Type, - pub user_read: bool, - pub user_write: bool, - pub user_execute: bool, - pub group_read: bool, - pub group_write: bool, - pub group_execute: bool, - pub other_read: bool, - pub other_write: bool, - pub other_execute: bool, - } - - pub struct Links { - pub count: nlink_t, - pub multiple: bool, - } - - pub struct Inode(pub ino_t); - - pub enum Blocks { - Some(blkcnt_t), - None, - } - - pub struct User(pub uid_t); - - pub struct Group(pub gid_t); - - pub enum Size { - Some(u64), - None, - } - - pub struct Time(pub time_t); - - pub enum GitStatus { - NotModified, - New, - Modified, - Deleted, - Renamed, - TypeChange, - } - - pub struct Git { - pub staged: GitStatus, - pub unstaged: GitStatus, - } - - impl Git { - pub fn empty() -> Git { - Git { staged: GitStatus::NotModified, unstaged: GitStatus::NotModified } - } - } -} - - #[cfg(test)] mod test { use super::ext; diff --git a/src/filetype.rs b/src/fs/filetype.rs similarity index 99% rename from src/filetype.rs rename to src/fs/filetype.rs index 97f35f7..eff3e58 100644 --- a/src/filetype.rs +++ b/src/fs/filetype.rs @@ -1,4 +1,4 @@ -use file::File; +use fs::File; impl<'_> File<'_> { diff --git a/src/fs/mod.rs b/src/fs/mod.rs new file mode 100644 index 0000000..9ee79c9 --- /dev/null +++ b/src/fs/mod.rs @@ -0,0 +1,9 @@ +mod dir; +pub use self::dir::Dir; + +mod file; +pub mod filetype; +pub use self::file::File; + +pub mod feature; +pub mod fields; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 8c76738..c295711 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,14 +23,10 @@ use std::env; use std::path::{Component, Path}; use std::process; -use dir::Dir; -use file::File; +use fs::{Dir, File}; use options::{Options, View}; -mod dir; -mod feature; -mod file; -mod filetype; +mod fs; mod options; mod output; mod term; diff --git a/src/options.rs b/src/options.rs index 74cbcbb..7add419 100644 --- a/src/options.rs +++ b/src/options.rs @@ -7,8 +7,8 @@ use std::os::unix::fs::MetadataExt; use getopts; use natord; -use feature::xattr; -use file::File; +use fs::feature::xattr; +use fs::File; use output::{Grid, Details, GridDetails, Lines}; use output::Colours; use output::column::{Columns, TimeTypes, SizeFormat}; @@ -759,7 +759,7 @@ static EXTENDED_HELP: &'static str = r##" -@, --extended display extended a #[cfg(test)] mod test { use super::{Options, Misfire, SortField, SortCase}; - use feature::xattr; + use fs::feature::xattr; fn is_helpful(misfire: Result) -> bool { match misfire { diff --git a/src/output/column.rs b/src/output/column.rs index cfec1f9..04a6f31 100644 --- a/src/output/column.rs +++ b/src/output/column.rs @@ -1,4 +1,4 @@ -use dir::Dir; +use fs::Dir; #[derive(PartialEq, Debug, Copy, Clone)] diff --git a/src/output/details.rs b/src/output/details.rs index c7ed1e3..f8a7a9b 100644 --- a/src/output/details.rs +++ b/src/output/details.rs @@ -88,10 +88,8 @@ use locale; use users::{Users, Groups, UsersCache}; -use dir::Dir; -use feature::xattr::{Attribute, FileAttributes}; -use file::fields as f; -use file::File; +use fs::{Dir, File, fields as f}; +use fs::feature::xattr::{Attribute, FileAttributes}; use options::{FileFilter, RecurseOptions}; use output::colours::Colours; use output::column::{Alignment, Column, Columns, SizeFormat}; @@ -224,7 +222,7 @@ impl Details { use num_cpus; use scoped_threadpool::Pool; use std::sync::{Arc, Mutex}; - use feature::xattr; + use fs::feature::xattr; let mut pool = Pool::new(num_cpus::get() as u32); let mut file_eggs = Vec::new(); @@ -761,8 +759,7 @@ pub mod test { pub use super::{Table, Environment, Details}; pub use std::sync::Mutex; - pub use file::File; - pub use file::fields as f; + pub use fs::{File, fields as f}; pub use output::column::{Column, Columns}; pub use output::cell::TextCell; diff --git a/src/output/grid.rs b/src/output/grid.rs index f56f6c5..5afec32 100644 --- a/src/output/grid.rs +++ b/src/output/grid.rs @@ -1,6 +1,6 @@ use term_grid as grid; -use file::File; +use fs::File; use output::DisplayWidth; use output::colours::Colours; use super::filename; diff --git a/src/output/grid_details.rs b/src/output/grid_details.rs index 422fc35..2d348a3 100644 --- a/src/output/grid_details.rs +++ b/src/output/grid_details.rs @@ -4,9 +4,8 @@ use ansi_term::ANSIStrings; use users::UsersCache; use term_grid as grid; -use dir::Dir; -use feature::xattr::FileAttributes; -use file::File; +use fs::{Dir, File}; +use fs::feature::xattr::FileAttributes; use output::cell::TextCell; use output::column::Column; diff --git a/src/output/lines.rs b/src/output/lines.rs index 97820cd..81e51d0 100644 --- a/src/output/lines.rs +++ b/src/output/lines.rs @@ -1,6 +1,6 @@ use ansi_term::ANSIStrings; -use file::File; +use fs::File; use super::filename; use super::colours::Colours; diff --git a/src/output/mod.rs b/src/output/mod.rs index 3f1fa3d..6464e07 100644 --- a/src/output/mod.rs +++ b/src/output/mod.rs @@ -1,6 +1,6 @@ use ansi_term::Style; -use file::File; +use fs::File; pub use self::cell::{TextCell, TextCellContents, DisplayWidth}; pub use self::colours::Colours;