61 lines
1.5 KiB
Rust
61 lines
1.5 KiB
Rust
use clap::Parser;
|
|
use std::{
|
|
fs,
|
|
path::Path
|
|
};
|
|
|
|
use crate::git_fs::head::Head;
|
|
use crate::subcommands::Subcommand;
|
|
use crate::GIT_DIR;
|
|
|
|
use super::CmdResult;
|
|
|
|
#[derive(Parser, Debug)]
|
|
pub struct InitSubcommand {
|
|
directory: Option<String>,
|
|
}
|
|
|
|
impl Subcommand for InitSubcommand {
|
|
fn run(&self) -> CmdResult {
|
|
let path = match &self.directory {
|
|
None => Path::new("."),
|
|
Some(path) => Path::new(path),
|
|
}.join(GIT_DIR);
|
|
|
|
let new_repo = path.exists();
|
|
|
|
match fs::create_dir_all(&path) {
|
|
Err(_) => return Err("Error while creating dir".to_owned()),
|
|
Ok(()) => (),
|
|
};
|
|
|
|
let folders = [
|
|
"objects/info",
|
|
"objects/pack",
|
|
"refs/heads",
|
|
"refs/tags",
|
|
];
|
|
|
|
for folder in folders {
|
|
match fs::create_dir_all(&path.join(folder)) {
|
|
Err(_) => return Err("".to_owned()),
|
|
Ok(()) => (),
|
|
};
|
|
}
|
|
|
|
let head = Head { ref_to: String::from("refs/heads/master") };
|
|
match head.save() {
|
|
Err(_) => return Err("".to_owned()),
|
|
Ok(()) => (),
|
|
};
|
|
|
|
let canonical_path = path.canonicalize();
|
|
|
|
if new_repo {
|
|
Ok(format!("Reinitialized exisiting Git repo in {}", canonical_path.unwrap().display()))
|
|
} else {
|
|
Ok(format!("Initialized empty Git repo in {}", canonical_path.unwrap().display()))
|
|
}
|
|
}
|
|
}
|