11use crate :: models:: update_default_version;
22use crate :: schema:: crates;
33use crate :: storage:: Storage ;
4+ use crate :: tasks:: spawn_blocking;
45use crate :: worker:: jobs;
56use crate :: { admin:: dialoguer, db, schema:: versions} ;
67use anyhow:: Context ;
@@ -25,86 +26,88 @@ pub struct Opts {
2526 yes : bool ,
2627}
2728
28- pub fn run ( opts : Opts ) -> anyhow:: Result < ( ) > {
29- let crate_name = & opts. crate_name ;
30-
31- let conn = & mut db:: oneoff_connection ( ) . context ( "Failed to establish database connection" ) ?;
32-
33- let store = Storage :: from_environment ( ) ;
34-
35- let crate_id: i32 = crates:: table
36- . select ( crates:: id)
37- . filter ( crates:: name. eq ( crate_name) )
38- . first ( conn)
39- . context ( "Failed to look up crate id from the database" ) ?;
40-
41- println ! ( "Deleting the following versions of the `{crate_name}` crate:" ) ;
42- println ! ( ) ;
43- for version in & opts. versions {
44- println ! ( " - {version}" ) ;
45- }
46- println ! ( ) ;
47-
48- if !opts. yes && !dialoguer:: confirm ( "Do you want to permanently delete these versions?" ) {
49- return Ok ( ( ) ) ;
50- }
51-
52- conn. transaction ( |conn| {
53- info ! ( %crate_name, %crate_id, versions = ?opts. versions, "Deleting versions from the database" ) ;
54- let result = diesel:: delete (
55- versions:: table
56- . filter ( versions:: crate_id. eq ( crate_id) )
57- . filter ( versions:: num. eq_any ( & opts. versions ) ) ,
58- )
59- . execute ( conn) ;
60-
61- match result {
62- Ok ( num_deleted) if num_deleted == opts. versions . len ( ) => { }
63- Ok ( num_deleted) => {
64- warn ! (
65- %crate_name,
66- "Deleted only {num_deleted} of {num_expected} versions from the database" ,
67- num_expected = opts. versions. len( )
68- ) ;
69- }
70- Err ( error) => {
71- warn ! ( %crate_name, ?error, "Failed to delete versions from the database" )
72- }
29+ pub async fn run ( opts : Opts ) -> anyhow:: Result < ( ) > {
30+ spawn_blocking ( move || {
31+ let crate_name = & opts. crate_name ;
32+
33+ let conn = & mut db:: oneoff_connection ( ) . context ( "Failed to establish database connection" ) ?;
34+
35+ let store = Storage :: from_environment ( ) ;
36+
37+ let crate_id: i32 = crates:: table
38+ . select ( crates:: id)
39+ . filter ( crates:: name. eq ( crate_name) )
40+ . first ( conn)
41+ . context ( "Failed to look up crate id from the database" ) ?;
42+
43+ println ! ( "Deleting the following versions of the `{crate_name}` crate:" ) ;
44+ println ! ( ) ;
45+ for version in & opts. versions {
46+ println ! ( " - {version}" ) ;
7347 }
48+ println ! ( ) ;
7449
75- info ! ( %crate_name, %crate_id, "Updating default version in the database" ) ;
76- if let Err ( error) = update_default_version ( crate_id, conn) {
77- warn ! ( %crate_name, %crate_id, ?error, "Failed to update default version" ) ;
50+ if !opts. yes && !dialoguer:: confirm ( "Do you want to permanently delete these versions?" ) {
51+ return Ok ( ( ) ) ;
7852 }
7953
80- Ok :: < _ , anyhow:: Error > ( ( ) )
81- } ) ?;
54+ conn. transaction ( |conn| {
55+ info ! ( %crate_name, %crate_id, versions = ?opts. versions, "Deleting versions from the database" ) ;
56+ let result = diesel:: delete (
57+ versions:: table
58+ . filter ( versions:: crate_id. eq ( crate_id) )
59+ . filter ( versions:: num. eq_any ( & opts. versions ) ) ,
60+ )
61+ . execute ( conn) ;
62+
63+ match result {
64+ Ok ( num_deleted) if num_deleted == opts. versions . len ( ) => { }
65+ Ok ( num_deleted) => {
66+ warn ! (
67+ %crate_name,
68+ "Deleted only {num_deleted} of {num_expected} versions from the database" ,
69+ num_expected = opts. versions. len( )
70+ ) ;
71+ }
72+ Err ( error) => {
73+ warn ! ( %crate_name, ?error, "Failed to delete versions from the database" )
74+ }
75+ }
8276
83- info ! ( %crate_name, "Enqueuing index sync jobs ") ;
84- if let Err ( error) = jobs :: enqueue_sync_to_index ( crate_name , conn) {
85- warn ! ( %crate_name, ?error, "Failed to enqueue index sync jobs " ) ;
86- }
77+ info ! ( %crate_name, %crate_id , "Updating default version in the database ") ;
78+ if let Err ( error) = update_default_version ( crate_id , conn) {
79+ warn ! ( %crate_name, %crate_id , ?error, "Failed to update default version " ) ;
80+ }
8781
88- let rt = tokio:: runtime:: Builder :: new_current_thread ( )
89- . enable_all ( )
90- . build ( )
91- . context ( "Failed to initialize tokio runtime" ) ?;
82+ Ok :: < _ , anyhow:: Error > ( ( ) )
83+ } ) ?;
9284
93- for version in & opts. versions {
94- debug ! ( %crate_name, %version, "Deleting crate file from S3" ) ;
95- if let Err ( error) = rt. block_on ( store. delete_crate_file ( crate_name, version) ) {
96- warn ! ( %crate_name, %version, ?error, "Failed to delete crate file from S3" ) ;
85+ info ! ( %crate_name, "Enqueuing index sync jobs" ) ;
86+ if let Err ( error) = jobs:: enqueue_sync_to_index ( crate_name, conn) {
87+ warn ! ( %crate_name, ?error, "Failed to enqueue index sync jobs" ) ;
9788 }
9889
99- debug ! ( %crate_name, %version, "Deleting readme file from S3" ) ;
100- match rt. block_on ( store. delete_readme ( crate_name, version) ) {
101- Err ( object_store:: Error :: NotFound { .. } ) => { }
102- Err ( error) => {
103- warn ! ( %crate_name, %version, ?error, "Failed to delete readme file from S3" )
90+ let rt = tokio:: runtime:: Builder :: new_current_thread ( )
91+ . enable_all ( )
92+ . build ( )
93+ . context ( "Failed to initialize tokio runtime" ) ?;
94+
95+ for version in & opts. versions {
96+ debug ! ( %crate_name, %version, "Deleting crate file from S3" ) ;
97+ if let Err ( error) = rt. block_on ( store. delete_crate_file ( crate_name, version) ) {
98+ warn ! ( %crate_name, %version, ?error, "Failed to delete crate file from S3" ) ;
99+ }
100+
101+ debug ! ( %crate_name, %version, "Deleting readme file from S3" ) ;
102+ match rt. block_on ( store. delete_readme ( crate_name, version) ) {
103+ Err ( object_store:: Error :: NotFound { .. } ) => { }
104+ Err ( error) => {
105+ warn ! ( %crate_name, %version, ?error, "Failed to delete readme file from S3" )
106+ }
107+ Ok ( _) => { }
104108 }
105- Ok ( _) => { }
106109 }
107- }
108110
109- Ok ( ( ) )
111+ Ok ( ( ) )
112+ } ) . await
110113}
0 commit comments