@@ -140,14 +140,15 @@ fn parser_try<'a>(command: &'a str, parts: &[CommandPart<'a>]) -> ParseResult<'a
140
140
}
141
141
142
142
let mut parent = None ;
143
+ let mut jobs = Vec :: new ( ) ;
143
144
144
145
for part in parts {
145
146
match part {
146
147
CommandPart :: Bare ( key) => {
147
148
return Some ( Err ( CommandParseError :: UnknownArg ( key) ) ) ;
148
149
}
149
- CommandPart :: KeyValue { key, value } => {
150
- if * key == "parent" {
150
+ CommandPart :: KeyValue { key, value } => match * key {
151
+ "parent" => {
151
152
parent = if * value == "last" {
152
153
Some ( Parent :: Last )
153
154
} else {
@@ -160,18 +161,35 @@ fn parser_try<'a>(command: &'a str, parts: &[CommandPart<'a>]) -> ParseResult<'a
160
161
}
161
162
}
162
163
}
163
- } else {
164
+ }
165
+ "jobs" => {
166
+ let raw_jobs: Vec < _ > = value. split ( ',' ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
167
+ if raw_jobs. is_empty ( ) {
168
+ return Some ( Err ( CommandParseError :: ValidationError (
169
+ "Try jobs must not be empty" . to_string ( ) ,
170
+ ) ) ) ;
171
+ }
172
+
173
+ // rust ci currently allows specifying 10 jobs max
174
+ if raw_jobs. len ( ) > 10 {
175
+ return Some ( Err ( CommandParseError :: ValidationError (
176
+ "Try jobs must not have more than 10 jobs" . to_string ( ) ,
177
+ ) ) ) ;
178
+ }
179
+ jobs = raw_jobs;
180
+ }
181
+ _ => {
164
182
return Some ( Err ( CommandParseError :: UnknownArg ( key) ) ) ;
165
183
}
166
- }
184
+ } ,
167
185
}
168
186
}
169
- Some ( Ok ( BorsCommand :: Try { parent } ) )
187
+ Some ( Ok ( BorsCommand :: Try { parent, jobs } ) )
170
188
}
171
189
172
190
/// Parses "@bors try cancel".
173
191
fn parser_try_cancel < ' a > ( command : & ' a str , parts : & [ CommandPart < ' a > ] ) -> ParseResult < ' a > {
174
- if command == "try" && parts. get ( 0 ) == Some ( & CommandPart :: Bare ( "cancel" ) ) {
192
+ if command == "try" && parts. first ( ) == Some ( & CommandPart :: Bare ( "cancel" ) ) {
175
193
Some ( Ok ( BorsCommand :: TryCancel ) )
176
194
} else {
177
195
None
@@ -262,14 +280,28 @@ line two
262
280
"# ,
263
281
) ;
264
282
assert_eq ! ( cmds. len( ) , 1 ) ;
265
- assert ! ( matches!( cmds[ 0 ] , Ok ( BorsCommand :: Try { parent: None } ) ) ) ;
283
+ insta:: assert_debug_snapshot!( cmds[ 0 ] , @r###"
284
+ Ok(
285
+ Try {
286
+ parent: None,
287
+ jobs: [],
288
+ },
289
+ )
290
+ "### ) ;
266
291
}
267
292
268
293
#[ test]
269
294
fn parse_try ( ) {
270
295
let cmds = parse_commands ( "@bors try" ) ;
271
296
assert_eq ! ( cmds. len( ) , 1 ) ;
272
- assert ! ( matches!( cmds[ 0 ] , Ok ( BorsCommand :: Try { parent: None } ) ) ) ;
297
+ insta:: assert_debug_snapshot!( cmds[ 0 ] , @r###"
298
+ Ok(
299
+ Try {
300
+ parent: None,
301
+ jobs: [],
302
+ },
303
+ )
304
+ "### ) ;
273
305
}
274
306
275
307
#[ test]
@@ -281,7 +313,8 @@ line two
281
313
Ok ( BorsCommand :: Try {
282
314
parent: Some ( Parent :: CommitSha ( CommitSha (
283
315
"ea9c1b050cc8b420c2c211d2177811e564a4dc60" . to_string( )
284
- ) ) )
316
+ ) ) ) ,
317
+ jobs: Vec :: new( )
285
318
} )
286
319
) ;
287
320
}
@@ -293,7 +326,8 @@ line two
293
326
assert_eq ! (
294
327
cmds[ 0 ] ,
295
328
Ok ( BorsCommand :: Try {
296
- parent: Some ( Parent :: Last )
329
+ parent: Some ( Parent :: Last ) ,
330
+ jobs: Vec :: new( )
297
331
} )
298
332
) ;
299
333
}
@@ -311,6 +345,46 @@ line two
311
345
"### ) ;
312
346
}
313
347
348
+ #[ test]
349
+ fn parse_try_jobs ( ) {
350
+ let cmds = parse_commands ( "@bors try jobs=ci,lint" ) ;
351
+ assert_eq ! ( cmds. len( ) , 1 ) ;
352
+ assert_eq ! (
353
+ cmds[ 0 ] ,
354
+ Ok ( BorsCommand :: Try {
355
+ parent: None ,
356
+ jobs: vec![ "ci" . to_string( ) , "lint" . to_string( ) ]
357
+ } )
358
+ ) ;
359
+ }
360
+
361
+ #[ test]
362
+ fn parse_try_jobs_empty ( ) {
363
+ let cmds = parse_commands ( "@bors try jobs=" ) ;
364
+ assert_eq ! ( cmds. len( ) , 1 ) ;
365
+ insta:: assert_debug_snapshot!( cmds[ 0 ] , @r###"
366
+ Err(
367
+ MissingArgValue {
368
+ arg: "jobs",
369
+ },
370
+ )
371
+ "### ) ;
372
+ }
373
+
374
+ #[ test]
375
+ fn parse_try_jobs_too_many ( ) {
376
+ let cmds =
377
+ parse_commands ( "@bors try jobs=ci,lint,foo,bar,baz,qux,quux,corge,grault,garply,waldo" ) ;
378
+ assert_eq ! ( cmds. len( ) , 1 ) ;
379
+ insta:: assert_debug_snapshot!( cmds[ 0 ] , @r###"
380
+ Err(
381
+ ValidationError(
382
+ "Try jobs must not have more than 10 jobs",
383
+ ),
384
+ )
385
+ "### ) ;
386
+ }
387
+
314
388
#[ test]
315
389
fn parse_try_unknown_arg ( ) {
316
390
let cmds = parse_commands ( "@bors try a" ) ;
@@ -333,7 +407,14 @@ line two
333
407
"# ,
334
408
) ;
335
409
assert_eq ! ( cmds. len( ) , 1 ) ;
336
- assert ! ( matches!( cmds[ 0 ] , Ok ( BorsCommand :: Try { parent: None } ) ) ) ;
410
+ insta:: assert_debug_snapshot!( cmds[ 0 ] , @r###"
411
+ Ok(
412
+ Try {
413
+ parent: None,
414
+ jobs: [],
415
+ },
416
+ )
417
+ "### )
337
418
}
338
419
339
420
#[ test]
0 commit comments