Skip to content

Commit 108b3a7

Browse files
committed
delete crates when they are deleted from the index
* using the changes from Byron/crates-index-diff-rs#15 * also upgrades `rustwide` and `git2` since `crates-index-diff` the includes release includes an update of `libgit2` * adaptions due to `rustwide` changes in rust-lang/rustwide#65
1 parent c280b04 commit 108b3a7

File tree

7 files changed

+67
-38
lines changed

7 files changed

+67
-38
lines changed

Cargo.lock

Lines changed: 8 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ regex = "1"
2828
structopt = "0.3"
2929
crates-index = { version = "0.18.5", optional = true }
3030
rayon = { version = "1", optional = true }
31-
crates-index-diff = "8.0.0"
31+
crates-index-diff = "10.0.0"
3232
reqwest = { version = "0.11", features = ["blocking", "json"] } # TODO: Remove blocking when async is ready
3333
semver = { version = "1.0.4", features = ["serde"] }
3434
slug = "0.1.1"
@@ -49,11 +49,11 @@ schemamama = "0.3"
4949
schemamama_postgres = "0.3"
5050
systemstat = "0.1.4"
5151
prometheus = { version = "0.13.0", default-features = false }
52-
rustwide = "0.14.0"
52+
rustwide = "0.15.0"
5353
mime_guess = "2"
5454
dotenv = "0.15"
5555
zstd = "0.11.0"
56-
git2 = { version = "0.13.6", default-features = false }
56+
git2 = { version = "0.14.4", default-features = false }
5757
path-slash = "0.1.3"
5858
once_cell = { version = "1.4.0", features = ["parking_lot"] }
5959
base64 = "0.13"
@@ -116,7 +116,7 @@ test-case = "2.0.0"
116116

117117
[build-dependencies]
118118
time = "0.3"
119-
git2 = { version = "0.13", default-features = false }
119+
git2 = { version = "0.14", default-features = false }
120120
sass-rs = "0.2.2"
121121
string_cache_codegen = "0.5.1"
122122
walkdir = "2"

src/bin/cratesfyi.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,13 @@ impl DatabaseSubcommand {
452452
}
453453
Self::Delete {
454454
command: DeleteSubcommand::Crate { name },
455-
} => db::delete_crate(&ctx, &name).context("failed to delete the crate")?,
455+
} => db::delete_crate(
456+
&mut *ctx.pool()?.get()?,
457+
&*ctx.storage()?,
458+
&*ctx.config()?,
459+
&name,
460+
)
461+
.context("failed to delete the crate")?,
456462
Self::Blacklist { command } => command.handle_args(ctx)?,
457463

