From da8802d1fb0c5707877777ff4187238195eef16b Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Sat, 24 Jun 2023 21:52:37 +0200 Subject: Added a command to delete a repo --- src/git.rs | 13 +++++++++++++ src/lib.rs | 4 ++++ src/parser.rs | 9 +++++++++ 3 files changed, 26 insertions(+) (limited to 'src') diff --git a/src/git.rs b/src/git.rs index 07ec775..c07615d 100644 --- a/src/git.rs +++ b/src/git.rs @@ -194,6 +194,19 @@ pub fn set_branch(directory: &Path, branch: &str) -> Result<(), ShackleError> { } } +pub fn delete(directory: &Path) -> Result<(), ShackleError> { + if !is_valid_git_repo_path(directory)? { + return Err(ShackleError::InvalidDirectory); + } + + if Repository::open_bare(directory).is_ok() { + fs::remove_dir_all(directory)?; + Ok(()) + } else { + Err(ShackleError::InvalidDirectory) + } +} + pub fn upload_pack(upload_pack_args: &GitUploadPackArgs) -> Result<(), ShackleError> { if !is_valid_git_repo_path(&upload_pack_args.directory)? { return Err(ShackleError::InvalidDirectory); diff --git a/src/lib.rs b/src/lib.rs index 45a7fd3..32d5770 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -46,6 +46,10 @@ pub fn run_command(user_input: &str) -> Result, ShackleError let init_result = git::init(&repo_name, &group, &description, &branch)?; println!("Successfully created \"{}\"", init_result.path.display()); } + Ok(ShackleCommand::Delete(DeleteArgs { directory })) => { + git::delete(&directory)?; + println!("Successfully deleted \"{}\"", directory.display()); + } Ok(ShackleCommand::GitUploadPack(upload_pack_args)) => { git::upload_pack(&upload_pack_args)?; } diff --git a/src/parser.rs b/src/parser.rs index ebd860b..30eb1e0 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -16,6 +16,8 @@ pub enum ShackleCommand { SetDescription(SetDescriptionArgs), /// Sets the main branch of the repository SetBranch(SetBranchArgs), + /// Deletes a repository + Delete(DeleteArgs), /// Quit the shell Exit, /// Server side command required to git fetch from the server @@ -57,6 +59,13 @@ pub struct SetBranchArgs { pub branch: String, } +#[derive(Parser, Clone, Debug, PartialEq, Eq)] +pub struct DeleteArgs { + /// The full relative path of the repository, for example git/shuckie/repo.git + #[arg(value_parser = RelativePathParser)] + pub directory: PathBuf, +} + #[derive(Parser, Clone, Debug, PartialEq, Eq)] pub struct GitUploadPackArgs { /// Do not try /.git/ if is no Git directory -- cgit v1.2.3