From ae4b23d95dc8792231c1e8212978be8305ee1964 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Mon, 20 Mar 2023 17:06:10 +0200 Subject: Refactor git functions into the git module --- src/git.rs | 41 ++++++++++++++++++++++++++++++++++++++++- src/main.rs | 34 +++------------------------------- 2 files changed, 43 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/git.rs b/src/git.rs index bd26568..b3c41e9 100644 --- a/src/git.rs +++ b/src/git.rs @@ -1,7 +1,8 @@ +use crate::parser::{GitReceivePackArgs, GitUploadPackArgs}; use crate::ShackleError; use git2::{Repository, RepositoryInitOptions}; -use std::path::PathBuf; +use std::{path::PathBuf, process::Command}; pub fn init(repo_name: &str) -> Result<(), ShackleError> { let mut path = PathBuf::from("git"); @@ -17,3 +18,41 @@ pub fn init(repo_name: &str) -> Result<(), ShackleError> { )?; 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(()) +} diff --git a/src/main.rs b/src/main.rs index 56cd729..4b62aa1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ mod parser; use clap::Parser; use parser::*; use rustyline::{error::ReadlineError, DefaultEditor}; -use std::{io, ops::ControlFlow, process::Command}; +use std::{io, ops::ControlFlow}; use thiserror::Error; /// Shackle Shell - A replacement for git-shell with repo management commands built in. @@ -44,38 +44,10 @@ fn run_command(user_input: String) -> Result, ShackleError> println!("Successfully created \"{}.git\"", repo_name); } Ok(ShackleCommand::GitUploadPack(upload_pack_args)) => { - 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()?; + git::upload_pack(&upload_pack_args)?; } Ok(ShackleCommand::GitReceivePack(receive_pack_args)) => { - 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()?; + git::receive_pack(&receive_pack_args)?; } } Ok(ControlFlow::Continue(())) -- cgit v1.2.3