]> git.lizzy.rs Git - rust.git/blob - src/tools/cargotest/main.rs
Rollup merge of #62600 - emmericp:libtest-add-show-output, r=gnzlbg
[rust.git] / src / tools / cargotest / main.rs
1 use std::env;
2 use std::process::Command;
3 use std::path::{Path, PathBuf};
4 use std::fs;
5
6 struct Test {
7     repo: &'static str,
8     name: &'static str,
9     sha: &'static str,
10     lock: Option<&'static str>,
11     packages: &'static [&'static str],
12 }
13
14 const TEST_REPOS: &'static [Test] = &[
15     Test {
16         name: "iron",
17         repo: "https://github.com/iron/iron",
18         sha: "21c7dae29c3c214c08533c2a55ac649b418f2fe3",
19         lock: Some(include_str!("lockfiles/iron-Cargo.lock")),
20         packages: &[],
21     },
22     Test {
23         name: "ripgrep",
24         repo: "https://github.com/BurntSushi/ripgrep",
25         sha: "ad9befbc1d3b5c695e7f6b6734ee1b8e683edd41",
26         lock: None,
27         packages: &[],
28     },
29     Test {
30         name: "tokei",
31         repo: "https://github.com/XAMPPRocky/tokei",
32         sha: "5e11c4852fe4aa086b0e4fe5885822fbe57ba928",
33         lock: None,
34         packages: &[],
35     },
36     Test {
37         name: "treeify",
38         repo: "https://github.com/dzamlo/treeify",
39         sha: "999001b223152441198f117a68fb81f57bc086dd",
40         lock: None,
41         packages: &[],
42     },
43     Test {
44         name: "xsv",
45         repo: "https://github.com/BurntSushi/xsv",
46         sha: "66956b6bfd62d6ac767a6b6499c982eae20a2c9f",
47         lock: None,
48         packages: &[],
49     },
50     Test {
51         name: "servo",
52         repo: "https://github.com/servo/servo",
53         sha: "caac107ae8145ef2fd20365e2b8fadaf09c2eb3b",
54         lock: None,
55         // Only test Stylo a.k.a. Quantum CSS, the parts of Servo going into Firefox.
56         // This takes much less time to build than all of Servo and supports stable Rust.
57         packages: &["selectors"],
58     },
59     Test {
60         name: "webrender",
61         repo: "https://github.com/servo/webrender",
62         sha: "cdadd068f4c7218bd983d856981d561e605270ab",
63         lock: None,
64         packages: &[],
65     },
66 ];
67
68 fn main() {
69     let args = env::args().collect::<Vec<_>>();
70     let ref cargo = args[1];
71     let out_dir = Path::new(&args[2]);
72     let ref cargo = Path::new(cargo);
73
74     for test in TEST_REPOS.iter().rev() {
75         test_repo(cargo, out_dir, test);
76     }
77 }
78
79 fn test_repo(cargo: &Path, out_dir: &Path, test: &Test) {
80     println!("testing {}", test.repo);
81     let dir = clone_repo(test, out_dir);
82     if let Some(lockfile) = test.lock {
83         fs::write(&dir.join("Cargo.lock"), lockfile).unwrap();
84     }
85     if !run_cargo_test(cargo, &dir, test.packages) {
86         panic!("tests failed for {}", test.repo);
87     }
88 }
89
90 fn clone_repo(test: &Test, out_dir: &Path) -> PathBuf {
91     let out_dir = out_dir.join(test.name);
92
93     if !out_dir.join(".git").is_dir() {
94         let status = Command::new("git")
95                          .arg("init")
96                          .arg(&out_dir)
97                          .status()
98                          .expect("");
99         assert!(status.success());
100     }
101
102     // Try progressively deeper fetch depths to find the commit
103     let mut found = false;
104     for depth in &[0, 1, 10, 100, 1000, 100000] {
105         if *depth > 0 {
106             let status = Command::new("git")
107                              .arg("fetch")
108                              .arg(test.repo)
109                              .arg("master")
110                              .arg(&format!("--depth={}", depth))
111                              .current_dir(&out_dir)
112                              .status()
113                              .expect("");
114             assert!(status.success());
115         }
116
117         let status = Command::new("git")
118                          .arg("reset")
119                          .arg(test.sha)
120                          .arg("--hard")
121                          .current_dir(&out_dir)
122                          .status()
123                          .expect("");
124
125         if status.success() {
126             found = true;
127             break;
128         }
129     }
130
131     if !found {
132         panic!("unable to find commit {}", test.sha)
133     }
134     let status = Command::new("git")
135                      .arg("clean")
136                      .arg("-fdx")
137                      .current_dir(&out_dir)
138                      .status()
139                      .unwrap();
140     assert!(status.success());
141
142     out_dir
143 }
144
145 fn run_cargo_test(cargo_path: &Path, crate_path: &Path, packages: &[&str]) -> bool {
146     let mut command = Command::new(cargo_path);
147     command.arg("test");
148     for name in packages {
149         command.arg("-p").arg(name);
150     }
151     let status = command
152         // Disable rust-lang/cargo's cross-compile tests
153         .env("CFG_DISABLE_CROSS_TESTS", "1")
154         // Relax #![deny(warnings)] in some crates
155         .env("RUSTFLAGS", "--cap-lints warn")
156         .current_dir(crate_path)
157         .status()
158         .expect("");
159
160     status.success()
161 }