From 3035f8d52efe33749a8c027e193559ee7dd4c357 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Mon, 13 Mar 2023 22:03:58 +0200 Subject: Git clone / fetch --- src/main.rs | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index ba29032..6f8c1d9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,8 +2,8 @@ mod git; mod parser; use clap::Parser; -use parser::Command; -use std::{io, io::Write, ops::ControlFlow, process}; +use parser::*; +use std::{io, io::Write, ops::ControlFlow, process::Command}; use thiserror::Error; /// Shackle Shell - A replacement for git-shell with repo management commands built in. @@ -42,29 +42,41 @@ fn main() -> Result<(), ShackleError> { } fn run_command(user_input: String) -> Result, ShackleError> { - match user_input.parse::() { - Err(unknown_input) => { - println!("Unknown input \"{}\"", unknown_input); + match user_input.parse::() { + Err(parse_error) => { + println!("{}", parse_error); } - Ok(Command::Whitespace) => {} - Ok(Command::Exit) => { + Ok(ShackleCommand::Whitespace) => {} + Ok(ShackleCommand::Exit) => { return Ok(ControlFlow::Break(())); } - Ok(Command::GitInit(repo_name)) => { + Ok(ShackleCommand::GitInit(GitInitArgs { repo_name })) => { git::init(&repo_name)?; // TODO should report this error differently println!("Successfully created {}.git", repo_name); } - Ok(Command::GitUploadPack(git_dir)) => { - process::Command::new("git") - .args(["upload-pack", &git_dir]) - .spawn()? - .wait()?; - } - Ok(Command::GitReceivePack(git_dir)) => { - process::Command::new("git") - .args(["receive-pack", &git_dir]) - .spawn()? - .wait()?; + 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"); + } + + // TODO: This should definitely be part of the arg parsing! + command.arg(&upload_pack_args.directory.trim_matches('\'')); + + command.spawn()?.wait()?; } } Ok(ControlFlow::Continue(())) -- cgit v1.2.3