@@ -25,6 +25,7 @@ use humantime::Duration;
2525use once_cell:: sync:: OnceCell ;
2626use sentry:: TransactionContext ;
2727use tokio:: runtime:: { Builder , Runtime } ;
28+ use tracing:: info;
2829use tracing_log:: LogTracer ;
2930use tracing_subscriber:: { filter:: Directive , prelude:: * , EnvFilter } ;
3031
@@ -515,6 +516,9 @@ enum DatabaseSubcommand {
515516 /// Backfill GitHub/Gitlab stats for crates.
516517 BackfillRepositoryStats ,
517518
519+ /// Backfill crate owner kind from crates.io API
520+ BackfillCrateOwnerKind ,
521+
518522 /// Updates info for a crate from the registry's API
519523 UpdateCrateRegistryFields {
520524 #[ arg( name = "CRATE" ) ]
@@ -601,6 +605,37 @@ impl DatabaseSubcommand {
601605 . block_on ( ctx. repository_stats_updater ( ) ?. backfill_repositories ( ) ) ?;
602606 }
603607
608+ Self :: BackfillCrateOwnerKind => {
609+ let pool = ctx. pool ( ) ?;
610+ ctx. runtime ( ) ?
611+ . block_on ( async {
612+ let mut list_crates_conn = pool. get_async ( ) . await ?;
613+ let mut update_crates_conn = pool. get_async ( ) . await ?;
614+
615+ let mut result_stream =
616+ sqlx:: query!( "SELECT id, name FROM crates ORDER BY name" )
617+ . fetch ( & mut * list_crates_conn) ;
618+
619+ while let Some ( row) = result_stream. next ( ) . await {
620+ let row = row?;
621+ let registry_data =
622+ ctx. registry_api ( ) ?. get_crate_data ( & row. name ) . await ?;
623+
624+ info ! ( "Updating crate {}" , row. name) ;
625+
626+ db:: update_crate_data_in_db_by_id (
627+ & mut update_crates_conn,
628+ row. id ,
629+ & registry_data,
630+ )
631+ . await ?;
632+ }
633+
634+ Ok :: < ( ) , anyhow:: Error > ( ( ) )
635+ } )
636+ . context ( "Failed to backfill crate owner kind" ) ?
637+ }
638+
604639 Self :: UpdateCrateRegistryFields { name } => ctx. runtime ( ) ?. block_on ( async move {
605640 let mut conn = ctx. pool ( ) ?. get_async ( ) . await ?;
606641 let registry_data = ctx. registry_api ( ) ?. get_crate_data ( & name) . await ?;
0 commit comments