Merge #5790
5790: Revive cache cleaning
r=matklad a=matklad
bors r+
🤖
Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
620d67322a
6 changed files with 98 additions and 42 deletions
|
@ -1,3 +1,13 @@
|
||||||
|
//! The most high-level integrated tests for rust-analyzer.
|
||||||
|
//!
|
||||||
|
//! This tests run a full LSP event loop, spawn cargo and process stdlib from
|
||||||
|
//! sysroot. For this reason, the tests here are very slow, and should be
|
||||||
|
//! avoided unless absolutely necessary.
|
||||||
|
//!
|
||||||
|
//! In particular, it's fine *not* to test that client & server agree on
|
||||||
|
//! specific JSON shapes here -- there's little value in such tests, as we can't
|
||||||
|
//! be sure without a real client anyway.
|
||||||
|
|
||||||
mod testdir;
|
mod testdir;
|
||||||
mod support;
|
mod support;
|
||||||
|
|
|
@ -3,14 +3,15 @@
|
||||||
//! See https://github.com/matklad/cargo-xtask/
|
//! See https://github.com/matklad/cargo-xtask/
|
||||||
|
|
||||||
pub mod not_bash;
|
pub mod not_bash;
|
||||||
|
pub mod codegen;
|
||||||
|
mod ast_src;
|
||||||
|
|
||||||
pub mod install;
|
pub mod install;
|
||||||
pub mod release;
|
pub mod release;
|
||||||
pub mod dist;
|
pub mod dist;
|
||||||
pub mod pre_commit;
|
pub mod pre_commit;
|
||||||
pub mod metrics;
|
pub mod metrics;
|
||||||
|
pub mod pre_cache;
|
||||||
pub mod codegen;
|
|
||||||
mod ast_src;
|
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
env,
|
env,
|
||||||
|
@ -21,7 +22,7 @@ use walkdir::{DirEntry, WalkDir};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
codegen::Mode,
|
codegen::Mode,
|
||||||
not_bash::{fs2, pushd, pushenv, rm_rf},
|
not_bash::{pushd, pushenv},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use anyhow::{bail, Context as _, Result};
|
pub use anyhow::{bail, Context as _, Result};
|
||||||
|
@ -108,42 +109,6 @@ pub fn run_fuzzer() -> Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Cleans the `./target` dir after the build such that only
|
|
||||||
/// dependencies are cached on CI.
|
|
||||||
pub fn run_pre_cache() -> Result<()> {
|
|
||||||
let slow_tests_cookie = Path::new("./target/.slow_tests_cookie");
|
|
||||||
if !slow_tests_cookie.exists() {
|
|
||||||
panic!("slow tests were skipped on CI!")
|
|
||||||
}
|
|
||||||
rm_rf(slow_tests_cookie)?;
|
|
||||||
|
|
||||||
for entry in Path::new("./target/debug").read_dir()? {
|
|
||||||
let entry = entry?;
|
|
||||||
if entry.file_type().map(|it| it.is_file()).ok() == Some(true) {
|
|
||||||
// Can't delete yourself on windows :-(
|
|
||||||
if !entry.path().ends_with("xtask.exe") {
|
|
||||||
rm_rf(&entry.path())?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fs2::remove_file("./target/.rustc_info.json")?;
|
|
||||||
let to_delete = ["hir", "heavy_test", "xtask", "ide", "rust-analyzer"];
|
|
||||||
for &dir in ["./target/debug/deps", "target/debug/.fingerprint"].iter() {
|
|
||||||
for entry in Path::new(dir).read_dir()? {
|
|
||||||
let entry = entry?;
|
|
||||||
if to_delete.iter().any(|&it| entry.path().display().to_string().contains(it)) {
|
|
||||||
// Can't delete yourself on windows :-(
|
|
||||||
if !entry.path().ends_with("xtask.exe") {
|
|
||||||
rm_rf(&entry.path())?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn is_release_tag(tag: &str) -> bool {
|
fn is_release_tag(tag: &str) -> bool {
|
||||||
tag.len() == "2020-02-24".len() && tag.starts_with(|c: char| c.is_ascii_digit())
|
tag.len() == "2020-02-24".len() && tag.starts_with(|c: char| c.is_ascii_digit())
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,10 @@ use xtask::{
|
||||||
install::{ClientOpt, InstallCmd, Malloc, ServerOpt},
|
install::{ClientOpt, InstallCmd, Malloc, ServerOpt},
|
||||||
metrics::MetricsCmd,
|
metrics::MetricsCmd,
|
||||||
not_bash::pushd,
|
not_bash::pushd,
|
||||||
|
pre_cache::PreCacheCmd,
|
||||||
pre_commit, project_root,
|
pre_commit, project_root,
|
||||||
release::{PromoteCmd, ReleaseCmd},
|
release::{PromoteCmd, ReleaseCmd},
|
||||||
run_clippy, run_fuzzer, run_pre_cache, run_rustfmt, Result,
|
run_clippy, run_fuzzer, run_rustfmt, Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
|
@ -100,7 +101,7 @@ FLAGS:
|
||||||
}
|
}
|
||||||
"pre-cache" => {
|
"pre-cache" => {
|
||||||
args.finish()?;
|
args.finish()?;
|
||||||
run_pre_cache()
|
PreCacheCmd.run()
|
||||||
}
|
}
|
||||||
"release" => {
|
"release" => {
|
||||||
let dry_run = args.contains("--dry-run");
|
let dry_run = args.contains("--dry-run");
|
||||||
|
|
80
xtask/src/pre_cache.rs
Normal file
80
xtask/src/pre_cache.rs
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
use std::{
|
||||||
|
fs::FileType,
|
||||||
|
path::{Path, PathBuf},
|
||||||
|
};
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
|
use crate::not_bash::{fs2, rm_rf};
|
||||||
|
|
||||||
|
pub struct PreCacheCmd;
|
||||||
|
|
||||||
|
impl PreCacheCmd {
|
||||||
|
/// Cleans the `./target` dir after the build such that only
|
||||||
|
/// dependencies are cached on CI.
|
||||||
|
pub fn run(self) -> Result<()> {
|
||||||
|
let slow_tests_cookie = Path::new("./target/.slow_tests_cookie");
|
||||||
|
if !slow_tests_cookie.exists() {
|
||||||
|
panic!("slow tests were skipped on CI!")
|
||||||
|
}
|
||||||
|
rm_rf(slow_tests_cookie)?;
|
||||||
|
|
||||||
|
for path in read_dir("./target/debug", FileType::is_file)? {
|
||||||
|
// Can't delete yourself on windows :-(
|
||||||
|
if !path.ends_with("xtask.exe") {
|
||||||
|
rm_rf(&path)?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs2::remove_file("./target/.rustc_info.json")?;
|
||||||
|
|
||||||
|
let to_delete = read_dir("./crates", FileType::is_dir)?
|
||||||
|
.into_iter()
|
||||||
|
.map(|path| path.file_name().unwrap().to_string_lossy().replace('-', "_"))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
for &dir in ["./target/debug/deps", "target/debug/.fingerprint"].iter() {
|
||||||
|
for path in read_dir(dir, |_file_type| true)? {
|
||||||
|
if path.ends_with("xtask.exe") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let file_name = path.file_name().unwrap().to_string_lossy();
|
||||||
|
let (stem, _) = match rsplit_once(&file_name, '-') {
|
||||||
|
Some(it) => it,
|
||||||
|
None => {
|
||||||
|
rm_rf(path)?;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let stem = stem.replace('-', "_");
|
||||||
|
if to_delete.contains(&stem) {
|
||||||
|
rm_rf(path)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn read_dir(path: impl AsRef<Path>, cond: impl Fn(&FileType) -> bool) -> Result<Vec<PathBuf>> {
|
||||||
|
read_dir_impl(path.as_ref(), &cond)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_dir_impl(path: &Path, cond: &dyn Fn(&FileType) -> bool) -> Result<Vec<PathBuf>> {
|
||||||
|
let mut res = Vec::new();
|
||||||
|
for entry in path.read_dir()? {
|
||||||
|
let entry = entry?;
|
||||||
|
let file_type = entry.file_type()?;
|
||||||
|
if cond(&file_type) {
|
||||||
|
res.push(entry.path())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rsplit_once(haystack: &str, delim: char) -> Option<(&str, &str)> {
|
||||||
|
let mut split = haystack.rsplitn(2, delim);
|
||||||
|
let suffix = split.next()?;
|
||||||
|
let prefix = split.next()?;
|
||||||
|
Some((prefix, suffix))
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue