@@ -2,7 +2,7 @@ use crate::dialoguer;
22use anyhow:: Context ;
33use chrono:: { NaiveDateTime , Utc } ;
44use colored:: Colorize ;
5- use crates_io:: models:: { NewDeletedCrate , User } ;
5+ use crates_io:: models:: { NewDeletedCrate , TopVersions , User } ;
66use crates_io:: schema:: { crate_downloads, deleted_crates} ;
77use crates_io:: worker:: jobs;
88use crates_io:: { db, schema:: crates} ;
@@ -80,13 +80,25 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> {
8080 if let Some ( crate_info) = existing_crates. iter ( ) . find ( |info| info. name == * name) {
8181 let id = crate_info. id ;
8282
83+ let min_version = crate_info. top_versions ( & mut conn) . await ?. highest . map (
84+ |semver:: Version { major, minor, .. } | {
85+ if major > 0 {
86+ semver:: Version :: new ( major + 1 , 0 , 0 )
87+ } else {
88+ semver:: Version :: new ( 0 , minor + 1 , 0 )
89+ }
90+ . to_string ( )
91+ } ,
92+ ) ;
93+
8394 let created_at = crate_info. created_at . and_utc ( ) ;
8495 let deleted_crate = NewDeletedCrate :: builder ( name)
8596 . created_at ( & created_at)
8697 . deleted_at ( & now)
8798 . deleted_by ( deleted_by. id )
8899 . maybe_message ( opts. message . as_deref ( ) )
89100 . available_at ( & now)
101+ . maybe_min_version ( min_version. as_deref ( ) )
90102 . build ( ) ;
91103
92104 info ! ( "{name}: Deleting crate from the database…" ) ;
@@ -156,6 +168,20 @@ struct CrateInfo {
156168 rev_deps : i64 ,
157169}
158170
171+ impl CrateInfo {
172+ async fn top_versions ( & self , conn : & mut AsyncPgConnection ) -> QueryResult < TopVersions > {
173+ use crates_io_database:: schema:: versions:: dsl:: * ;
174+
175+ Ok ( TopVersions :: from_date_version_pairs (
176+ versions
177+ . filter ( crate_id. eq ( self . id ) )
178+ . select ( ( created_at, num) )
179+ . load ( conn)
180+ . await ?,
181+ ) )
182+ }
183+ }
184+
159185impl Display for CrateInfo {
160186 fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
161187 let id = self . id ;
0 commit comments