Преглед изворни кода

fix: --smart-group only works for current user

Rami Chasygov пре 2 година
родитељ
комит
a4f6d8c701
2 измењених фајлова са 85 додато и 26 уклоњено
  1. 84 26
      src/output/render/groups.rs
  2. 1 0
      src/output/table.rs

+ 84 - 26
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<User>,
     ) -> TextCell;
 }
 
@@ -22,6 +24,7 @@ impl Render for Option<f::Group> {
         users: &U,
         user_format: UserFormat,
         group_format: GroupFormat,
+        file_user: Option<User>,
     ) -> TextCell {
         use uzers::os::unix::GroupExt;
 
@@ -53,20 +56,15 @@ impl Render for Option<f::Group> {
             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
+            )
         );
     }
 }

+ 1 - 0
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),