Skip to content

Commit 1891ef9

Browse files
committed
crates-admin: populate min_version when deleting a crate
This calculates the next semver-incompatible version of the crate being deleted and inserts it as `deleted_crates.min_version`.
1 parent 20b4063 commit 1891ef9

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

src/bin/crates-admin/delete_crate.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::dialoguer;
22
use anyhow::Context;
33
use chrono::{NaiveDateTime, Utc};
44
use colored::Colorize;
5-
use crates_io::models::{NewDeletedCrate, User};
5+
use crates_io::models::{NewDeletedCrate, TopVersions, User};
66
use crates_io::schema::{crate_downloads, deleted_crates};
77
use crates_io::worker::jobs;
88
use 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+
159185
impl Display for CrateInfo {
160186
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
161187
let id = self.id;

0 commit comments

Comments
 (0)