Skip to content

Commit 02adbfb

Browse files
committed
Auto merge of #378 - Zeegomo:master, r=pietroalbini
Strip missing examples from crates fix #309 Check existence for every test and example specified in Cargo.toml
2 parents 9dbf400 + acef0c4 commit 02adbfb

File tree

7 files changed

+93
-11
lines changed

7 files changed

+93
-11
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[package]
2+
name = "missing-examples"
3+
version = "0.1.0"
4+
authors = ["Giacomo Pasini"]
5+
6+
[dependencies]
7+
8+
[[example]]
9+
name = "foo"
10+
11+
[[example]]
12+
name = "bar"
13+
path = "examples/ex.rs"
14+
15+
[[example]]
16+
name = "missing"
17+
18+
[[test]]
19+
name = "test1"
20+
21+
[[test]]
22+
name = "test2"
23+
path = "test/t.rs"
24+
25+
[[test]]
26+
name = "missing"
27+

local-crates/missing-examples/examples/foo.rs

Whitespace-only changes.
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+
}

local-crates/missing-examples/tests/test1.rs

Whitespace-only changes.

src/runner/prepare.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,11 @@ impl<'a, DB: WriteResults + 'a> PrepareCrate<'a, DB> {
112112
}
113113

114114
fn frob_toml(&self) -> Fallible<()> {
115-
if let Crate::Registry(_) = self.krate {
116-
for (_, source_dir) in &self.source_dirs {
117-
let path = source_dir.join("Cargo.toml");
118-
let mut frobber = TomlFrobber::new(&self.krate, &path)?;
119-
frobber.frob();
120-
frobber.save(&path)?;
121-
}
115+
for (_, source_dir) in &self.source_dirs {
116+
let path = source_dir.join("Cargo.toml");
117+
let mut frobber = TomlFrobber::new(&self.krate, &path)?;
118+
frobber.frob();
119+
frobber.save(&path)?;
122120
}
123121
Ok(())
124122
}

src/runner/toml_frobber.rs

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,77 @@ use crate::crates::Crate;
22
use crate::prelude::*;
33
use std::path::Path;
44
use toml::value::Table;
5-
use toml::{self, Value};
5+
use toml::{self, value::Array, Value};
66

77
pub(super) struct TomlFrobber<'a> {
88
krate: &'a Crate,
99
table: Table,
10+
dir: Option<&'a Path>,
1011
}
1112

1213
impl<'a> TomlFrobber<'a> {
13-
pub(super) fn new(krate: &'a Crate, cargo_toml: &Path) -> Fallible<Self> {
14+
pub(super) fn new(krate: &'a Crate, cargo_toml: &'a Path) -> Fallible<Self> {
1415
let toml_content = ::std::fs::read_to_string(cargo_toml)
1516
.with_context(|_| format!("missing Cargo.toml from {}", krate))?;
1617
let table: Table = toml::from_str(&toml_content)
1718
.with_context(|_| format!("unable to parse {}", cargo_toml.display(),))?;
1819

19-
Ok(TomlFrobber { krate, table })
20+
let dir = cargo_toml.parent();
21+
22+
Ok(TomlFrobber { krate, table, dir })
2023
}
2124

2225
#[cfg(test)]
2326
fn new_with_table(krate: &'a Crate, table: Table) -> Self {
24-
TomlFrobber { krate, table }
27+
TomlFrobber {
28+
krate,
29+
table,
30+
dir: None,
31+
}
2532
}
2633

2734
pub(super) fn frob(&mut self) {
2835
info!("started frobbing {}", self.krate);
2936

37+
self.remove_missing_items("example");
38+
self.remove_missing_items("test");
3039
self.remove_workspaces();
3140
self.remove_unwanted_cargo_features();
3241
self.remove_dependencies();
3342

3443
info!("finished frobbing {}", self.krate);
3544
}
3645

46+
#[allow(clippy::ptr_arg)]
47+
fn test_existance(dir: &Path, value: &Array, folder: &str) -> Array {
48+
value
49+
.iter()
50+
.filter_map(|t| t.as_table())
51+
.filter(|t| t.get("name").is_some())
52+
.map(|table| {
53+
let name = table.get("name").unwrap().to_string();
54+
let path = table.get("path").map_or_else(
55+
|| dir.join(folder).join(name + ".rs"),
56+
|path| dir.join(path.as_str().unwrap()),
57+
);
58+
(table, path)
59+
})
60+
.filter(|(_table, path)| path.exists())
61+
.filter_map(|(table, _path)| Value::try_from(table).ok())
62+
.collect()
63+
}
64+
65+
fn remove_missing_items(&mut self, category: &str) {
66+
let folder = &(String::from(category) + "s");
67+
if let Some(dir) = self.dir {
68+
if let Some(&mut Value::Array(ref mut array)) = self.table.get_mut(category) {
69+
let dim = array.len();
70+
*(array) = Self::test_existance(dir, array, folder);
71+
info!("removed {} missing {}", dim - array.len(), folder);
72+
}
73+
}
74+
}
75+
3776
fn remove_workspaces(&mut self) {
3877
let krate = self.krate.to_string();
3978

tests/minicrater/full/results.expected.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,21 @@
9090
],
9191
"url": "https://github.com/rust-lang-nursery/crater/tree/master/local-crates/memory-hungry"
9292
},
93+
{
94+
"name": "missing-examples (local)",
95+
"res": "test-pass",
96+
"runs": [
97+
{
98+
"log": "stable/local/missing-examples",
99+
"res": "test-pass"
100+
},
101+
{
102+
"log": "beta/local/missing-examples",
103+
"res": "test-pass"
104+
}
105+
],
106+
"url": "https://github.com/rust-lang-nursery/crater/tree/master/local-crates/missing-examples"
107+
},
93108
{
94109
"name": "network-access (local)",
95110
"res": "fixed",

0 commit comments

Comments
 (0)