From a4f6d8c7012704ab8015f5fac09a3d4e13a2f097 Mon Sep 17 00:00:00 2001 From: Rami Chasygov <3c9wjqgw5@mozmail.com> Date: Sun, 22 Oct 2023 20:10:26 +0300 Subject: [PATCH] fix: --smart-group only works for current user --- src/output/render/groups.rs | 110 +++++++++++++++++++++++++++--------- src/output/table.rs | 1 + 2 files changed, 85 insertions(+), 26 deletions(-) diff --git a/src/output/render/groups.rs b/src/output/render/groups.rs index 5953be0aa..0908085a5 100644 --- a/src/output/render/groups.rs +++ b/src/output/render/groups.rs @@ -2,6 +2,7 @@ use ansiterm::Style; use uzers::{Groups, Users}; use crate::fs::fields as f; +use crate::fs::fields::User; use crate::output::cell::TextCell; use crate::output::table::{GroupFormat, UserFormat}; @@ -12,6 +13,7 @@ pub trait Render { users: &U, user_format: UserFormat, group_format: GroupFormat, + file_user: Option, ) -> TextCell; } @@ -22,6 +24,7 @@ impl Render for Option { users: &U, user_format: UserFormat, group_format: GroupFormat, + file_user: Option, ) -> TextCell { use uzers::os::unix::GroupExt; @@ -53,20 +56,15 @@ impl Render for Option { UserFormat::Numeric => group.gid().to_string(), }; - group_name = match group_format { - GroupFormat::Smart => { - if let Some(current_user) = users.get_user_by_uid(current_uid) { - if current_user.name() == group.name() { - ":".to_string() - } else { - group_name + if let GroupFormat::Smart = group_format { + if let Some(file_uid) = file_user { + if let Some(file_user) = users.get_user_by_uid(file_uid.0) { + if file_user.name().to_string_lossy() == group.name().to_string_lossy() { + group_name = ":".to_string(); } - } else { - group_name } } - GroupFormat::Regular => group_name, - }; + } TextCell::paint(style, group_name) } @@ -109,10 +107,17 @@ pub mod test { users.add_group(Group::new(100, "folk")); let group = Some(f::Group(100)); + let file_user = Some(f::User(1000)); let expected = TextCell::paint_str(TestColours.not_yours(), "folk"); assert_eq!( expected, - group.render(&TestColours, &users, UserFormat::Name, GroupFormat::Regular) + group.render( + &TestColours, + &users, + UserFormat::Name, + GroupFormat::Regular, + file_user + ) ); let expected = TextCell::paint_str(TestColours.not_yours(), "100"); @@ -122,7 +127,8 @@ pub mod test { &TestColours, &users, UserFormat::Numeric, - GroupFormat::Regular + GroupFormat::Regular, + file_user ) ); } @@ -132,10 +138,17 @@ pub mod test { let users = MockUsers::with_current_uid(1000); let group = Some(f::Group(100)); + let file_user = Some(f::User(1000)); let expected = TextCell::paint_str(TestColours.not_yours(), "100"); assert_eq!( expected, - group.render(&TestColours, &users, UserFormat::Name, GroupFormat::Regular) + group.render( + &TestColours, + &users, + UserFormat::Name, + GroupFormat::Regular, + file_user + ) ); assert_eq!( expected, @@ -143,7 +156,8 @@ pub mod test { &TestColours, &users, UserFormat::Numeric, - GroupFormat::Regular + GroupFormat::Regular, + file_user ) ); } @@ -155,10 +169,17 @@ pub mod test { users.add_group(Group::new(100, "folk")); let group = Some(f::Group(100)); + let file_user = Some(f::User(2)); let expected = TextCell::paint_str(TestColours.yours(), "folk"); assert_eq!( expected, - group.render(&TestColours, &users, UserFormat::Name, GroupFormat::Regular) + group.render( + &TestColours, + &users, + UserFormat::Name, + GroupFormat::Regular, + file_user + ) ) } @@ -171,16 +192,24 @@ pub mod test { users.add_group(test_group); let group = Some(f::Group(100)); + let file_user = Some(f::User(2)); let expected = TextCell::paint_str(TestColours.yours(), "folk"); assert_eq!( expected, - group.render(&TestColours, &users, UserFormat::Name, GroupFormat::Regular) + group.render( + &TestColours, + &users, + UserFormat::Name, + GroupFormat::Regular, + file_user + ) ) } #[test] fn overflow() { let group = Some(f::Group(2_147_483_648)); + let file_user = Some(f::User(1000)); let expected = TextCell::paint_str(TestColours.not_yours(), "2147483648"); assert_eq!( expected, @@ -188,7 +217,8 @@ pub mod test { &TestColours, &MockUsers::with_current_uid(0), UserFormat::Numeric, - GroupFormat::Regular + GroupFormat::Regular, + file_user ) ); } @@ -196,25 +226,34 @@ pub mod test { #[test] fn smart() { let mut users = MockUsers::with_current_uid(1000); - users.add_user(User::new(1000, "user", 110)); + users.add_user(User::new(1000, "user", 100)); + users.add_user(User::new(1001, "http", 101)); users.add_group(Group::new(100, "user")); users.add_group(Group::new(101, "http")); - let same_group = Some(f::Group(100)); - let expected = TextCell::paint_str(TestColours.not_yours(), ":"); + let user_group = Some(f::Group(100)); + let user_file = Some(f::User(1000)); + let expected = TextCell::paint_str(TestColours.yours(), ":"); assert_eq!( expected, - same_group.render(&TestColours, &users, UserFormat::Name, GroupFormat::Smart) + user_group.render( + &TestColours, + &users, + UserFormat::Name, + GroupFormat::Smart, + user_file + ) ); - let expected = TextCell::paint_str(TestColours.not_yours(), ":"); + let expected = TextCell::paint_str(TestColours.yours(), ":"); assert_eq!( expected, - same_group.render( + user_group.render( &TestColours, &users, UserFormat::Numeric, - GroupFormat::Smart + GroupFormat::Smart, + user_file ) ); @@ -222,7 +261,26 @@ pub mod test { let expected = TextCell::paint_str(TestColours.not_yours(), "http"); assert_eq!( expected, - http_group.render(&TestColours, &users, UserFormat::Name, GroupFormat::Smart) + http_group.render( + &TestColours, + &users, + UserFormat::Name, + GroupFormat::Smart, + user_file + ) + ); + + let http_file = Some(f::User(1001)); + let expected = TextCell::paint_str(TestColours.not_yours(), ":"); + assert_eq!( + expected, + http_group.render( + &TestColours, + &users, + UserFormat::Name, + GroupFormat::Smart, + http_file + ) ); } } diff --git a/src/output/table.rs b/src/output/table.rs index 740799c7d..7c9af65f5 100644 --- a/src/output/table.rs +++ b/src/output/table.rs @@ -476,6 +476,7 @@ impl<'a> Table<'a> { &*self.env.lock_users(), self.user_format, self.group_format, + file.user(), ), #[cfg(unix)] Column::SecurityContext => file.security_context().render(self.theme),