diff options
Diffstat (limited to 'src/git.rs')
-rw-r--r-- | src/git.rs | 49 |
1 files changed, 37 insertions, 12 deletions
@@ -2,7 +2,7 @@ use crate::{ parser::{GitReceivePackArgs, GitUploadPackArgs}, ShackleError, }; -use git2::{Repository, RepositoryInitOptions}; +use git2::{Repository, RepositoryInitMode, RepositoryInitOptions}; use std::{ path::{Path, PathBuf}, process::Command, @@ -18,6 +18,10 @@ fn personal_git_dir() -> Result<PathBuf, ShackleError> { Ok(Path::new("git").join(username)) } +fn group_git_dir(group: &str) -> PathBuf { + Path::new("git").join(group) +} + fn is_valid_personal_git_repo(path: &PathBuf) -> Result<bool, ShackleError> { let valid_dir = personal_git_dir()?; let relative_path = match path.strip_prefix(&valid_dir) { @@ -36,17 +40,38 @@ fn is_valid_personal_git_repo(path: &PathBuf) -> Result<bool, ShackleError> { Ok(true) } -pub fn init(repo_name: &str) -> Result<GitInitResult, ShackleError> { - let path = personal_git_dir()?.join(repo_name).with_extension("git"); - - Repository::init_opts( - &path, - &RepositoryInitOptions::new() - .bare(true) - .mkdir(true) - .no_reinit(true), - )?; - Ok(GitInitResult { path }) +pub fn init(repo_name: &str, group: &Option<String>) -> Result<GitInitResult, ShackleError> { + fn init_group(repo_name: &str, group: &str) -> Result<GitInitResult, ShackleError> { + let path = group_git_dir(group).join(repo_name).with_extension("git"); + + Repository::init_opts( + &path, + &RepositoryInitOptions::new() + .bare(true) + .mode(RepositoryInitMode::SHARED_GROUP) + .mkdir(true) + .no_reinit(true), + )?; + Ok(GitInitResult { path }) + } + + fn init_personal(repo_name: &str) -> Result<GitInitResult, ShackleError> { + let path = personal_git_dir()?.join(repo_name).with_extension("git"); + + Repository::init_opts( + &path, + &RepositoryInitOptions::new() + .bare(true) + .mkdir(true) + .no_reinit(true), + )?; + Ok(GitInitResult { path }) + } + + match group { + Some(group) => init_group(repo_name, group), + None => init_personal(repo_name), + } } pub fn upload_pack(upload_pack_args: &GitUploadPackArgs) -> Result<(), ShackleError> { |