|
1 | 1 | use crate::cdn;
|
2 |
| -use crate::db::{delete_crate, Pool}; |
| 2 | +use crate::db::{delete_crate, delete_version, Pool}; |
3 | 3 | use crate::docbuilder::PackageKind;
|
4 | 4 | use crate::error::Result;
|
5 | 5 | use crate::storage::Storage;
|
@@ -283,16 +283,52 @@ impl BuildQueue {
|
283 | 283 | changes.reverse();
|
284 | 284 |
|
285 | 285 | for change in &changes {
|
286 |
| - if let Some((ref krate, ..)) = change.deleted() { |
287 |
| - match delete_crate(&mut conn, &self.storage, &self.config, krate) |
288 |
| - .with_context(|| format!("failed to delete crate {krate}")) |
289 |
| - { |
290 |
| - Ok(_) => info!( |
291 |
| - "crate {} was deleted from the index and the database", |
292 |
| - krate |
293 |
| - ), |
294 |
| - Err(err) => report_error(&err), |
| 286 | + if let Some((ref krate, versions)) = change.deleted() { |
| 287 | + for version in versions { |
| 288 | + let version = version.version.as_str(); |
| 289 | + match delete_version(&mut conn, &self.storage, &self.config, krate, version) |
| 290 | + .with_context(|| format!("failed to delete version {krate} {version}")) |
| 291 | + { |
| 292 | + Ok(_) => info!( |
| 293 | + "version {} {} was deleted from the index and the database", |
| 294 | + krate, version, |
| 295 | + ), |
| 296 | + Err(err) => report_error(&err), |
| 297 | + } |
295 | 298 | }
|
| 299 | + |
| 300 | + // FIXME: Change::Deleted (and `.deleted()`) is documented to be only crate-deletes, |
| 301 | + // but can also be one or multiple version-deletes. |
| 302 | + // Until crates-index-diff can separately emit crate- or version-deletes, |
| 303 | + // we try to figure this out here. |
| 304 | + let versions_remaining: i32 = conn |
| 305 | + .query_one( |
| 306 | + " |
| 307 | + SELECT |
| 308 | + COUNT(*) |
| 309 | + FROM |
| 310 | + crates |
| 311 | + INNER JOIN releases ON crates.id = releases.crate_id |
| 312 | + WHERE |
| 313 | + crates.name = $1 |
| 314 | + ", |
| 315 | + &[&krate], |
| 316 | + ) |
| 317 | + .with_context(|| format!("could not fetch version count for crate {krate}"))? |
| 318 | + .get(0); |
| 319 | + |
| 320 | + if versions_remaining == 0 { |
| 321 | + match delete_crate(&mut conn, &self.storage, &self.config, krate) |
| 322 | + .with_context(|| format!("failed to delete crate {krate}")) |
| 323 | + { |
| 324 | + Ok(_) => info!( |
| 325 | + "crate {} was deleted from the index and the database", |
| 326 | + krate |
| 327 | + ), |
| 328 | + Err(err) => report_error(&err), |
| 329 | + } |
| 330 | + } |
| 331 | + |
296 | 332 | if let Err(err) = cdn::queue_crate_invalidation(&mut *conn, &self.config, krate) {
|
297 | 333 | report_error(&err);
|
298 | 334 | }
|
|
0 commit comments