mkit_cli/commands/
init.rs1use 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 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}