|
1 | 1 | use crate::changelogs::ChangelogFormat; |
2 | 2 | use crate::github::{GithubClient, Repository}; |
| 3 | +use parser::command::relabel::{Label, LabelDelta, RelabelCommand}; |
3 | 4 | use std::collections::{HashMap, HashSet}; |
4 | 5 | use std::fmt; |
5 | 6 | use std::sync::{Arc, LazyLock, RwLock}; |
@@ -250,10 +251,62 @@ pub(crate) struct MentionsEntryConfig { |
250 | 251 |
|
251 | 252 | #[derive(PartialEq, Eq, Debug, serde::Deserialize)] |
252 | 253 | #[serde(rename_all = "kebab-case")] |
253 | | -#[serde(deny_unknown_fields)] |
254 | 254 | pub(crate) struct RelabelConfig { |
255 | 255 | #[serde(default)] |
256 | 256 | pub(crate) allow_unauthenticated: Vec<String>, |
| 257 | + // alias identifier -> labels |
| 258 | + #[serde(flatten)] |
| 259 | + pub(crate) configs: Option<HashMap<String, RelabelRuleConfig>>, |
| 260 | +} |
| 261 | + |
| 262 | +impl RelabelConfig { |
| 263 | + pub(crate) fn retrieve_command_from_alias(&self, input: RelabelCommand) -> RelabelCommand { |
| 264 | + match &self.configs { |
| 265 | + Some(configs) => { |
| 266 | + dbg!(&configs); |
| 267 | + // get only the first token from the command |
| 268 | + // extract the "alias" from the RelabelCommand |
| 269 | + if input.0.len() > 0 { |
| 270 | + let name = input.0.get(0).unwrap(); |
| 271 | + let name = name.label().as_str(); |
| 272 | + // check if this alias matches any RelabelRuleConfig key in our config |
| 273 | + // extract the labels and build a new command |
| 274 | + if configs.contains_key(name) { |
| 275 | + let (_alias, cfg) = configs.get_key_value(name).unwrap(); |
| 276 | + return cfg.to_command(); |
| 277 | + } |
| 278 | + } |
| 279 | + } |
| 280 | + None => { |
| 281 | + return input; |
| 282 | + } |
| 283 | + }; |
| 284 | + input |
| 285 | + } |
| 286 | +} |
| 287 | + |
| 288 | +#[derive(Default, PartialEq, Eq, Debug, serde::Deserialize)] |
| 289 | +#[serde(rename_all = "kebab-case")] |
| 290 | +#[serde(deny_unknown_fields)] |
| 291 | +pub(crate) struct RelabelRuleConfig { |
| 292 | + /// Labels to be added |
| 293 | + pub(crate) add_labels: Vec<String>, |
| 294 | + /// Labels to be removed |
| 295 | + pub(crate) rem_labels: Vec<String>, |
| 296 | +} |
| 297 | + |
| 298 | +impl RelabelRuleConfig { |
| 299 | + /// Translate a RelabelRuleConfig into a RelabelCommand for GitHub consumption |
| 300 | + pub fn to_command(&self) -> RelabelCommand { |
| 301 | + let mut deltas = Vec::new(); |
| 302 | + for l in self.add_labels.iter() { |
| 303 | + deltas.push(LabelDelta::Add(Label(l.into()))); |
| 304 | + } |
| 305 | + for l in self.rem_labels.iter() { |
| 306 | + deltas.push(LabelDelta::Remove(Label(l.into()))); |
| 307 | + } |
| 308 | + RelabelCommand(deltas) |
| 309 | + } |
257 | 310 | } |
258 | 311 |
|
259 | 312 | #[derive(PartialEq, Eq, Debug, serde::Deserialize)] |
@@ -761,11 +814,11 @@ mod tests { |
761 | 814 |
|
762 | 815 | [mentions."src/"] |
763 | 816 | cc = ["@someone"] |
764 | | - |
| 817 | +
|
765 | 818 | [mentions."target/"] |
766 | 819 | message = "This is a message." |
767 | 820 | cc = ["@someone"] |
768 | | - |
| 821 | +
|
769 | 822 | [mentions."#[rustc_attr]"] |
770 | 823 | type = "content" |
771 | 824 | message = "This is a message." |
@@ -835,6 +888,7 @@ mod tests { |
835 | 888 | Config { |
836 | 889 | relabel: Some(RelabelConfig { |
837 | 890 | allow_unauthenticated: vec!["C-*".into()], |
| 891 | + configs: Some(HashMap::new()) |
838 | 892 | }), |
839 | 893 | assign: Some(AssignConfig { |
840 | 894 | warn_non_default_branch: WarnNonDefaultBranchConfig::Simple(false), |
@@ -1092,5 +1146,36 @@ Multi text body with ${mcp_issue} and ${mcp_title} |
1092 | 1146 | }) |
1093 | 1147 | }) |
1094 | 1148 | ); |
| 1149 | + |
| 1150 | + fn relabel_new_config() { |
| 1151 | + let config = r#" |
| 1152 | + [relabel] |
| 1153 | + allow-unauthenticated = ["ABCD-*"] |
| 1154 | +
|
| 1155 | + [relabel.to-stable] |
| 1156 | + add-labels = ["regression-from-stable-to-stable"] |
| 1157 | + rem-labels = ["regression-from-stable-to-beta", "regression-from-stable-to-nightly"] |
| 1158 | + "#; |
| 1159 | + let config = toml::from_str::<Config>(&config).unwrap(); |
| 1160 | + |
| 1161 | + let mut relabel_configs = HashMap::new(); |
| 1162 | + relabel_configs.insert( |
| 1163 | + "to-stable".into(), |
| 1164 | + RelabelRuleConfig { |
| 1165 | + add_labels: vec!["regression-from-stable-to-stable".to_string()], |
| 1166 | + rem_labels: vec![ |
| 1167 | + "regression-from-stable-to-beta".to_string(), |
| 1168 | + "regression-from-stable-to-nightly".to_string(), |
| 1169 | + ], |
| 1170 | + }, |
| 1171 | + ); |
| 1172 | + |
| 1173 | + let expected_cfg = RelabelConfig { |
| 1174 | + allow_unauthenticated: vec!["ABCD-*".to_string()], |
| 1175 | + configs: Some(relabel_configs), |
| 1176 | + }; |
| 1177 | + |
| 1178 | + assert_eq!(config.relabel, Some(expected_cfg)); |
| 1179 | + } |
1095 | 1180 | } |
1096 | 1181 | } |
0 commit comments