@@ -2,15 +2,18 @@ use std::path::PathBuf;
2
2
use std:: process:: Command ;
3
3
4
4
// represents an archive we download from crates.io
5
+ #[ derive( Debug ) ]
5
6
struct KrateSource {
6
7
version : String ,
7
8
name : String ,
8
9
}
9
10
10
11
// represents the extracted sourcecode of a crate
12
+ #[ derive( Debug ) ]
11
13
struct Krate {
12
14
version : String ,
13
15
name : String ,
16
+ path : PathBuf ,
14
17
}
15
18
16
19
impl KrateSource {
@@ -20,13 +23,34 @@ impl KrateSource {
20
23
name : name. into ( ) ,
21
24
}
22
25
}
23
- fn download_and_extract ( self ) -> Krate {
26
+ fn download_and_extract ( & self ) -> Krate {
27
+ let extract_dir = PathBuf :: from ( "target/crater/crates" ) ;
28
+
24
29
// 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
+
25
43
// 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!" ) ;
26
49
27
50
Krate {
28
- version : self . version ,
29
- name : self . name ,
51
+ version : self . version . clone ( ) ,
52
+ name : self . name . clone ( ) ,
53
+ path : extracted_path,
30
54
}
31
55
}
32
56
}
@@ -35,8 +59,6 @@ impl Krate {
35
59
fn run_clippy_lints ( & self ) -> String {
36
60
todo ! ( ) ;
37
61
}
38
-
39
-
40
62
}
41
63
42
64
fn build_clippy ( ) {
@@ -65,5 +87,10 @@ pub(crate) fn run() {
65
87
"target/debug/clippy-driver binary not found!"
66
88
) ;
67
89
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 > > ( ) ;
69
96
}
0 commit comments