Skip to content

Commit a726381

Browse files
authored
Merge pull request #52 from rust-lang/fix-crater-errors
Address some of Crater's errors
2 parents 828d13c + 5d04264 commit a726381

File tree

10 files changed

+93
-65
lines changed

10 files changed

+93
-65
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
55

66
## Unreleased
77

8+
### Added
9+
10+
- New variant `PrepareError::MissingDependencies`, returned during the prepare
11+
step when a dependency does not exist.
12+
13+
### Changed
14+
15+
- Path dependencies are no longer removed from `Cargo.toml` during the prepare
16+
step.
17+
818
## [0.11.1] - 2021-01-25
919

1020
### Changed

src/prepare.rs

Lines changed: 18 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ impl<'a> Prepare<'a> {
9696
}
9797

9898
let mut yanked_deps = false;
99+
let mut missing_deps = false;
99100
let mut cmd = Command::new(self.workspace, self.toolchain.cargo()).args(&[
100101
"generate-lockfile",
101102
"--manifest-path",
@@ -111,13 +112,20 @@ impl<'a> Prepare<'a> {
111112
.process_lines(&mut |line, _| {
112113
if line.contains("failed to select a version for the requirement") {
113114
yanked_deps = true;
115+
} else if line.contains("failed to load source for dependency")
116+
|| line.contains("no matching package named")
117+
{
118+
missing_deps = true;
114119
}
115120
})
116121
.run();
117122
match res {
118123
Err(_) if yanked_deps => {
119124
return Err(PrepareError::YankedDependencies.into());
120125
}
126+
Err(_) if missing_deps => {
127+
return Err(PrepareError::MissingDependencies.into());
128+
}
121129
other => other?,
122130
}
123131
self.lockfile_captured = true;
@@ -126,6 +134,7 @@ impl<'a> Prepare<'a> {
126134

127135
fn fetch_deps(&mut self) -> Result<(), Error> {
128136
let mut outdated_lockfile = false;
137+
let mut missing_deps = false;
129138
let res = Command::new(self.workspace, self.toolchain.cargo())
130139
.args(&["fetch", "--locked", "--manifest-path", "Cargo.toml"])
131140
.cd(&self.source_dir)
@@ -134,21 +143,23 @@ impl<'a> Prepare<'a> {
134143
"Cargo.lock needs to be updated but --locked was passed to prevent this",
135144
) {
136145
outdated_lockfile = true;
146+
} else if line.contains("failed to load source for dependency") {
147+
missing_deps = true;
137148
}
138149
})
139150
.run();
140151
match res {
141-
Ok(_) => {}
152+
Ok(_) => Ok(()),
142153
Err(_) if outdated_lockfile && !self.lockfile_captured => {
143154
info!("the lockfile is outdated, regenerating it");
144155
// Force-update the lockfile and recursively call this function to fetch
145156
// dependencies again.
146157
self.capture_lockfile(true)?;
147-
return self.fetch_deps();
158+
self.fetch_deps()
148159
}
149-
err => return err.map_err(|e| e.into()),
160+
Err(_) if missing_deps => Err(PrepareError::MissingDependencies.into()),
161+
err => err.map_err(|e| e.into()),
150162
}
151-
Ok(())
152163
}
153164
}
154165

@@ -197,7 +208,6 @@ impl<'a> TomlTweaker<'a> {
197208
self.remove_missing_items("test");
198209
self.remove_parent_workspaces();
199210
self.remove_unwanted_cargo_features();
200-
self.remove_dependencies();
201211
self.apply_patches();
202212

203213
info!("finished tweaking {}", self.krate);
@@ -284,21 +294,6 @@ impl<'a> TomlTweaker<'a> {
284294
}
285295
}
286296

287-
fn remove_dependencies(&mut self) {
288-
let krate = self.krate.to_string();
289-
290-
Self::remove_dependencies_from_table(&mut self.table, &krate);
291-
292-
// Tweak target-specific dependencies
293-
if let Some(&mut Value::Table(ref mut targets)) = self.table.get_mut("target") {
294-
for (_, target) in targets.iter_mut() {
295-
if let Value::Table(ref mut target_table) = *target {
296-
Self::remove_dependencies_from_table(target_table, &krate);
297-
}
298-
}
299-
}
300-
}
301-
302297
fn apply_patches(&mut self) {
303298
if !self.patches.is_empty() {
304299
let mut patch_table = self.table.get_mut("patch");
@@ -335,24 +330,6 @@ impl<'a> TomlTweaker<'a> {
335330
}
336331
}
337332

338-
// This is not a method to avoid borrow checker problems
339-
fn remove_dependencies_from_table(table: &mut Table, krate: &str) {
340-
// Convert path dependencies to registry dependencies
341-
for section in &["dependencies", "dev-dependencies", "build-dependencies"] {
342-
if let Some(&mut Value::Table(ref mut deps)) = table.get_mut(*section) {
343-
// Iterate through the "name = { ... }", removing any "path"
344-
// keys in the dependency definition
345-
for (dep_name, v) in deps.iter_mut() {
346-
if let Value::Table(ref mut dep_props) = *v {
347-
if dep_props.remove("path").is_some() {
348-
info!("removed path dependency {} from {}", dep_name, krate);
349-
}
350-
}
351-
}
352-
}
353-
}
354-
}
355-
356333
pub fn save(self, output_file: &Path) -> Result<(), Error> {
357334
let crate_name = self.krate.to_string();
358335
::std::fs::write(output_file, Value::Table(self.table).to_string().as_bytes())?;
@@ -383,6 +360,9 @@ pub enum PrepareError {
383360
/// Some of this crate's dependencies were yanked, preventing Crater from fetching them.
384361
#[fail(display = "the crate depends on yanked dependencies")]
385362
YankedDependencies,
363+
/// Some of the dependencies do not exist anymore.
364+
#[fail(display = "the crate depends on missing dependencies")]
365+
MissingDependencies,
386366
}
387367

388368
#[cfg(test)]
@@ -400,15 +380,6 @@ mod tests {
400380
[package]
401381
name = "foo"
402382
version = "1.0"
403-
404-
[dependencies]
405-
bar = "1.0"
406-
407-
[dev-dependencies]
408-
baz = "1.0"
409-
410-
[target."cfg(unix)".dependencies]
411-
quux = "1.0"
412383
};
413384

414385
let result = toml.clone();
@@ -434,15 +405,6 @@ mod tests {
434405
publish-lockfile = true
435406
default-run = "foo"
436407

437-
[dependencies]
438-
bar = { version = "1.0", path = "../bar" }
439-
440-
[dev-dependencies]
441-
baz = { version = "1.0", path = "../baz" }
442-
443-
[target."cfg(unix)".dependencies]
444-
quux = { version = "1.0", path = "../quux" }
445-
446408
[workspace]
447409
members = []
448410
};
@@ -454,15 +416,6 @@ mod tests {
454416
name = "foo"
455417
version = "1.0"
456418

457-
[dependencies]
458-
bar = { version = "1.0" }
459-
460-
[dev-dependencies]
461-
baz = { version = "1.0" }
462-
463-
[target."cfg(unix)".dependencies]
464-
quux = { version = "1.0" }
465-
466419
[workspace]
467420
members = []
468421
};

tests/buildtest/crates/missing-deps-git-locked/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "missing-deps-git-locked"
3+
version = "0.1.0"
4+
authors = ["Pietro Albini <pietro@pietroalbini.org>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
10+
not-a-git-repo = { git = "https://www.example.com/definitely-not-a-git-repo.git" }
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
println!("Hello, world!");
3+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "missing-deps"
3+
version = "0.1.0"
4+
authors = ["Pietro Albini <pietro@pietroalbini.org>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
10+
not-a-git-repo = { git = "https://www.example.com/definitely-not-a-git-repo.git" }
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
println!("Hello, world!");
3+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[package]
2+
name = "missing-deps-registry"
3+
version = "0.1.0"
4+
authors = ["Pietro Albini <pietro@pietroalbini.org>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
10+
# The `macro` crate name is reserved on crates.io.
11+
macro = "*"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
println!("Hello, world!");
3+
}

tests/buildtest/mod.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,21 @@ test_prepare_error!(
131131
);
132132

133133
test_prepare_error!(test_yanked_deps, "yanked-deps", YankedDependencies);
134+
135+
test_prepare_error!(
136+
test_missing_deps_git,
137+
"missing-deps-git",
138+
MissingDependencies
139+
);
140+
141+
test_prepare_error!(
142+
test_missing_deps_git_locked,
143+
"missing-deps-git-locked",
144+
MissingDependencies
145+
);
146+
147+
test_prepare_error!(
148+
test_missing_deps_registry,
149+
"missing-deps-registry",
150+
MissingDependencies
151+
);

0 commit comments

Comments
 (0)