Index parsing and gitignore files

This commit is contained in:
Antonin Ruan
2026-03-11 17:49:08 +01:00
parent f600a89f5b
commit 3027a99b5f
13 changed files with 1072 additions and 268 deletions
+22 -28
View File
@@ -1,14 +1,11 @@
use anyhow::Result;
use anyhow::bail;
use clap::Parser;
use std::{
fs,
path::Path
};
use std::{fs, path::Path};
use crate::GIT_DIR;
use crate::git_fs::head::Head;
use crate::subcommands::Subcommand;
use crate::GIT_DIR;
use super::CmdResult;
#[derive(Parser, Debug)]
pub struct InitSubcommand {
@@ -16,45 +13,42 @@ pub struct InitSubcommand {
}
impl Subcommand for InitSubcommand {
fn run(&self) -> CmdResult {
fn run(&self) -> Result<String> {
let path = match &self.directory {
None => Path::new("."),
Some(path) => Path::new(path),
}.join(GIT_DIR);
}
.join(GIT_DIR);
let new_repo = path.exists();
match fs::create_dir_all(&path) {
Err(_) => return Err("Error while creating dir".to_owned()),
Ok(()) => (),
if fs::create_dir_all(&path).is_err() {
bail!("Error while creating dir")
};
let folders = [
"objects/info",
"objects/pack",
"refs/heads",
"refs/tags",
];
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(()) => (),
};
fs::create_dir_all(path.join(folder))?;
}
let head = Head { ref_to: String::from("refs/heads/master") };
match head.save() {
Err(_) => return Err("".to_owned()),
Ok(()) => (),
let head = Head {
ref_to: String::from("refs/heads/master"),
};
head.save()?;
let canonical_path = path.canonicalize();
if new_repo {
Ok(format!("Reinitialized exisiting Git repo in {}", canonical_path.unwrap().display()))
Ok(format!(
"Reinitialized exisiting Git repo in {}",
canonical_path?.display()
))
} else {
Ok(format!("Initialized empty Git repo in {}", canonical_path.unwrap().display()))
Ok(format!(
"Initialized empty Git repo in {}",
canonical_path?.display()
))
}
}
}