From 0c5d8d9146afea3894dad46eb672a2eb2a4dffb0 Mon Sep 17 00:00:00 2001 From: Zhongheng Liu Date: Tue, 24 Dec 2024 11:54:52 +0200 Subject: feat: libgit2 repo creation --- src/git_tools.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/git_tools.rs (limited to 'src/git_tools.rs') diff --git a/src/git_tools.rs b/src/git_tools.rs new file mode 100644 index 0000000..3b697e0 --- /dev/null +++ b/src/git_tools.rs @@ -0,0 +1,58 @@ +use core::panic; + +use git2::{Repository, RepositoryInitOptions}; + +pub enum RepoCreateError { + OwnershipError, + PathError, + RepoNameParseError, + InternalError, +} + +fn fmt_repo_name_dotgit(raw_name: &str) -> Result { + if raw_name.ends_with(".git") { + Ok(raw_name.to_string()) + } else { + Ok(raw_name.to_owned() + ".git") + } +} +fn check_owner_against_config(_owner: &str) -> bool { + true + /* TODO + * Check owner against configuration + * to see if authenticated for managing git repos + */ +} +pub fn make_repo(raw_repo_name: &str, owner_text: &str) -> Result { + let path = match home::home_dir() { + Some(home_path) => home_path.display().to_string(), + + None => todo!(), + }; + let git_base_path = path + "/libgit_test_repos"; + if !(check_owner_against_config(owner_text)) { + return Err(RepoCreateError::OwnershipError); + } + let repo_name: Result = fmt_repo_name_dotgit(raw_repo_name); + let name = repo_name.unwrap_or_else(|error| { + if let RepoCreateError::RepoNameParseError = error { + panic!("RepoNameParseError"); + } else { + panic!("Unknown error"); + } + }); + let git_repo_path: String = git_base_path + "/" + &name; + + let mut options = RepositoryInitOptions::new(); + options.no_reinit(true).bare(true); + let repo = match Repository::init_opts(&git_repo_path, &options) { + Ok(repo) => { + println!("Successfully init repository at {}", git_repo_path); + repo + } + Err(_e) => { + return Err(RepoCreateError::InternalError); + } + }; + Ok(repo) +} -- cgit