@@ -366,13 +366,18 @@ impl IssueRepository {
366
366
)
367
367
}
368
368
369
- async fn has_label ( & self , client : & GithubClient , label : & str ) -> bool {
369
+ async fn has_label ( & self , client : & GithubClient , label : & str ) -> anyhow :: Result < bool > {
370
370
#[ allow( clippy:: redundant_pattern_matching) ]
371
371
let url = format ! ( "{}/labels/{}" , self . url( ) , label) ;
372
- match client. send_req ( client. get ( & url) ) . await {
373
- Ok ( _) => true ,
374
- // XXX: Error handling if the request failed for reasons beyond 'label didn't exist'
375
- Err ( _) => false ,
372
+ match client. _send_req ( client. get ( & url) ) . await {
373
+ Ok ( ( _, _) ) => Ok ( true ) ,
374
+ Err ( e) => {
375
+ if e. downcast_ref :: < reqwest:: Error > ( ) . map_or ( false , |e| e. status ( ) == Some ( StatusCode :: NOT_FOUND ) ) {
376
+ Ok ( false )
377
+ } else {
378
+ Err ( e)
379
+ }
380
+ }
376
381
}
377
382
}
378
383
}
@@ -519,20 +524,32 @@ impl Issue {
519
524
return Ok ( ( ) ) ;
520
525
}
521
526
522
- for label in & labels {
523
- if !self . repository ( ) . has_label ( client, & label) . await {
524
- anyhow:: bail!( "Label {} does not exist in {}" , label, self . global_id( ) ) ;
527
+ let mut unknown_labels = vec ! [ ] ;
528
+ let mut known_labels = vec ! [ ] ;
529
+ for label in labels {
530
+ if !self . repository ( ) . has_label ( client, & label) . await ? {
531
+ unknown_labels. push ( label) ;
532
+ } else {
533
+ known_labels. push ( label) ;
525
534
}
526
535
}
527
536
528
537
#[ derive( serde:: Serialize ) ]
529
538
struct LabelsReq {
530
539
labels : Vec < String > ,
531
540
}
532
- client
533
- . _send_req ( client. post ( & url) . json ( & LabelsReq { labels } ) )
534
- . await
535
- . context ( "failed to add labels" ) ?;
541
+
542
+ if !known_labels. is_empty ( ) {
543
+ client
544
+ . _send_req ( client. post ( & url) . json ( & LabelsReq { labels : known_labels } ) )
545
+ . await
546
+ . context ( "failed to add labels" ) ?;
547
+ }
548
+
549
+ if !unknown_labels. is_empty ( ) {
550
+ let comment = String :: from ( "Unknown labels:\n - " ) + & unknown_labels. join ( "\n - " ) ;
551
+ self . post_comment ( client, & comment) . await . context ( "failed to post missing label comment" ) ?;
552
+ }
536
553
537
554
Ok ( ( ) )
538
555
}
0 commit comments