diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index d82915c85..427829c22 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -324,16 +324,16 @@ struct LongFormat { struct PaddingCollection { #[cfg(unix)] - longest_inode_len: usize, - longest_link_count_len: usize, - longest_uname_len: usize, - longest_group_len: usize, - longest_context_len: usize, - longest_size_len: usize, + inode: usize, + link_count: usize, + uname: usize, + group: usize, + context: usize, + size: usize, #[cfg(unix)] - longest_major_len: usize, + major: usize, #[cfg(unix)] - longest_minor_len: usize, + minor: usize, } impl Config { @@ -1305,9 +1305,9 @@ only ignore '.' and '..'.", ) } -/// Represents a Path along with it's associated data -/// Any data that will be reused several times makes sense to be added to this structure -/// Caching data here helps eliminate redundant syscalls to fetch same information +/// Represents a Path along with it's associated data. +/// Any data that will be reused several times makes sense to be added to this structure. +/// Caching data here helps eliminate redundant syscalls to fetch same information. #[derive(Debug)] struct PathData { // Result got from symlink_metadata() or metadata() based on config @@ -1708,92 +1708,10 @@ fn display_items(items: &[PathData], config: &Config, out: &mut BufWriter { - let _ = write!(out, " {}", pad_left(&size, padding.longest_size_len),); + let _ = write!(out, " {}", pad_left(&size, padding.size),); } SizeOrDeviceId::Device(major, minor) => { let _ = write!( @@ -2035,10 +1949,10 @@ fn display_item_long( #[cfg(not(unix))] 0usize, #[cfg(unix)] - padding.longest_major_len.max( + padding.major.max( padding - .longest_size_len - .saturating_sub(padding.longest_minor_len.saturating_add(2usize)) + .size + .saturating_sub(padding.minor.saturating_add(2usize)) ) ), pad_left( @@ -2046,7 +1960,7 @@ fn display_item_long( #[cfg(not(unix))] 0usize, #[cfg(unix)] - padding.longest_minor_len, + padding.minor, ), ); } @@ -2060,7 +1974,7 @@ fn display_item_long( #[cfg(unix)] { if config.inode { - let _ = write!(out, "{} ", pad_left("?", padding.longest_inode_len),); + let _ = write!(out, "{} ", pad_left("?", padding.inode),); } } @@ -2108,29 +2022,29 @@ fn display_item_long( } else { "" }, - pad_left("?", padding.longest_link_count_len), + pad_left("?", padding.link_count), ); if config.long.owner { - let _ = write!(out, " {}", pad_right("?", padding.longest_uname_len)); + let _ = write!(out, " {}", pad_right("?", padding.uname)); } if config.long.group { - let _ = write!(out, " {}", pad_right("?", padding.longest_group_len)); + let _ = write!(out, " {}", pad_right("?", padding.group)); } if config.context { let _ = write!( out, " {}", - pad_right(&item.security_context, padding.longest_context_len) + pad_right(&item.security_context, padding.context) ); } // Author is only different from owner on GNU/Hurd, so we reuse // the owner, since GNU/Hurd is not currently supported by Rust. if config.long.author { - let _ = write!(out, " {}", pad_right("?", padding.longest_uname_len)); + let _ = write!(out, " {}", pad_right("?", padding.uname)); } let dfn = display_file_name(item, config, None, 0, out).contents; @@ -2139,7 +2053,7 @@ fn display_item_long( let _ = writeln!( out, " {} {} {}", - pad_left("?", padding.longest_size_len), + pad_left("?", padding.size), pad_left("?", date_len), dfn, ); @@ -2594,3 +2508,77 @@ fn get_security_context(config: &Config, p_buf: &Path, must_dereference: bool) - substitute_string } } + +#[cfg(unix)] +fn calculate_padding_collection( + items: &[PathData], + config: &Config, + out: &mut BufWriter, +) -> PaddingCollection { + let mut padding_collections = PaddingCollection { + inode: 1, + link_count: 1, + uname: 1, + group: 1, + context: 1, + size: 1, + major: 1, + minor: 1, + }; + + for item in items { + let context_len = item.security_context.len(); + let (link_count_len, uname_len, group_len, size_len, major_len, minor_len, inode_len) = + display_dir_entry_size(item, config, out); + padding_collections.inode = inode_len.max(padding_collections.inode); + padding_collections.link_count = link_count_len.max(padding_collections.link_count); + padding_collections.uname = uname_len.max(padding_collections.uname); + padding_collections.group = group_len.max(padding_collections.group); + if config.context { + padding_collections.context = context_len.max(padding_collections.context); + } + if items.len() == 1usize { + padding_collections.size = 0usize; + padding_collections.major = 0usize; + padding_collections.minor = 0usize; + } else { + padding_collections.major = major_len.max(padding_collections.major); + padding_collections.minor = minor_len.max(padding_collections.minor); + padding_collections.size = size_len + .max(padding_collections.size) + .max(padding_collections.major + padding_collections.minor + 2usize); + } + } + + padding_collections +} + +#[cfg(not(unix))] +fn calculate_padding_collection( + items: &[PathData], + config: &Config, + out: &mut BufWriter, +) -> PaddingCollection { + let mut padding_collections = PaddingCollection { + link_count: 1, + uname: 1, + group: 1, + context: 1, + size: 1, + }; + + for item in items { + let context_len = item.security_context.len(); + let (link_count_len, uname_len, group_len, size_len, _major_len, _minor_len, _inode_len) = + display_dir_entry_size(item, config, out); + padding_collections.link_count = link_count_len.max(padding_collections.link_count); + padding_collections.uname = uname_len.max(padding_collections.uname); + padding_collections.group = group_len.max(padding_collections.group); + if config.context { + padding_collections.context = context_len.max(padding_collections.context); + } + padding_collections.size = size_len.max(padding_collections.size); + } + + padding_collections +}