Skip to main content

lit/commands/
init.rs

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    // Check if already a repository
13    if repo_path.join(".lit").exists() {
14        return Err(format!("Repository already exists at {}", repo_path.display()).into());
15    }
16
17    // Create .lit directory
18    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    // Create subdirectories
22    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    // Create HEAD
35    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    // Create config file
41    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    // Create description
51    fs::write(lit_dir.join("description"), "Unnamed Lit repository.\n")
52        .map_err(|e| format!("Failed to create description: {}", e))?;
53
54    // Create empty index
55    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}