#![allow(dead_code)]
use std::process::Command;
use cursus::model::config::{CargoConfig, Config, NpmConfig, PackageManager};
use tempfile::TempDir;
pub fn test_env(dir: &std::path::Path) -> cursus::Env {
let runner = std::sync::Arc::new(cursus::command::RealCommandRunner)
as std::sync::Arc<dyn cursus::command::CommandRunner>;
let path = cursus::path::AbsolutePath::new(dir).unwrap();
cursus::Env::new(
std::sync::Arc::clone(&runner),
std::sync::Arc::new(cursus::filesystem::LocalFilesystem),
std::sync::Arc::new(cursus::git::GitWorkdir::new(runner, path)),
)
}
pub fn temp_git_repo() -> TempDir {
let dir = tempfile::tempdir().expect("Failed to create temp dir");
std::fs::create_dir(dir.path().join(".git")).unwrap();
dir
}
pub async fn temp_git_repo_with_config(pm: PackageManager) -> TempDir {
let dir = temp_git_repo();
let env = test_env(dir.path());
let config = match pm {
PackageManager::Npm => Config::new().with_npm(NpmConfig::enabled()),
PackageManager::Cargo => Config::new().with_cargo(CargoConfig::enabled()),
};
config.save(env.fs(), env.git().path()).await.unwrap();
dir
}
pub async fn temp_git_repo_with_project(pm: PackageManager) -> TempDir {
let dir = temp_git_repo();
let env = test_env(dir.path());
let config = match pm {
PackageManager::Npm => Config::new().with_npm(NpmConfig::enabled()),
PackageManager::Cargo => Config::new().with_cargo(CargoConfig::enabled()),
};
config.save(env.fs(), env.git().path()).await.unwrap();
match pm {
PackageManager::Npm => {
std::fs::write(
dir.path().join("package.json"),
r#"{"name": "test-project", "version": "0.1.0"}"#,
)
.unwrap();
}
PackageManager::Cargo => {
std::fs::write(
dir.path().join("Cargo.toml"),
"[package]\nname = \"test-project\"\nversion = \"0.1.0\"\nedition = \"2024\"\n",
)
.unwrap();
std::fs::create_dir_all(dir.path().join("src")).unwrap();
std::fs::write(dir.path().join("src/lib.rs"), "").unwrap();
}
}
dir
}
pub fn write_changeset(dir: &std::path::Path, filename: &str, content: &str) {
let cursus_dir = dir.join(".cursus");
std::fs::create_dir_all(&cursus_dir).unwrap();
std::fs::write(cursus_dir.join(filename), content).unwrap();
}
pub fn run_cursus_subprocess(args: &[&str], cwd: &std::path::Path) -> (bool, String, String) {
let bin = env!("CARGO_BIN_EXE_cursus");
let output = Command::new(bin)
.args(args)
.current_dir(cwd)
.output()
.expect("Failed to spawn cursus subprocess");
let stdout = String::from_utf8_lossy(&output.stdout).into_owned();
let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
(output.status.success(), stdout, stderr)
}
#[cfg(feature = "nix-tests")]
pub fn run_cursus_in_nix_shell(
shell_attr: &str,
args: &[&str],
cwd: &std::path::Path,
) -> (bool, String, String) {
let bin = env!("CARGO_BIN_EXE_cursus");
let flake_root = env!("CURSUS_WORKSPACE_ROOT");
let flake_ref = format!("{flake_root}#{shell_attr}");
let mut nix_args = vec!["develop", flake_ref.as_str(), "--command", bin];
nix_args.extend_from_slice(args);
let output = Command::new("nix")
.args(&nix_args)
.current_dir(cwd)
.output()
.expect("Failed to spawn `nix develop` — is nix installed?");
let stdout = String::from_utf8_lossy(&output.stdout).into_owned();
let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
(output.status.success(), stdout, stderr)
}