Skip to content

Commit 52eaa79

Browse files
committed
Require all people in Zulip user groups to have a Zulip id in their config
1 parent 2d25539 commit 52eaa79

File tree

9 files changed

+39
-43
lines changed

9 files changed

+39
-43
lines changed

rust_team_data/src/v1.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ pub struct ZulipGroup {
103103
#[derive(Debug, Clone, Serialize, Deserialize)]
104104
#[serde(rename_all = "snake_case")]
105105
pub enum ZulipGroupMember {
106+
// TODO(rylev): this variant can be removed once
107+
// it is verified that noone is relying on it
106108
Email(String),
107109
Id(usize),
108110
}

src/check_synced.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ fn check_zulip(data: &Data) -> Result<(), failure::Error> {
2424
.map(|g| (g.name.clone(), g))
2525
.collect::<HashMap<_, _>>();
2626
let remote_users = zulip.get_users()?;
27-
let email_to_zulip_id = remote_users
28-
.iter()
29-
.cloned()
30-
.map(|u| (u.email, u.user_id))
31-
.collect::<HashMap<_, _>>();
3227
let zulip_id_to_name = remote_users
3328
.into_iter()
3429
.map(|u| (u.user_id, u.name))
@@ -44,16 +39,10 @@ fn check_zulip(data: &Data) -> Result<(), failure::Error> {
4439
let mut remote_members = rg.members.iter().collect::<HashSet<_>>();
4540
for local_member in local_group.members() {
4641
let i = match local_member {
47-
ZulipGroupMember::Id(i) => *i,
48-
ZulipGroupMember::Email(e) => match email_to_zulip_id.get(e) {
49-
Some(i) => *i,
50-
None => {
51-
error!("No user on Zulip uses the email '{e}'");
52-
continue;
53-
}
54-
},
55-
ZulipGroupMember::Missing => {
56-
error!("Member of Zulip user group '{}' does not have an email or Zulip id", local_group.name());
42+
ZulipGroupMember::MemberWithId { zulip_id, .. } => *zulip_id,
43+
ZulipGroupMember::JustId(zulip_id) => *zulip_id,
44+
ZulipGroupMember::MemberWithoutId { github } => {
45+
error!("Member '{github}' of Zulip user group '{}' does not have a Zulip id", local_group.name());
5746
continue;
5847
}
5948
};

src/schema.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -369,15 +369,14 @@ impl Team {
369369
let member = data.person(member).ok_or_else(|| {
370370
err_msg(format!("{} does not have a person configuration", member))
371371
})?;
372-
let member = match (member.zulip_id, member.email()) {
373-
(Some(zulip_id), _) => ZulipGroupMember::Id(zulip_id),
374-
(_, Email::Present(email)) => ZulipGroupMember::Email(email.to_string()),
375-
_ => ZulipGroupMember::Missing,
372+
let member = match (member.github.clone(), member.zulip_id) {
373+
(github, Some(zulip_id)) => ZulipGroupMember::MemberWithId { github, zulip_id },
374+
(github, _) => ZulipGroupMember::MemberWithoutId { github },
376375
};
377376
group.members.push(member);
378377
}
379378
for &extra in &raw_group.extra_zulip_ids {
380-
group.members.push(ZulipGroupMember::Id(extra));
379+
group.members.push(ZulipGroupMember::JustId(extra));
381380
}
382381
groups.push(group);
383382
}
@@ -654,9 +653,9 @@ impl ZulipGroup {
654653

655654
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
656655
pub(crate) enum ZulipGroupMember {
657-
Id(usize),
658-
Email(String),
659-
Missing,
656+
MemberWithId { github: String, zulip_id: usize },
657+
JustId(usize),
658+
MemberWithoutId { github: String },
660659
}
661660

662661
fn default_true() -> bool {

src/static_api.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,13 @@ impl<'a> Generator<'a> {
237237
members: members
238238
.into_iter()
239239
.filter_map(|m| match m {
240-
ZulipGroupMember::Email(e) => Some(v1::ZulipGroupMember::Email(e)),
241-
ZulipGroupMember::Id(i) => Some(v1::ZulipGroupMember::Id(i)),
242-
ZulipGroupMember::Missing => None,
240+
ZulipGroupMember::MemberWithId { zulip_id, .. } => {
241+
Some(v1::ZulipGroupMember::Id(zulip_id))
242+
}
243+
ZulipGroupMember::JustId(zulip_id) => {
244+
Some(v1::ZulipGroupMember::Id(zulip_id))
245+
}
246+
ZulipGroupMember::MemberWithoutId { .. } => None,
243247
})
244248
.collect(),
245249
},

src/validate.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -609,13 +609,10 @@ fn validate_discord_team_members_have_discord_ids(data: &Data, errors: &mut Vec<
609609
});
610610
}
611611

612-
/// Ensure every member of a team that has a Zulip group either has a Zulip id or an email address
612+
/// Ensure every member of a team that has a Zulip group has a Zulip id
613613
fn validate_zulip_users(data: &Data, zulip: &ZulipApi, errors: &mut Vec<String>) {
614-
let (by_id, by_email) = match zulip.get_users() {
615-
Ok(u) => (
616-
u.iter().map(|u| u.user_id).collect::<HashSet<_>>(),
617-
u.into_iter().map(|u| u.email).collect::<HashSet<_>>(),
618-
),
614+
let by_id = match zulip.get_users() {
615+
Ok(u) => u.iter().map(|u| u.user_id).collect::<HashSet<_>>(),
619616
Err(err) => {
620617
errors.push(format!("couldn't verify Zulip users: {}", err));
621618
return;
@@ -633,8 +630,15 @@ fn validate_zulip_users(data: &Data, zulip: &ZulipApi, errors: &mut Vec<String>)
633630
.members()
634631
.iter()
635632
.filter_map(|m| match m {
636-
ZulipGroupMember::Id(i) if !by_id.contains(i) => Some(format!("{}", i)),
637-
ZulipGroupMember::Email(e) if !by_email.contains(e) => Some(e.clone()),
633+
ZulipGroupMember::MemberWithId { github, zulip_id }
634+
if !by_id.contains(zulip_id) =>
635+
{
636+
Some(github.clone())
637+
}
638+
ZulipGroupMember::JustId(zulip_id) if !by_id.contains(zulip_id) => {
639+
Some(format!("ID: {zulip_id}"))
640+
}
641+
ZulipGroupMember::MemberWithoutId { github } => Some(github.clone()),
638642
_ => None,
639643
})
640644
.collect::<HashSet<_>>();
@@ -649,7 +653,7 @@ fn validate_zulip_users(data: &Data, zulip: &ZulipApi, errors: &mut Vec<String>)
649653
})
650654
}
651655

652-
/// Ensure every member of a team that has a Zulip group either has a Zulip id or an email address
656+
/// Ensure every member of a team that has a Zulip group either has a Zulip id
653657
fn validate_zulip_group_ids(data: &Data, errors: &mut Vec<String>) {
654658
wrapper(data.teams(), errors, |team, errors| {
655659
let groups = team.zulip_groups(data)?;
@@ -659,11 +663,9 @@ fn validate_zulip_group_ids(data: &Data, errors: &mut Vec<String>) {
659663
}
660664
wrapper(team.members(data).iter(), errors, |member, _| {
661665
if let Some(member) = data.person(member) {
662-
if member.zulip_id().is_none()
663-
&& matches!(member.email(), Email::Missing | Email::Disabled)
664-
{
666+
if member.zulip_id().is_none() {
665667
bail!(
666-
"person `{}` in '{}' is a member of a Zulip user group but has no Zulip id nor an enabled email address",
668+
"person `{}` in '{}' is a member of a Zulip user group but has no Zulip id",
667669
member.github(),
668670
team.name()
669671
);

src/zulip.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,6 @@ struct ZulipUsers {
9898
/// A single Zulip user
9999
#[derive(Clone, Deserialize, PartialEq, Eq, Hash)]
100100
pub(crate) struct ZulipUser {
101-
#[serde(rename = "delivery_email")]
102-
pub(crate) email: String,
103101
pub(crate) user_id: usize,
104102
#[serde(rename = "full_name")]
105103
pub(crate) name: String,

tests/static-api/_expected/v1/zulip-groups.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"id": 1234
88
},
99
{
10-
"email": "[email protected]"
10+
"id": 4321
1111
}
1212
]
1313
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"users": {
33
"2": 2,
4-
"1234": 0
4+
"1234": 0,
5+
"4321": 0
56
}
67
}

tests/static-api/people/user-1.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ github = 'user-1'
33
github-id = 0
44
55
discord-id = 1
6+
zulip-id = 4321

0 commit comments

Comments
 (0)