use crate::parser::{GitReceivePackArgs, GitUploadPackArgs}; use crate::ShackleError; use git2::{Repository, RepositoryInitOptions}; use std::{path::PathBuf, process::Command}; pub fn init(repo_name: &str) -> Result<(), ShackleError> { let mut path = PathBuf::from("git"); path.push(repo_name); path.set_extension("git"); Repository::init_opts( path, &RepositoryInitOptions::new() .bare(true) .mkdir(true) .no_reinit(true), )?; Ok(()) } pub fn upload_pack(upload_pack_args: &GitUploadPackArgs) -> Result<(), ShackleError> { let mut command = Command::new("git-upload-pack"); if upload_pack_args.strict { command.arg("strict"); } if upload_pack_args.no_strict { command.arg("no-strict"); } if let Some(timeout) = upload_pack_args.timeout { command.args(["timeout", &timeout.to_string()]); } if upload_pack_args.stateless_rpc { command.arg("stateless-rpc"); } if upload_pack_args.advertise_refs { command.arg("advertise-refs"); } command.arg(&upload_pack_args.directory); command.spawn()?.wait()?; Ok(()) } pub fn receive_pack(receive_pack_args: &GitReceivePackArgs) -> Result<(), ShackleError> { let mut command = Command::new("git-receive-pack"); if receive_pack_args.http_backend_info_refs { command.arg("--http-backend-info-refs"); } command.arg(&receive_pack_args.directory); command.spawn()?.wait()?; Ok(()) }