141 lines
4.4 KiB
Rust
141 lines
4.4 KiB
Rust
use std::path::Path;
|
|
use std::process::Command;
|
|
|
|
fn main() {
|
|
let is_ci = std::env::var("CI").is_ok();
|
|
|
|
// Verify that required directories exist at build time
|
|
let required_dirs = vec!["static", "templates"];
|
|
|
|
let mut missing_dirs = Vec::new();
|
|
|
|
for dir in &required_dirs {
|
|
if !Path::new(dir).exists() {
|
|
missing_dirs.push(*dir);
|
|
}
|
|
}
|
|
|
|
if !missing_dirs.is_empty() {
|
|
println!("cargo:warning=Missing required directories:");
|
|
for dir in &missing_dirs {
|
|
println!("cargo:warning= - {}", dir);
|
|
}
|
|
}
|
|
|
|
// node_modules is only needed for local dev (Docker/CI install deps separately)
|
|
if !is_ci && !Path::new("node_modules").exists() {
|
|
println!(
|
|
"cargo:warning=node_modules not found — run 'npm install' for frontend dependencies"
|
|
);
|
|
}
|
|
|
|
// Verify critical files
|
|
let required_files = vec![
|
|
"templates/term.html",
|
|
"static/terminal.js",
|
|
"static/terminado-addon.js",
|
|
"static/styles.css",
|
|
];
|
|
|
|
let mut missing_files = Vec::new();
|
|
|
|
for file in &required_files {
|
|
if !Path::new(file).exists() {
|
|
missing_files.push(*file);
|
|
}
|
|
}
|
|
|
|
if !missing_files.is_empty() {
|
|
println!("cargo:warning=Missing required files:");
|
|
for file in &missing_files {
|
|
println!("cargo:warning= - {}", file);
|
|
}
|
|
}
|
|
|
|
// Build mdBook documentation (skip in CI — docs are built in Docker)
|
|
if !is_ci {
|
|
build_documentation();
|
|
}
|
|
|
|
// Tell cargo to rerun if these directories change
|
|
println!("cargo:rerun-if-changed=static/");
|
|
println!("cargo:rerun-if-changed=templates/");
|
|
println!("cargo:rerun-if-changed=package.json");
|
|
println!("cargo:rerun-if-changed=package-lock.json");
|
|
println!("cargo:rerun-if-changed=docs/");
|
|
}
|
|
|
|
fn build_documentation() {
|
|
let docs_dir = Path::new("docs");
|
|
let static_docs_dir = Path::new("static/docs");
|
|
|
|
// If static/docs already exists (e.g., from Docker COPY), we're done
|
|
if static_docs_dir.exists() {
|
|
println!("cargo:warning=Documentation already present in static/docs");
|
|
return;
|
|
}
|
|
|
|
if !docs_dir.exists() {
|
|
println!("cargo:warning=Documentation directory not found, skipping docs build");
|
|
return;
|
|
}
|
|
|
|
// Check if mdbook is installed
|
|
let mdbook_check = Command::new("mdbook").arg("--version").output();
|
|
|
|
if mdbook_check.is_err() {
|
|
println!("cargo:warning=mdbook not found. Install with: cargo install mdbook");
|
|
println!("cargo:warning=Skipping documentation build");
|
|
println!("cargo:warning=Documentation will be available if pre-built in static/docs");
|
|
return;
|
|
}
|
|
|
|
// Note: mdbook-catppuccin preprocessor is deprecated
|
|
// Catppuccin theme is now applied via CSS file in docs/theme/
|
|
// No need to check for mdbook-catppuccin installation
|
|
|
|
// Build the documentation
|
|
println!("cargo:warning=Building documentation with mdbook...");
|
|
let build_result = Command::new("mdbook")
|
|
.arg("build")
|
|
.current_dir("docs")
|
|
.status();
|
|
|
|
match build_result {
|
|
Ok(status) if status.success() => {
|
|
println!("cargo:warning=Documentation built successfully");
|
|
|
|
// Copy docs to static directory for serving
|
|
if Path::new("docs/book").exists() {
|
|
// Ensure static directory exists
|
|
let _ = std::fs::create_dir_all("static");
|
|
|
|
let copy_result = if cfg!(target_os = "windows") {
|
|
Command::new("xcopy")
|
|
.args(["/E", "/I", "/Y", "docs\\book", "static\\docs"])
|
|
.status()
|
|
} else {
|
|
Command::new("cp")
|
|
.args(["-r", "docs/book", "static/docs"])
|
|
.status()
|
|
};
|
|
|
|
match copy_result {
|
|
Ok(status) if status.success() => {
|
|
println!("cargo:warning=Documentation copied to static/docs");
|
|
}
|
|
_ => {
|
|
println!("cargo:warning=Failed to copy documentation to static directory");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Ok(_) => {
|
|
println!("cargo:warning=mdbook build failed");
|
|
}
|
|
Err(e) => {
|
|
println!("cargo:warning=Failed to run mdbook: {}", e);
|
|
}
|
|
}
|
|
}
|