]>
Commit | Line | Data |
---|---|---|
f035d41b XL |
1 | mod progress; |
2 | ||
3 | use self::progress::Progress; | |
60c5eb7d XL |
4 | use anyhow::Result; |
5 | use flate2::read::GzDecoder; | |
6 | use std::fs; | |
7 | use std::path::Path; | |
8 | use tar::Archive; | |
9 | use walkdir::DirEntry; | |
e74abb32 | 10 | |
3dfed10e | 11 | const REVISION: &str = "81e754c359c471f91263813c46c67955071716a7"; |
f035d41b XL |
12 | |
13 | #[rustfmt::skip] | |
14 | static EXCLUDE: &[&str] = &[ | |
15 | // Deprecated anonymous parameter syntax in traits | |
16 | "test/ui/issues/issue-13105.rs", | |
17 | "test/ui/issues/issue-13775.rs", | |
18 | "test/ui/issues/issue-34074.rs", | |
19 | "test/ui/proc-macro/trait-fn-args-2015.rs", | |
20 | ||
21 | // not actually test cases | |
22 | "test/rustdoc-ui/test-compile-fail2.rs", | |
23 | "test/rustdoc-ui/test-compile-fail3.rs", | |
24 | "test/ui/include-single-expr-helper.rs", | |
25 | "test/ui/include-single-expr-helper-1.rs", | |
26 | "test/ui/issues/auxiliary/issue-21146-inc.rs", | |
27 | "test/ui/json-bom-plus-crlf-multifile-aux.rs", | |
3dfed10e | 28 | "test/ui/lint/expansion-time-include.rs", |
f035d41b XL |
29 | "test/ui/macros/auxiliary/macro-comma-support.rs", |
30 | "test/ui/macros/auxiliary/macro-include-items-expr.rs", | |
31 | ]; | |
e74abb32 XL |
32 | |
33 | pub fn base_dir_filter(entry: &DirEntry) -> bool { | |
34 | let path = entry.path(); | |
35 | if path.is_dir() { | |
36 | return true; // otherwise walkdir does not visit the files | |
37 | } | |
38 | if path.extension().map(|e| e != "rs").unwrap_or(true) { | |
39 | return false; | |
40 | } | |
f035d41b XL |
41 | |
42 | let mut path_string = path.to_string_lossy(); | |
43 | if cfg!(windows) { | |
44 | path_string = path_string.replace('\\', "/").into(); | |
45 | } | |
3dfed10e XL |
46 | let path = if let Some(path) = path_string.strip_prefix("tests/rust/src/") { |
47 | path | |
48 | } else if let Some(path) = path_string.strip_prefix("tests/rust/library/") { | |
49 | path | |
50 | } else { | |
51 | panic!("unexpected path in Rust dist: {}", path_string); | |
52 | }; | |
f035d41b | 53 | |
e74abb32 | 54 | // TODO assert that parsing fails on the parse-fail cases |
f035d41b XL |
55 | if path.starts_with("test/parse-fail") |
56 | || path.starts_with("test/compile-fail") | |
57 | || path.starts_with("test/rustfix") | |
e74abb32 XL |
58 | { |
59 | return false; | |
60 | } | |
61 | ||
f035d41b XL |
62 | if path.starts_with("test/ui") { |
63 | let stderr_path = entry.path().with_extension("stderr"); | |
e74abb32 XL |
64 | if stderr_path.exists() { |
65 | // Expected to fail in some way | |
66 | return false; | |
67 | } | |
68 | } | |
69 | ||
f035d41b XL |
70 | !EXCLUDE.contains(&path) |
71 | } | |
72 | ||
73 | #[allow(dead_code)] | |
74 | pub fn edition(path: &Path) -> &'static str { | |
75 | if path.ends_with("dyn-2015-no-warnings-without-lints.rs") { | |
76 | "2015" | |
77 | } else { | |
78 | "2018" | |
e74abb32 XL |
79 | } |
80 | } | |
81 | ||
82 | pub fn clone_rust() { | |
60c5eb7d XL |
83 | let needs_clone = match fs::read_to_string("tests/rust/COMMIT") { |
84 | Err(_) => true, | |
85 | Ok(contents) => contents.trim() != REVISION, | |
86 | }; | |
87 | if needs_clone { | |
88 | download_and_unpack().unwrap(); | |
89 | } | |
f035d41b XL |
90 | let mut missing = String::new(); |
91 | let test_src = Path::new("tests/rust/src"); | |
92 | for exclude in EXCLUDE { | |
93 | if !test_src.join(exclude).exists() { | |
94 | missing += "\ntests/rust/src/"; | |
95 | missing += exclude; | |
96 | } | |
97 | } | |
98 | if !missing.is_empty() { | |
99 | panic!("excluded test file does not exist:{}\n", missing); | |
100 | } | |
60c5eb7d XL |
101 | } |
102 | ||
103 | fn download_and_unpack() -> Result<()> { | |
104 | let url = format!( | |
105 | "https://github.com/rust-lang/rust/archive/{}.tar.gz", | |
106 | REVISION | |
107 | ); | |
108 | let response = reqwest::blocking::get(&url)?.error_for_status()?; | |
f035d41b XL |
109 | let progress = Progress::new(response); |
110 | let decoder = GzDecoder::new(progress); | |
60c5eb7d XL |
111 | let mut archive = Archive::new(decoder); |
112 | let prefix = format!("rust-{}", REVISION); | |
113 | ||
114 | let tests_rust = Path::new("tests/rust"); | |
115 | if tests_rust.exists() { | |
116 | fs::remove_dir_all(tests_rust)?; | |
117 | } | |
118 | ||
119 | for entry in archive.entries()? { | |
120 | let mut entry = entry?; | |
121 | let path = entry.path()?; | |
122 | if path == Path::new("pax_global_header") { | |
123 | continue; | |
124 | } | |
125 | let relative = path.strip_prefix(&prefix)?; | |
126 | let out = tests_rust.join(relative); | |
127 | entry.unpack(&out)?; | |
128 | } | |
129 | ||
130 | fs::write("tests/rust/COMMIT", REVISION)?; | |
131 | Ok(()) | |
e74abb32 | 132 | } |