1use crate::response::InitResponse;
2use std::fs;
3use std::path::PathBuf;
4
5pub fn execute(bare: bool, path: Option<String>) -> Result<InitResponse, crate::errors::LitError> {
6 let repo_path = if let Some(p) = path {
7 PathBuf::from(p)
8 } else {
9 std::env::current_dir().map_err(|e| format!("Failed to get current directory: {}", e))?
10 };
11
12 if repo_path.join(".lit").exists() {
14 return Err(format!("Repository already exists at {}", repo_path.display()).into());
15 }
16
17 let lit_dir = repo_path.join(".lit");
19 fs::create_dir_all(&lit_dir).map_err(|e| format!("Failed to create .lit directory: {}", e))?;
20
21 fs::create_dir_all(lit_dir.join("objects"))
23 .map_err(|e| format!("Failed to create objects directory: {}", e))?;
24
25 fs::create_dir_all(lit_dir.join("refs").join("heads"))
26 .map_err(|e| format!("Failed to create refs/heads directory: {}", e))?;
27
28 fs::create_dir_all(lit_dir.join("refs").join("tags"))
29 .map_err(|e| format!("Failed to create refs/tags directory: {}", e))?;
30
31 fs::create_dir_all(lit_dir.join("refs").join("remotes"))
32 .map_err(|e| format!("Failed to create refs/remotes directory: {}", e))?;
33
34 if !bare {
36 fs::write(lit_dir.join("HEAD"), "ref: refs/heads/main\n")
37 .map_err(|e| format!("Failed to create HEAD: {}", e))?;
38 }
39
40 let config_content = if bare {
42 "[core]\n bare = true\n"
43 } else {
44 "[core]\n bare = false\n"
45 };
46
47 fs::write(lit_dir.join("config"), config_content)
48 .map_err(|e| format!("Failed to create config: {}", e))?;
49
50 fs::write(lit_dir.join("description"), "Unnamed Lit repository.\n")
52 .map_err(|e| format!("Failed to create description: {}", e))?;
53
54 use crate::storage::Index;
56 let index = Index::new();
57 index.save(&repo_path)?;
58
59 Ok(InitResponse {
60 path: lit_dir.display().to_string(),
61 bare,
62 })
63}