tree-sitter/xtask/src/fetch.rs

120 lines
3.2 KiB
Rust
Raw Normal View History

2024-10-06 13:41:47 -04:00
use std::{path::Path, process::Command};
use anyhow::Result;
use crate::{bail_on_err, EMSCRIPTEN_VERSION};
pub fn run_fixtures() -> Result<()> {
let grammars_dir = Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("test")
.join("fixtures")
.join("grammars");
[
("bash", "master"),
("c", "master"),
("cpp", "master"),
("embedded-template", "master"),
("go", "master"),
("html", "master"),
("java", "master"),
("javascript", "master"),
("jsdoc", "master"),
("json", "master"),
("php", "master"),
("python", "master"),
("ruby", "master"),
("rust", "master"),
("typescript", "master"),
]
.iter()
.try_for_each(|(grammar, r#ref)| {
let grammar_dir = grammars_dir.join(grammar);
let grammar_url = format!("https://github.com/tree-sitter/tree-sitter-{grammar}");
println!("Updating the {grammar} grammar...");
if !grammar_dir.exists() {
let mut command = Command::new("git");
command.args([
"clone",
"--depth",
"1",
&grammar_url,
&grammar_dir.to_string_lossy(),
]);
bail_on_err(
&command.spawn()?.wait_with_output()?,
"Failed to clone the {grammar} grammar",
)?;
}
std::env::set_current_dir(&grammar_dir)?;
let mut command = Command::new("git");
command.args(["fetch", "origin", r#ref, "--depth", "1"]);
bail_on_err(
&command.spawn()?.wait_with_output()?,
"Failed to fetch the {grammar} grammar",
)?;
let mut command = Command::new("git");
command.args(["reset", "--hard", "FETCH_HEAD"]);
bail_on_err(
&command.spawn()?.wait_with_output()?,
"Failed to reset the {grammar} grammar",
)?;
Ok(())
})
}
pub fn run_emscripten() -> Result<()> {
let emscripten_dir = Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("target")
.join("emsdk");
if emscripten_dir.exists() {
println!("Emscripten SDK already exists");
return Ok(());
}
println!("Cloning the Emscripten SDK...");
let mut command = Command::new("git");
command.args([
"clone",
"https://github.com/emscripten-core/emsdk.git",
&emscripten_dir.to_string_lossy(),
]);
bail_on_err(
&command.spawn()?.wait_with_output()?,
"Failed to clone the Emscripten SDK",
)?;
std::env::set_current_dir(&emscripten_dir)?;
let emsdk = if cfg!(windows) {
"emsdk.bat"
} else {
"./emsdk"
};
let mut command = Command::new(emsdk);
command.args(["install", EMSCRIPTEN_VERSION]);
bail_on_err(
&command.spawn()?.wait_with_output()?,
"Failed to install Emscripten",
)?;
let mut command = Command::new(emsdk);
command.args(["activate", EMSCRIPTEN_VERSION]);
bail_on_err(
&command.spawn()?.wait_with_output()?,
"Failed to activate Emscripten",
)
}