Skip to content

Commit 5353591

Browse files
committed
cargo dev crater: work on downloading and extracting crate sources
1 parent bec916d commit 5353591

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

clippy_dev/Cargo.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
[package]
2-
name = "clippy_dev"
3-
version = "0.0.1"
42
authors = ["Philipp Hansch <dev@phansch.net>"]
53
edition = "2018"
4+
name = "clippy_dev"
5+
version = "0.0.1"
66

77
[dependencies]
88
bytecount = "0.6"
99
clap = "2.33"
10+
flate2 = "1.0.19"
1011
itertools = "0.9"
1112
opener = "0.4"
1213
regex = "1"
1314
shell-escape = "0.1"
15+
tar = "0.4.30"
16+
ureq = "2.0.0-rc3"
1417
walkdir = "2"
1518

1619
[features]

clippy_dev/src/crater.rs

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@ use std::path::PathBuf;
22
use std::process::Command;
33

44
// represents an archive we download from crates.io
5+
#[derive(Debug)]
56
struct KrateSource {
67
version: String,
78
name: String,
89
}
910

1011
// represents the extracted sourcecode of a crate
12+
#[derive(Debug)]
1113
struct Krate {
1214
version: String,
1315
name: String,
16+
path: PathBuf,
1417
}
1518

1619
impl KrateSource {
@@ -20,13 +23,34 @@ impl KrateSource {
2023
name: name.into(),
2124
}
2225
}
23-
fn download_and_extract(self) -> Krate {
26+
fn download_and_extract(&self) -> Krate {
27+
let extract_dir = PathBuf::from("target/crater/crates");
28+
2429
// download
30+
let krate_download_dir = PathBuf::from("target/crater/downloads");
31+
32+
let url = format!(
33+
"https://crates.io/api/v1/crates/{}/{}/download",
34+
self.name, self.version
35+
);
36+
print!("Downloading {}, {}", self.name, self.version);
37+
38+
let krate_name = format!("{}-{}.crate", &self.name, &self.version);
39+
let mut krate_dest = std::fs::File::create(krate_download_dir.join(krate_name)).unwrap();
40+
let mut krate_req = ureq::get(&url).call().unwrap().into_reader();
41+
std::io::copy(&mut krate_req, &mut krate_dest).unwrap();
42+
2543
// extract
44+
let krate = krate_dest;
45+
let tar = flate2::read::GzDecoder::new(krate);
46+
let mut archiv = tar::Archive::new(tar);
47+
let extracted_path = extract_dir.join(format!("{}-{}/", self.name, self.version));
48+
archiv.unpack(&extracted_path).expect("Failed to extract!");
2649

2750
Krate {
28-
version: self.version,
29-
name: self.name,
51+
version: self.version.clone(),
52+
name: self.name.clone(),
53+
path: extracted_path,
3054
}
3155
}
3256
}
@@ -35,8 +59,6 @@ impl Krate {
3559
fn run_clippy_lints(&self) -> String {
3660
todo!();
3761
}
38-
39-
4062
}
4163

4264
fn build_clippy() {
@@ -65,5 +87,10 @@ pub(crate) fn run() {
6587
"target/debug/clippy-driver binary not found!"
6688
);
6789

68-
let clippy_lint_results: Vec<String> = krates.into_iter().map(|krate| krate.download_and_extract()).map(|krate| krate.run_clippy_lints()).collect::<Vec<String>>();
90+
// download and extract the crates, then run clippy on them and collect clippys warnings
91+
let clippy_lint_results: Vec<String> = krates
92+
.into_iter()
93+
.map(|krate| krate.download_and_extract())
94+
.map(|krate| krate.run_clippy_lints())
95+
.collect::<Vec<String>>();
6996
}

0 commit comments

Comments
 (0)