@@ -785,33 +785,47 @@ impl Issue {
785785 Ok ( ( ) )
786786 }
787787
788- pub async fn remove_label ( & self , client : & GithubClient , label : & str ) -> anyhow:: Result < ( ) > {
789- log:: info!( "remove_label from {}: {:?}" , self . global_id( ) , label) ;
790- // DELETE /repos/:owner/:repo/issues/:number/labels/{name}
791- let url = format ! (
792- "{repo_url}/issues/{number}/labels/{name}" ,
793- repo_url = self . repository( ) . url( client) ,
794- number = self . number,
795- name = label,
788+ pub async fn remove_labels (
789+ & self ,
790+ client : & GithubClient ,
791+ labels : Vec < Label > ,
792+ ) -> anyhow:: Result < ( ) > {
793+ log:: info!( "remove_labels from {}: {:?}" , self . global_id( ) , labels) ;
794+
795+ // Don't try to remove labels not already present on this issue.
796+ let labels = labels
797+ . into_iter ( )
798+ . filter ( |l| self . labels ( ) . contains ( l) )
799+ . collect :: < Vec < _ > > ( ) ;
800+
801+ log:: info!(
802+ "remove_labels: {} filtered to {:?}" ,
803+ self . global_id( ) ,
804+ labels
796805 ) ;
797806
798- if !self
799- . labels ( )
800- . iter ( )
801- . any ( |l| l. name . to_lowercase ( ) == label. to_lowercase ( ) )
802- {
803- log:: info!(
804- "remove_label from {}: {:?} already not present, skipping" ,
805- self . global_id( ) ,
806- label
807- ) ;
807+ if labels. is_empty ( ) {
808808 return Ok ( ( ) ) ;
809809 }
810810
811- client
812- . send_req ( client. delete ( & url) )
813- . await
814- . context ( "failed to delete label" ) ?;
811+ // There is no API to remove all labels at once, so we issue as many
812+ // API requests are required in parallel.
813+ let requests = labels. into_iter ( ) . map ( |label| async move {
814+ // DELETE /repos/:owner/:repo/issues/:number/labels/{name}
815+ let url = format ! (
816+ "{repo_url}/issues/{number}/labels/{name}" ,
817+ repo_url = self . repository( ) . url( client) ,
818+ number = self . number,
819+ name = label. name,
820+ ) ;
821+
822+ client
823+ . send_req ( client. delete ( & url) )
824+ . await
825+ . with_context ( || format ! ( "failed to remove {label:?}" ) )
826+ } ) ;
827+
828+ futures:: future:: try_join_all ( requests) . await ?;
815829
816830 Ok ( ( ) )
817831 }
0 commit comments