summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs50
1 files changed, 31 insertions, 19 deletions
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<ControlFlow<(), ()>, ShackleError> {
- match user_input.parse::<Command>() {
- Err(unknown_input) => {
- println!("Unknown input \"{}\"", unknown_input);
+ match user_input.parse::<ShackleCommand>() {
+ 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(()))