From 03d5c815f23002d38136e02905806848a6761d19 Mon Sep 17 00:00:00 2001 From: mrbeanc Date: Sun, 17 Dec 2023 15:41:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=9Ainit=E5=91=BD?= =?UTF-8?q?=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cli.rs | 3 ++- src/commands/init.rs | 45 ++++++++++++++++++++++++++++++++++++++++++++ src/commands/mod.rs | 1 + src/lib.rs | 3 ++- 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/commands/init.rs create mode 100644 src/commands/mod.rs diff --git a/src/cli.rs b/src/cli.rs index 50bc653..d2c2f9a 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,4 +1,5 @@ use clap::{Parser, Subcommand}; +use mit::commands::init::init; /// Rust实现的简易版本的Git,用于学习Rust语言 #[derive(Parser)] @@ -42,7 +43,7 @@ pub fn handle_command() { let cli = Cli::parse(); match cli.command { Command::Init => { - println!("init"); + let _ = init(); } Command::Add { files , all } => { if files.contains(&".".to_string()) || all { diff --git a/src/commands/init.rs b/src/commands/init.rs new file mode 100644 index 0000000..af5547b --- /dev/null +++ b/src/commands/init.rs @@ -0,0 +1,45 @@ +use std::{env, fs, io}; + +/** +初始化mit仓库 创建.mit/objects .mit/refs/heads .mit/HEAD +并设置 .mit 为隐藏文件夹 +无法重复初始化 +*/ +pub fn init() -> io::Result<()> { + let dir = env::current_dir()?; + let mit_dir = dir.join(".mit"); + if mit_dir.exists() { + println!("!Already a mit repo - [{}]", dir.display()); + return Ok(()); + } + + let dirs = [ + mit_dir.join("objects"), + mit_dir.join("refs/heads"), + ]; + // 创建 .git 目录和子目录 + for dir in &dirs { + fs::create_dir_all(dir)?; + } + fs::write(mit_dir.join("HEAD"), "ref: refs/heads/master\n")?; + + set_dir_hidden(&mit_dir.to_str().unwrap())?; // 设置目录隐藏 (跨平台) + println!("Initialized empty mit repository in {}", dir.display()); + Ok(()) +} + +#[cfg(target_os = "windows")] +fn set_dir_hidden(dir: &str) -> io::Result<()> { + use std::process::Command; + Command::new("attrib") + .arg("+H") + .arg(dir) + .spawn()? + .wait()?; // 等待命令执行完成 + Ok(()) +} + +#[cfg(target_os = "linux")] +fn set_dir_hidden(dir: &str) -> io::Result<()> { //linux下以'.'开头就已经是隐藏文件(夹)了 + Ok(()) +} \ No newline at end of file diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..639a6c5 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1 @@ +pub mod init; \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index dde4911..88f4974 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ // 不使用lib.rs的话,就无法在tests里引用到src中的模块 pub mod objects; -pub mod utils; \ No newline at end of file +pub mod utils; +pub mod commands; \ No newline at end of file