diff options
Diffstat (limited to 'syn/tests/repo')
| -rw-r--r-- | syn/tests/repo/mod.rs | 109 | ||||
| -rw-r--r-- | syn/tests/repo/progress.rs | 37 | 
2 files changed, 146 insertions, 0 deletions
diff --git a/syn/tests/repo/mod.rs b/syn/tests/repo/mod.rs new file mode 100644 index 0000000..681615c --- /dev/null +++ b/syn/tests/repo/mod.rs @@ -0,0 +1,109 @@ +mod progress; + +use self::progress::Progress; +use crate::common; +use anyhow::Result; +use flate2::read::GzDecoder; +use std::fs; +use std::path::Path; +use tar::Archive; +use walkdir::DirEntry; + +const REVISION: &str = "7979016aff545f7b41cc517031026020b340989d"; + +pub fn base_dir_filter(entry: &DirEntry) -> bool { +    let path = entry.path(); +    if path.is_dir() { +        return true; // otherwise walkdir does not visit the files +    } +    if path.extension().map(|e| e != "rs").unwrap_or(true) { +        return false; +    } +    let path_string = path.to_string_lossy(); +    let path_string = if cfg!(windows) { +        path_string.replace('\\', "/").into() +    } else { +        path_string +    }; +    // TODO assert that parsing fails on the parse-fail cases +    if path_string.starts_with("tests/rust/src/test/parse-fail") +        || path_string.starts_with("tests/rust/src/test/compile-fail") +        || path_string.starts_with("tests/rust/src/test/rustfix") +    { +        return false; +    } + +    if path_string.starts_with("tests/rust/src/test/ui") { +        let stderr_path = path.with_extension("stderr"); +        if stderr_path.exists() { +            // Expected to fail in some way +            return false; +        } +    } + +    match path_string.as_ref() { +        // Deprecated placement syntax +        "tests/rust/src/test/ui/obsolete-in-place/bad.rs" | +        // Deprecated anonymous parameter syntax in traits +        "tests/rust/src/test/ui/error-codes/e0119/auxiliary/issue-23563-a.rs" | +        "tests/rust/src/test/ui/issues/issue-13105.rs" | +        "tests/rust/src/test/ui/issues/issue-13775.rs" | +        "tests/rust/src/test/ui/issues/issue-34074.rs" | +        // Deprecated await macro syntax +        "tests/rust/src/test/ui/async-await/await-macro.rs" | +        // 2015-style dyn that libsyntax rejects +        "tests/rust/src/test/ui/dyn-keyword/dyn-2015-no-warnings-without-lints.rs" | +        // not actually test cases +        "tests/rust/src/test/ui/include-single-expr-helper.rs" | +        "tests/rust/src/test/ui/include-single-expr-helper-1.rs" | +        "tests/rust/src/test/ui/issues/auxiliary/issue-21146-inc.rs" | +        "tests/rust/src/test/ui/macros/auxiliary/macro-comma-support.rs" | +        "tests/rust/src/test/ui/macros/auxiliary/macro-include-items-expr.rs" => false, +        _ => true, +    } +} + +pub fn clone_rust() { +    let needs_clone = match fs::read_to_string("tests/rust/COMMIT") { +        Err(_) => true, +        Ok(contents) => contents.trim() != REVISION, +    }; +    if needs_clone { +        download_and_unpack().unwrap(); +    } +} + +fn download_and_unpack() -> Result<()> { +    let url = format!( +        "https://github.com/rust-lang/rust/archive/{}.tar.gz", +        REVISION +    ); +    let response = reqwest::blocking::get(&url)?.error_for_status()?; +    let progress = Progress::new(response); +    let decoder = GzDecoder::new(progress); +    let mut archive = Archive::new(decoder); +    let prefix = format!("rust-{}", REVISION); + +    let tests_rust = Path::new("tests/rust"); +    if tests_rust.exists() { +        fs::remove_dir_all(tests_rust)?; +    } + +    for entry in archive.entries()? { +        let mut entry = entry?; +        let path = entry.path()?; +        if path == Path::new("pax_global_header") { +            continue; +        } +        let relative = path.strip_prefix(&prefix)?; +        let out = tests_rust.join(relative); +        entry.unpack(&out)?; +        if common::travis_ci() { +            // Something about this makes the travis build not deadlock... +            errorf!("."); +        } +    } + +    fs::write("tests/rust/COMMIT", REVISION)?; +    Ok(()) +} diff --git a/syn/tests/repo/progress.rs b/syn/tests/repo/progress.rs new file mode 100644 index 0000000..28c8a44 --- /dev/null +++ b/syn/tests/repo/progress.rs @@ -0,0 +1,37 @@ +use std::io::{Read, Result}; +use std::time::{Duration, Instant}; + +pub struct Progress<R> { +    bytes: usize, +    tick: Instant, +    stream: R, +} + +impl<R> Progress<R> { +    pub fn new(stream: R) -> Self { +        Progress { +            bytes: 0, +            tick: Instant::now() + Duration::from_millis(2000), +            stream, +        } +    } +} + +impl<R: Read> Read for Progress<R> { +    fn read(&mut self, buf: &mut [u8]) -> Result<usize> { +        let num = self.stream.read(buf)?; +        self.bytes += num; +        let now = Instant::now(); +        if now > self.tick { +            self.tick = now + Duration::from_millis(500); +            errorf!("downloading... {} bytes\n", self.bytes); +        } +        Ok(num) +    } +} + +impl<R> Drop for Progress<R> { +    fn drop(&mut self) { +        errorf!("done ({} bytes)\n", self.bytes); +    } +}  | 
