use secrecy::ExposeSecret; use tracing::{info, warn}; use crate::server::{ config::{BranchName, RepoDetails}, gitforge::{BranchResetResult, Force}, types::GitRef, }; pub fn reset( repo_details: &RepoDetails, branch_name: BranchName, to_commit: GitRef, force: Force, ) -> BranchResetResult { let origin = repo_details.origin(); let force = match force { Force::No => "".to_string(), Force::From(old_ref) => format!("--force-with-lease={branch_name}:{old_ref}"), }; // INFO: never log the command as it contains the API token within the 'origin' let command: secrecy::Secret = format!( "/usr/bin/git push {} {to_commit}:{branch_name} {force}", origin.expose_secret() ) .into(); info!("Resetting {branch_name} to {to_commit}"); match gix::command::prepare(command.expose_secret()) .with_shell_allow_argument_splitting() .stdout(std::process::Stdio::null()) .stderr(std::process::Stdio::null()) .spawn() { Ok(mut child) => match child.wait() { Ok(_) => Ok(()), Err(err) => { warn!(?err, "Failed (wait)"); Err(()) } }, Err(err) => { warn!(?err, "Failed (spawn)"); Err(()) } } }