Skip to content

Commit

Permalink
Merge pull request #555 from liketurbo/bug-545
Browse files Browse the repository at this point in the history
fix: --smart-group only works for current user
  • Loading branch information
cafkafk authored Oct 29, 2023
2 parents 77a8d74 + a4f6d8c commit 206caaf
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 33 deletions.
124 changes: 91 additions & 33 deletions src/output/render/groups.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};

Expand All @@ -12,6 +13,7 @@ pub trait Render {
users: &U,
user_format: UserFormat,
group_format: GroupFormat,
file_user: Option<User>,
) -> TextCell;
}

Expand All @@ -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;

Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -109,20 +107,28 @@ pub mod test {
users.add_group(Group::new(100, "folk"));

let group = Some(f::Group(100));
let expected = TextCell::paint_str(Fixed(81).normal(), "folk");
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(Fixed(81).normal(), "100");
let expected = TextCell::paint_str(TestColours.not_yours(), "100");
assert_eq!(
expected,
group.render(
&TestColours,
&users,
UserFormat::Numeric,
GroupFormat::Regular
GroupFormat::Regular,
file_user
)
);
}
Expand All @@ -132,18 +138,26 @@ pub mod test {
let users = MockUsers::with_current_uid(1000);

let group = Some(f::Group(100));
let expected = TextCell::paint_str(Fixed(81).normal(), "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,
group.render(
&TestColours,
&users,
UserFormat::Numeric,
GroupFormat::Regular
GroupFormat::Regular,
file_user
)
);
}
Expand All @@ -155,10 +169,17 @@ pub mod test {
users.add_group(Group::new(100, "folk"));

let group = Some(f::Group(100));
let expected = TextCell::paint_str(Fixed(80).normal(), "folk");
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
)
)
}

Expand All @@ -171,58 +192,95 @@ pub mod test {
users.add_group(test_group);

let group = Some(f::Group(100));
let expected = TextCell::paint_str(Fixed(80).normal(), "folk");
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 expected = TextCell::paint_str(Fixed(81).normal(), "2147483648");
let file_user = Some(f::User(1000));
let expected = TextCell::paint_str(TestColours.not_yours(), "2147483648");
assert_eq!(
expected,
group.render(
&TestColours,
&MockUsers::with_current_uid(0),
UserFormat::Numeric,
GroupFormat::Regular
GroupFormat::Regular,
file_user
)
);
}

#[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(Fixed(81).normal(), ":");
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(Fixed(81).normal(), ":");
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
)
);

let http_group = Some(f::Group(101));
let expected = TextCell::paint_str(Fixed(81).normal(), "http");
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 change: 1 addition & 0 deletions src/output/table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,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),
Expand Down

0 comments on commit 206caaf

Please sign in to comment.