aboutsummaryrefslogtreecommitdiff
path: root/xtask
diff options
context:
space:
mode:
Diffstat (limited to 'xtask')
-rw-r--r--xtask/src/lib.rs45
-rw-r--r--xtask/src/main.rs5
-rw-r--r--xtask/src/pre_cache.rs80
3 files changed, 88 insertions, 42 deletions
diff --git a/xtask/src/lib.rs b/xtask/src/lib.rs
index f3ad81ba7..e790d995f 100644
--- a/xtask/src/lib.rs
+++ b/xtask/src/lib.rs
@@ -3,14 +3,15 @@
3//! See https://github.com/matklad/cargo-xtask/ 3//! See https://github.com/matklad/cargo-xtask/
4 4
5pub mod not_bash; 5pub mod not_bash;
6pub mod codegen;
7mod ast_src;
8
6pub mod install; 9pub mod install;
7pub mod release; 10pub mod release;
8pub mod dist; 11pub mod dist;
9pub mod pre_commit; 12pub mod pre_commit;
10pub mod metrics; 13pub mod metrics;
11 14pub mod pre_cache;
12pub mod codegen;
13mod ast_src;
14 15
15use std::{ 16use std::{
16 env, 17 env,
@@ -21,7 +22,7 @@ use walkdir::{DirEntry, WalkDir};
21 22
22use crate::{ 23use crate::{
23 codegen::Mode, 24 codegen::Mode,
24 not_bash::{fs2, pushd, pushenv, rm_rf}, 25 not_bash::{pushd, pushenv},
25}; 26};
26 27
27pub use anyhow::{bail, Context as _, Result}; 28pub use anyhow::{bail, Context as _, Result};
@@ -108,42 +109,6 @@ pub fn run_fuzzer() -> Result<()> {
108 Ok(()) 109 Ok(())
109} 110}
110 111
111/// Cleans the `./target` dir after the build such that only
112/// dependencies are cached on CI.
113pub fn run_pre_cache() -> Result<()> {
114 let slow_tests_cookie = Path::new("./target/.slow_tests_cookie");
115 if !slow_tests_cookie.exists() {
116 panic!("slow tests were skipped on CI!")
117 }
118 rm_rf(slow_tests_cookie)?;
119
120 for entry in Path::new("./target/debug").read_dir()? {
121 let entry = entry?;
122 if entry.file_type().map(|it| it.is_file()).ok() == Some(true) {
123 // Can't delete yourself on windows :-(
124 if !entry.path().ends_with("xtask.exe") {
125 rm_rf(&entry.path())?
126 }
127 }
128 }
129
130 fs2::remove_file("./target/.rustc_info.json")?;
131 let to_delete = ["hir", "heavy_test", "xtask", "ide", "rust-analyzer"];
132 for &dir in ["./target/debug/deps", "target/debug/.fingerprint"].iter() {
133 for entry in Path::new(dir).read_dir()? {
134 let entry = entry?;
135 if to_delete.iter().any(|&it| entry.path().display().to_string().contains(it)) {
136 // Can't delete yourself on windows :-(
137 if !entry.path().ends_with("xtask.exe") {
138 rm_rf(&entry.path())?
139 }
140 }
141 }
142 }
143
144 Ok(())
145}
146
147fn is_release_tag(tag: &str) -> bool { 112fn is_release_tag(tag: &str) -> bool {
148 tag.len() == "2020-02-24".len() && tag.starts_with(|c: char| c.is_ascii_digit()) 113 tag.len() == "2020-02-24".len() && tag.starts_with(|c: char| c.is_ascii_digit())
149} 114}
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index b69b884e5..fb38fdc92 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -17,9 +17,10 @@ use xtask::{
17 install::{ClientOpt, InstallCmd, Malloc, ServerOpt}, 17 install::{ClientOpt, InstallCmd, Malloc, ServerOpt},
18 metrics::MetricsCmd, 18 metrics::MetricsCmd,
19 not_bash::pushd, 19 not_bash::pushd,
20 pre_cache::PreCacheCmd,
20 pre_commit, project_root, 21 pre_commit, project_root,
21 release::{PromoteCmd, ReleaseCmd}, 22 release::{PromoteCmd, ReleaseCmd},
22 run_clippy, run_fuzzer, run_pre_cache, run_rustfmt, Result, 23 run_clippy, run_fuzzer, run_rustfmt, Result,
23}; 24};
24 25
25fn main() -> Result<()> { 26fn main() -> Result<()> {
@@ -100,7 +101,7 @@ FLAGS:
100 } 101 }
101 "pre-cache" => { 102 "pre-cache" => {
102 args.finish()?; 103 args.finish()?;
103 run_pre_cache() 104 PreCacheCmd.run()
104 } 105 }
105 "release" => { 106 "release" => {
106 let dry_run = args.contains("--dry-run"); 107 let dry_run = args.contains("--dry-run");
diff --git a/xtask/src/pre_cache.rs b/xtask/src/pre_cache.rs
new file mode 100644
index 000000000..47ba6ba24
--- /dev/null
+++ b/xtask/src/pre_cache.rs
@@ -0,0 +1,80 @@
1use std::{
2 fs::FileType,
3 path::{Path, PathBuf},
4};
5
6use anyhow::Result;
7
8use crate::not_bash::{fs2, rm_rf};
9
10pub struct PreCacheCmd;
11
12impl PreCacheCmd {
13 /// Cleans the `./target` dir after the build such that only
14 /// dependencies are cached on CI.
15 pub fn run(self) -> Result<()> {
16 let slow_tests_cookie = Path::new("./target/.slow_tests_cookie");
17 if !slow_tests_cookie.exists() {
18 panic!("slow tests were skipped on CI!")
19 }
20 rm_rf(slow_tests_cookie)?;
21
22 for path in read_dir("./target/debug", FileType::is_file)? {
23 // Can't delete yourself on windows :-(
24 if !path.ends_with("xtask.exe") {
25 rm_rf(&path)?
26 }
27 }
28
29 fs2::remove_file("./target/.rustc_info.json")?;
30
31 let to_delete = read_dir("./crates", FileType::is_dir)?
32 .into_iter()
33 .map(|path| path.file_name().unwrap().to_string_lossy().replace('-', "_"))
34 .collect::<Vec<_>>();
35
36 for &dir in ["./target/debug/deps", "target/debug/.fingerprint"].iter() {
37 for path in read_dir(dir, |_file_type| true)? {
38 if path.ends_with("xtask.exe") {
39 continue;
40 }
41 let file_name = path.file_name().unwrap().to_string_lossy();
42 let (stem, _) = match rsplit_once(&file_name, '-') {
43 Some(it) => it,
44 None => {
45 rm_rf(path)?;
46 continue;
47 }
48 };
49 let stem = stem.replace('-', "_");
50 if to_delete.contains(&stem) {
51 rm_rf(path)?;
52 }
53 }
54 }
55
56 Ok(())
57 }
58}
59fn read_dir(path: impl AsRef<Path>, cond: impl Fn(&FileType) -> bool) -> Result<Vec<PathBuf>> {
60 read_dir_impl(path.as_ref(), &cond)
61}
62
63fn read_dir_impl(path: &Path, cond: &dyn Fn(&FileType) -> bool) -> Result<Vec<PathBuf>> {
64 let mut res = Vec::new();
65 for entry in path.read_dir()? {
66 let entry = entry?;
67 let file_type = entry.file_type()?;
68 if cond(&file_type) {
69 res.push(entry.path())
70 }
71 }
72 Ok(res)
73}
74
75fn rsplit_once(haystack: &str, delim: char) -> Option<(&str, &str)> {
76 let mut split = haystack.rsplitn(2, delim);
77 let suffix = split.next()?;
78 let prefix = split.next()?;
79 Some((prefix, suffix))
80}