use std::path::Path;
use fallow_config::WorkspaceInfo;
pub fn suggestions_enabled() -> bool {
match std::env::var("FALLOW_SUGGESTIONS").ok().as_deref() {
Some(raw) => !matches!(
raw.trim().to_ascii_lowercase().as_str(),
"off" | "0" | "false" | "no" | "disabled"
),
None => true,
}
}
pub fn setup_pointer_applicable(root: &Path) -> bool {
root.exists() && fallow_config::FallowConfig::find_config_path(root).is_none() && !is_ci()
}
pub fn default_workspace_ref(root: &Path) -> Option<String> {
let workspaces = fallow_config::discover_workspaces(root);
default_workspace_ref_for_workspaces(root, &workspaces)
}
pub fn default_workspace_ref_for_workspaces(
root: &Path,
workspaces: &[WorkspaceInfo],
) -> Option<String> {
if !fallow_engine::churn::is_git_repo(root) || workspaces.is_empty() {
return None;
}
if let Some(reference) = run_git(
root,
&[
"symbolic-ref",
"--quiet",
"--short",
"refs/remotes/origin/HEAD",
],
) {
let reference = reference.trim();
if !reference.is_empty() {
return Some(reference.to_string());
}
}
["origin/main", "origin/master"]
.into_iter()
.find(|candidate| git_ref_exists(root, candidate))
.map(str::to_string)
}
fn is_ci() -> bool {
std::env::var_os("CI").is_some()
|| std::env::var_os("GITHUB_ACTIONS").is_some()
|| std::env::var_os("GITLAB_CI").is_some()
}
fn git_ref_exists(root: &Path, reference: &str) -> bool {
std::process::Command::new("git")
.arg("-C")
.arg(root)
.args(["rev-parse", "--verify", "--quiet", reference])
.output()
.is_ok_and(|output| output.status.success())
}
fn run_git(root: &Path, args: &[&str]) -> Option<String> {
let output = std::process::Command::new("git")
.arg("-C")
.arg(root)
.args(args)
.output()
.ok()?;
if !output.status.success() {
return None;
}
String::from_utf8(output.stdout).ok()
}