458464
#[cfg(feature = "consistency_check")]
@@ -570,6 +576,7 @@ impl Context for BinContext {
570576
self.pool()?,
571577
self.metrics()?,
572578
self.config()?,
579+
self.storage()?,
573580
);
574581
fn storage(self) -> Storage = Storage::new(
575582
self.pool()?,

src/build_queue.rs

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use crate::db::Pool;
1+
use crate::db::{delete_crate, Pool};
22
use crate::docbuilder::PackageKind;
33
use crate::error::Result;
4+
use crate::storage::Storage;
45
use crate::utils::{get_crate_priority, report_error};
56
use crate::{Config, Index, Metrics, RustwideBuilder};
67
use anyhow::Context;
78

8-
use crates_index_diff::ChangeKind;
9+
use crates_index_diff::Change;
910
use log::debug;
1011

1112
use std::fs;
@@ -25,18 +26,25 @@ pub(crate) struct QueuedCrate {
2526
#[derive(Debug)]
2627
pub struct BuildQueue {
2728
config: Arc<Config>,
29+
storage: Arc<Storage>,
2830
pub(crate) db: Pool,
2931
metrics: Arc<Metrics>,
3032
max_attempts: i32,
3133
}
3234

3335
impl BuildQueue {
34-
pub fn new(db: Pool, metrics: Arc<Metrics>, config: Arc<Config>) -> Self {
36+
pub fn new(
37+
db: Pool,
38+
metrics: Arc<Metrics>,
39+
config: Arc<Config>,
40+
storage: Arc<Storage>,
41+
) -> Self {
3542
BuildQueue {
3643
max_attempts: config.build_attempts.into(),
3744
config,
3845
db,
3946
metrics,
47+
storage,
4048
}
4149
}
4250

@@ -194,9 +202,9 @@ impl BuildQueue {
194202
// I believe this will fix ordering of queue if we get more than one crate from changes
195203
changes.reverse();
196204

197-
for krate in &changes {
198-
match krate.kind {
199-
ChangeKind::Yanked => {
205+
for change in &changes {
206+
match change {
207+
Change::Yanked(release) => {
200208
let res = conn
201209
.execute(
202210
"
@@ -207,43 +215,51 @@ impl BuildQueue {
207215
AND name = $1
208216
AND version = $2
209217
",
210-
&[&krate.name, &krate.version],
218+
&[&release.name, &release.version],
211219
)
212220
.with_context(|| {
213221
format!(
214222
"error while setting {}-{} to yanked",
215-
krate.name, krate.version
223+
release.name, release.version
216224
)
217225
});
218226
match res {
219-
Ok(_) => debug!("{}-{} yanked", krate.name, krate.version),
227+
Ok(_) => debug!("{}-{} yanked", release.name, release.version),
220228
Err(err) => report_error(&err),
221229
}
222230
}
223231

224-
ChangeKind::Added => {
225-
let priority = get_crate_priority(&mut conn, &krate.name)?;
232+
Change::Added(release) => {
233+
let priority = get_crate_priority(&mut conn, &release.name)?;
226234

227235
match self
228236
.add_crate(
229-
&krate.name,
230-
&krate.version,
237+
&release.name,
238+
&release.version,
231239
priority,
232240
index.repository_url(),
233241
)
234242
.with_context(|| {
235243
format!(
236244
"failed adding {}-{} into build queue",
237-
krate.name, krate.version
245+
release.name, release.version
238246
)
239247
}) {
240248
Ok(()) => {
241-
debug!("{}-{} added into build queue", krate.name, krate.version);
249+
debug!(
250+
"{}-{} added into build queue",
251+
release.name, release.version
252+
);
242253
crates_added += 1;
243254
}
244255
Err(err) => report_error(&err),
245256
}
246257
}
258+
259+
Change::Deleted(krate) => {
260+
delete_crate(&mut conn, &self.storage, &self.config, krate)
261+
.with_context(|| format!("failed to delete crate {}", krate))?;
262+
}
247263
}
248264
}
249265

src/db/delete.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::error::Result;
2-
use crate::storage::{rustdoc_archive_path, source_archive_path};
3-
use crate::Context;
2+
use crate::storage::{rustdoc_archive_path, source_archive_path, Storage};
3+
use crate::{Config, Context};
44
use anyhow::Context as _;
55
use postgres::Client;
66
use std::fs;
@@ -16,8 +16,12 @@ enum CrateDeletionError {
1616
MissingCrate(String),
1717
}
1818

19-
pub fn delete_crate(ctx: &dyn Context, name: &str) -> Result<()> {
20-
let conn = &mut ctx.pool()?.get()?;
19+
pub fn delete_crate(
20+
conn: &mut Client,
21+
storage: &Storage,
22+
config: &Config,
23+
name: &str,
24+
) -> Result<()> {
2125
let crate_id = get_id(conn, name)?;
2226
let is_library = delete_crate_from_database(conn, name, crate_id)?;
2327
// #899
@@ -31,10 +35,10 @@ pub fn delete_crate(ctx: &dyn Context, name: &str) -> Result<()> {
3135
// delete the whole rustdoc/source folder for this crate.
3236
// it will include existing archives.
3337
let remote_folder = format!("{}/{}/", prefix, name);
34-
ctx.storage()?.delete_prefix(&remote_folder)?;
38+
storage.delete_prefix(&remote_folder)?;
3539

3640
// remove existing local archive index files.
37-
let local_index_folder = ctx.config()?.local_archive_cache_path.join(&remote_folder);
41+
let local_index_folder = config.local_archive_cache_path.join(&remote_folder);
3842
if local_index_folder.exists() {
3943
fs::remove_dir_all(&local_index_folder).with_context(|| {
4044
format!(
@@ -244,7 +248,7 @@ mod tests {
244248
)?);
245249
}
246250

247-
delete_crate(env, "package-1")?;
251+
delete_crate(&mut db.conn(), &env.storage(), &env.config(), "package-1")?;
248252

249253
assert!(!crate_exists(&mut db.conn(), "package-1")?);
250254
assert!(crate_exists(&mut db.conn(), "package-2")?);

src/docbuilder/rustwide_builder.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use postgres::Client;
1919
use rustwide::cmd::{Command, CommandError, SandboxBuilder, SandboxImage};
2020
use rustwide::logging::{self, LogStorage};
2121
use rustwide::toolchain::ToolchainError;
22-
use rustwide::{Build, Crate, Toolchain, Workspace, WorkspaceBuilder};
22+
use rustwide::{AlternativeRegistry, Build, Crate, Toolchain, Workspace, WorkspaceBuilder};
2323
use serde_json::Value;
2424
use std::collections::{HashMap, HashSet};
2525
use std::path::Path;
@@ -318,7 +318,9 @@ impl RustwideBuilder {
318318
let krate = match kind {
319319
PackageKind::Local(path) => Crate::local(path),
320320
PackageKind::CratesIo => Crate::crates_io(name, version),
321-
PackageKind::Registry(registry) => Crate::registry(registry, name, version),
321+
PackageKind::Registry(registry) => {
322+
Crate::registry(AlternativeRegistry::new(registry), name, version)
323+
}
322324
};
323325
krate.fetch(&self.workspace).map_err(FailureError::compat)?;
324326

src/test/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ impl TestEnvironment {
188188
self.db().pool(),
189189
self.metrics(),
190190
self.config(),
191+
self.storage(),
191192
))
192193
})
193194
.clone()

0 commit comments

Comments
 (0)