Skip to content

Commit db4682b

Browse files
committed
admin/delete_crate: Print warning for crates with reverse dependencies
1 parent 1fc6226 commit db4682b

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

src/admin/delete_crate.rs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use anyhow::Context;
55
use colored::Colorize;
66
use crates_io_worker::BackgroundJob;
77
use diesel::dsl::sql;
8-
use diesel::sql_types::{Array, Text};
8+
use diesel::sql_types::{Array, BigInt, Text};
99
use diesel::{ExpressionMethods, QueryDsl};
1010
use diesel_async::RunQueryDsl;
1111
use futures_util::TryStreamExt;
@@ -59,14 +59,30 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> {
5959
)
6060
"#,
6161
),
62+
sql::<BigInt>(
63+
// This is an incorrect reverse dependencies query, since it
64+
// includes the `dependencies` rows for all versions, not just
65+
// the "default version" per crate. However, it's good enough
66+
// for our purposes here.
67+
r#"
68+
(
69+
SELECT COUNT(*)
70+
FROM dependencies
71+
WHERE dependencies.crate_id = crates.id
72+
)
73+
"#,
74+
),
6275
))
63-
.load_stream::<(String, i32, i64, Vec<String>)>(&mut conn)
76+
.load_stream::<(String, i32, i64, Vec<String>, i64)>(&mut conn)
6477
.await
6578
.context("Failed to look up crate name from the database")?
66-
.try_fold(HashMap::new(), |mut map, (name, id, downloads, owners)| {
67-
map.insert(name, CrateInfo::new(id, downloads, owners));
68-
futures_util::future::ready(Ok(map))
69-
})
79+
.try_fold(
80+
HashMap::new(),
81+
|mut map, (name, id, downloads, owners, rev_deps)| {
82+
map.insert(name, CrateInfo::new(id, downloads, owners, rev_deps));
83+
futures_util::future::ready(Ok(map))
84+
},
85+
)
7086
.await?;
7187

7288
println!("Deleting the following crates:");
@@ -126,14 +142,16 @@ struct CrateInfo {
126142
id: i32,
127143
downloads: i64,
128144
owners: Vec<String>,
145+
rev_deps: i64,
129146
}
130147

131148
impl CrateInfo {
132-
pub fn new(id: i32, downloads: i64, owners: Vec<String>) -> Self {
149+
pub fn new(id: i32, downloads: i64, owners: Vec<String>, rev_deps: i64) -> Self {
133150
Self {
134151
id,
135152
downloads,
136153
owners,
154+
rev_deps,
137155
}
138156
}
139157
}
@@ -148,6 +166,10 @@ impl Display for CrateInfo {
148166
let downloads = format!("downloads={}", self.downloads).bright_red().bold();
149167
write!(f, ", {downloads}")?;
150168
}
169+
if self.rev_deps > 0 {
170+
let rev_deps = format!("rev_deps={}", self.rev_deps).bright_red().bold();
171+
write!(f, ", {rev_deps}")?;
172+
}
151173

152174
Ok(())
153175
}

0 commit comments

Comments
 (0)