summaryrefslogtreecommitdiff
path: root/src/git.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/git.rs')
-rw-r--r--src/git.rs49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/git.rs b/src/git.rs
index b4eb3b2..c61bec1 100644
--- a/src/git.rs
+++ b/src/git.rs
@@ -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> {