@@ -256,53 +256,55 @@ pub(crate) struct RelabelConfig {
256256 pub ( crate ) allow_unauthenticated : Vec < String > ,
257257 // alias identifier -> labels
258258 #[ serde( flatten) ]
259- pub ( crate ) configs : Option < HashMap < String , RelabelRuleConfig > > ,
259+ pub ( crate ) aliases : HashMap < String , RelabelAliasConfig > ,
260260}
261261
262262impl RelabelConfig {
263263 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- }
264+ let mut deltas = vec ! [ ] ;
265+ if !self . aliases . is_empty ( ) {
266+ // parse all tokens: if one matches an alias, extract the labels
267+ // else, it will assumed to be a valid label
268+ for tk in input. 0 . into_iter ( ) {
269+ let name = tk. label ( ) as & str ;
270+ if let Some ( alias) = self . aliases . get ( name) {
271+ let cmd = alias. to_command ( matches ! ( tk, LabelDelta :: Remove ( _) ) ) ;
272+ deltas. extend ( cmd. 0 ) ;
273+ } else {
274+ deltas. push ( tk) ;
278275 }
279276 }
280- None => {
281- return input;
282- }
283- } ;
284- input
277+ }
278+ RelabelCommand ( deltas)
285279 }
286280}
287281
288282#[ derive( Default , PartialEq , Eq , Debug , serde:: Deserialize ) ]
289283#[ serde( rename_all = "kebab-case" ) ]
290284#[ serde( deny_unknown_fields) ]
291- pub ( crate ) struct RelabelRuleConfig {
285+ pub ( crate ) struct RelabelAliasConfig {
292286 /// Labels to be added
293287 pub ( crate ) add_labels : Vec < String > ,
294288 /// Labels to be removed
295289 pub ( crate ) rem_labels : Vec < String > ,
296290}
297291
298- impl RelabelRuleConfig {
299- /// Translate a RelabelRuleConfig into a RelabelCommand for GitHub consumption
300- pub fn to_command ( & self ) -> RelabelCommand {
292+ impl RelabelAliasConfig {
293+ /// Translate a RelabelAliasConfig into a RelabelCommand for GitHub consumption
294+ pub fn to_command ( & self , inverted : bool ) -> RelabelCommand {
301295 let mut deltas = Vec :: new ( ) ;
302- for l in self . add_labels . iter ( ) {
296+ let mut add_labels = & self . add_labels ;
297+ let mut rem_labels = & self . rem_labels ;
298+
299+ // if the polarity of the alias is inverted, swap labels before parsing the command
300+ if inverted {
301+ std:: mem:: swap ( & mut add_labels, & mut rem_labels) ;
302+ }
303+
304+ for l in add_labels. iter ( ) {
303305 deltas. push ( LabelDelta :: Add ( Label ( l. into ( ) ) ) ) ;
304306 }
305- for l in self . rem_labels . iter ( ) {
307+ for l in rem_labels. iter ( ) {
306308 deltas. push ( LabelDelta :: Remove ( Label ( l. into ( ) ) ) ) ;
307309 }
308310 RelabelCommand ( deltas)
@@ -778,6 +780,8 @@ where
778780#[ cfg( test) ]
779781mod tests {
780782 use super :: * ;
783+ use parser:: error:: Error ;
784+ use parser:: token:: Tokenizer ;
781785
782786 #[ test]
783787 fn sample ( ) {
@@ -888,7 +892,7 @@ mod tests {
888892 Config {
889893 relabel: Some ( RelabelConfig {
890894 allow_unauthenticated: vec![ "C-*" . into( ) ] ,
891- configs : Some ( HashMap :: new( ) )
895+ aliases : HashMap :: new( )
892896 } ) ,
893897 assign: Some ( AssignConfig {
894898 warn_non_default_branch: WarnNonDefaultBranchConfig :: Simple ( false ) ,
@@ -1087,6 +1091,82 @@ mod tests {
10871091 ) ;
10881092 }
10891093
1094+ #[ test]
1095+ fn relabel_alias_config ( ) {
1096+ let config = r#"
1097+ [relabel.to-stable]
1098+ add-labels = ["regression-from-stable-to-stable"]
1099+ rem-labels = ["regression-from-stable-to-beta", "regression-from-stable-to-nightly"]
1100+ "# ;
1101+ let config = toml:: from_str :: < Config > ( & config) . unwrap ( ) ;
1102+
1103+ let mut relabel_configs = HashMap :: new ( ) ;
1104+ relabel_configs. insert (
1105+ "to-stable" . into ( ) ,
1106+ RelabelAliasConfig {
1107+ add_labels : vec ! [ "regression-from-stable-to-stable" . to_string( ) ] ,
1108+ rem_labels : vec ! [
1109+ "regression-from-stable-to-beta" . to_string( ) ,
1110+ "regression-from-stable-to-nightly" . to_string( ) ,
1111+ ] ,
1112+ } ,
1113+ ) ;
1114+
1115+ let expected_cfg = RelabelConfig {
1116+ allow_unauthenticated : vec ! [ ] ,
1117+ aliases : relabel_configs,
1118+ } ;
1119+
1120+ assert_eq ! ( config. relabel, Some ( expected_cfg) ) ;
1121+ }
1122+
1123+ #[ cfg( test) ]
1124+ fn parse < ' a > ( input : & ' a str ) -> Result < Option < Vec < LabelDelta > > , Error < ' a > > {
1125+ let mut toks = Tokenizer :: new ( input) ;
1126+ Ok ( RelabelCommand :: parse ( & mut toks) ?. map ( |c| c. 0 ) )
1127+ }
1128+
1129+ #[ test]
1130+ fn relabel_alias ( ) {
1131+ // [relabel.my-alias]
1132+ // add-labels = ["Alpha"]
1133+ // rem-labels = ["Bravo", "Charlie"]
1134+ let relabel_cfg = RelabelConfig {
1135+ allow_unauthenticated : vec ! [ ] ,
1136+ aliases : HashMap :: from ( [ (
1137+ "my-alias" . to_string ( ) ,
1138+ RelabelAliasConfig {
1139+ add_labels : vec ! [ "Alpha" . to_string( ) ] ,
1140+ rem_labels : vec ! [ "Bravo" . to_string( ) , "Charlie" . to_string( ) ] ,
1141+ } ,
1142+ ) ] ) ,
1143+ } ;
1144+
1145+ // @triagebot label my-alias
1146+ let deltas = parse ( "label my-alias" ) . unwrap ( ) . unwrap ( ) ;
1147+ let new_input = relabel_cfg. retrieve_command_from_alias ( RelabelCommand ( deltas) ) ;
1148+ assert_eq ! (
1149+ new_input,
1150+ RelabelCommand ( vec![
1151+ LabelDelta :: Add ( Label ( "Alpha" . into( ) ) ) ,
1152+ LabelDelta :: Remove ( Label ( "Bravo" . into( ) ) ) ,
1153+ LabelDelta :: Remove ( Label ( "Charlie" . into( ) ) ) ,
1154+ ] )
1155+ ) ;
1156+
1157+ // @triagebot label -my-alias
1158+ let deltas = parse ( "label -my-alias" ) . unwrap ( ) . unwrap ( ) ;
1159+ let new_input = relabel_cfg. retrieve_command_from_alias ( RelabelCommand ( deltas) ) ;
1160+ assert_eq ! (
1161+ new_input,
1162+ RelabelCommand ( vec![
1163+ LabelDelta :: Add ( Label ( "Bravo" . into( ) ) ) ,
1164+ LabelDelta :: Add ( Label ( "Charlie" . into( ) ) ) ,
1165+ LabelDelta :: Remove ( Label ( "Alpha" . into( ) ) ) ,
1166+ ] )
1167+ ) ;
1168+ }
1169+
10901170 #[ test]
10911171 fn issue_links_uncanonicalized ( ) {
10921172 let config = r#"
0 commit comments