#![allow(dead_code)]
use std::path::Path;
use std::process::Command;
use tempfile::TempDir;
pub fn today() -> String {
chrono::Local::now().format("%Y-%m-%d").to_string()
}
pub fn normalize_output(output: &str, dir: &Path, date: &str) -> String {
let canonical = dir.canonicalize().unwrap_or_else(|_| dir.to_path_buf());
let canonical_str = canonical.display().to_string();
let dir_str = dir.display().to_string();
let mut normalized = output.replace(&canonical_str, "<TEMPDIR>");
normalized = normalized.replace(&dir_str, "<TEMPDIR>");
normalized = normalized.replace(date, "<DATE>");
let wi_pattern = regex::Regex::new(r"WI-\d{4}-\d{2}-\d{2}-(\d{3})").unwrap();
normalized = wi_pattern
.replace_all(&normalized, "WI-<DATE>-$1")
.to_string();
let adr_file_pattern = regex::Regex::new(r"ADR-(\d{4})-").unwrap();
normalized = adr_file_pattern
.replace_all(&normalized, "ADR-XXXX-")
.to_string();
let sig_pattern = regex::Regex::new(r"sha256:[0-9a-f]{64}").unwrap();
normalized = sig_pattern
.replace_all(&normalized, "sha256:<HASH>")
.to_string();
let version = env!("CARGO_PKG_VERSION");
normalized = normalized.replace(&format!("\"{version}\""), "\"<VERSION>\"");
normalized
}
pub fn run_commands(dir: &Path, commands: &[&[&str]]) -> String {
let mut output = String::new();
for args in commands {
output.push_str(&format!("$ govctl {}\n", args.join(" ")));
let result = Command::new(env!("CARGO_BIN_EXE_govctl"))
.args(*args)
.current_dir(dir)
.env("NO_COLOR", "1")
.env("GOVCTL_DEFAULT_OWNER", "@test-user")
.output()
.expect("failed to run govctl");
let stdout = String::from_utf8_lossy(&result.stdout);
let stderr = String::from_utf8_lossy(&result.stderr);
if !stdout.is_empty() {
output.push_str(&stdout);
if !stdout.ends_with('\n') {
output.push('\n');
}
}
if !stderr.is_empty() {
output.push_str(&stderr);
if !stderr.ends_with('\n') {
output.push('\n');
}
}
output.push_str(&format!("exit: {}\n\n", result.status.code().unwrap_or(-1)));
}
output
}
pub fn run_dynamic_commands(dir: &Path, commands: &[Vec<String>]) -> String {
let mut output = String::new();
for args in commands {
let args_str: Vec<&str> = args.iter().map(|s| s.as_str()).collect();
output.push_str(&format!("$ govctl {}\n", args_str.join(" ")));
let result = Command::new(env!("CARGO_BIN_EXE_govctl"))
.args(&args_str)
.current_dir(dir)
.env("NO_COLOR", "1")
.env("GOVCTL_DEFAULT_OWNER", "@test-user")
.output()
.expect("failed to run govctl");
let stdout = String::from_utf8_lossy(&result.stdout);
let stderr = String::from_utf8_lossy(&result.stderr);
if !stdout.is_empty() {
output.push_str(&stdout);
if !stdout.ends_with('\n') {
output.push('\n');
}
}
if !stderr.is_empty() {
output.push_str(&stderr);
if !stderr.ends_with('\n') {
output.push('\n');
}
}
output.push_str(&format!("exit: {}\n\n", result.status.code().unwrap_or(-1)));
}
output
}
pub fn init_project_at(schema_version: Option<u32>) -> TempDir {
let temp_dir = TempDir::new().expect("failed to create temp dir");
let mut cmd = Command::new(env!("CARGO_BIN_EXE_govctl"));
cmd.args(["init"])
.current_dir(temp_dir.path())
.env("NO_COLOR", "1")
.env("GOVCTL_DEFAULT_OWNER", "@test-user");
if let Some(v) = schema_version {
cmd.env("GOVCTL_SCHEMA_VERSION", v.to_string());
}
let result = cmd.output().expect("failed to run govctl init");
assert!(result.status.success(), "govctl init failed");
temp_dir
}
pub fn init_project() -> TempDir {
init_project_at(None)
}
pub fn init_project_v1() -> TempDir {
init_project_at(Some(1))
}