use crate::error::{ActionError, ProviderError, RepoLensError};
use std::process::Command;
use super::plan::GitHubRepoSettings;
use crate::utils::prerequisites::{get_repo_info, is_gh_available};
pub async fn update(settings: &GitHubRepoSettings) -> Result<(), RepoLensError> {
if !is_gh_available() {
return Err(RepoLensError::Provider(
ProviderError::GitHubCliNotAvailable,
));
}
let repo = get_repo_info().map_err(|e| {
RepoLensError::Action(ActionError::ExecutionFailed {
message: format!("Failed to get repository info: {}", e),
})
})?;
let mut args = vec!["repo", "edit"];
if let Some(true) = settings.enable_discussions {
args.push("--enable-discussions");
}
if let Some(false) = settings.enable_wiki {
args.push("--enable-wiki=false");
}
if args.len() > 2 {
let output = Command::new("gh").args(&args).output().map_err(|_| {
RepoLensError::Provider(ProviderError::CommandFailed {
command: format!("gh {}", args.join(" ")),
})
})?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
tracing::warn!("Could not update some repository settings: {}", stderr);
}
}
if let Some(true) = settings.enable_vulnerability_alerts {
let output = Command::new("gh")
.args([
"api",
&format!("repos/{}/vulnerability-alerts", repo),
"--method",
"PUT",
])
.output()
.map_err(|_| {
RepoLensError::Provider(ProviderError::CommandFailed {
command: format!("gh api repos/{}/vulnerability-alerts", repo),
})
})?;
if !output.status.success() {
tracing::warn!(
"Could not enable vulnerability alerts (may require specific permissions)"
);
}
}
if let Some(true) = settings.enable_automated_security_fixes {
let output = Command::new("gh")
.args([
"api",
&format!("repos/{}/automated-security-fixes", repo),
"--method",
"PUT",
])
.output()
.map_err(|_| {
RepoLensError::Provider(ProviderError::CommandFailed {
command: format!("gh api repos/{}/automated-security-fixes", repo),
})
})?;
if !output.status.success() {
tracing::warn!(
"Could not enable automated security fixes (may require specific permissions)"
);
}
}
Ok(())
}