Skip to main content

mkit_cli/commands/
init.rs

1//! `mkit init` — create a fresh repository rooted at the current dir.
2
3use std::io::Write;
4use std::path::Path;
5
6use clap::Parser;
7use mkit_core::refs;
8use mkit_core::store::{ObjectStore, StoreError};
9
10use crate::clap_shim;
11use crate::exit;
12
13#[derive(Debug, Parser)]
14#[command(
15    name = "mkit init",
16    about = "Create a new mkit repository in the current directory."
17)]
18struct InitOpts {}
19
20#[must_use]
21pub fn run(args: &[String]) -> u8 {
22    if let Err(code) = clap_shim::parse::<InitOpts>("mkit init", args) {
23        return code;
24    }
25    let cwd = match std::env::current_dir() {
26        Ok(p) => p,
27        Err(e) => return emit_err(&format!("cannot read cwd: {e}"), exit::NOINPUT),
28    };
29    match ObjectStore::init(&cwd) {
30        Ok(_) => {}
31        Err(StoreError::AlreadyInitialized) => {
32            return emit_err("already a mkit repository", exit::GENERAL_ERROR);
33        }
34        Err(e) => return emit_err(&format!("init failed: {e}"), exit::CANTCREAT),
35    }
36    // Initialize refs + HEAD — HEAD points at refs/heads/main.
37    if let Err(e) = refs::init(&cwd.join(mkit_core::MKIT_DIR)) {
38        return emit_err(&format!("refs init failed: {e}"), exit::CANTCREAT);
39    }
40    let mut stderr = std::io::stderr().lock();
41    let _ = writeln!(
42        stderr,
43        "initialized empty mkit repository in {}/.mkit/",
44        display(&cwd)
45    );
46    exit::OK
47}
48
49fn display(p: &Path) -> String {
50    p.display().to_string()
51}
52
53fn emit_err(msg: &str, code: u8) -> u8 {
54    let mut stderr = std::io::stderr().lock();
55    let _ = writeln!(stderr, "error: {msg}");
56    code
57}