1use std::path::{Path, PathBuf};
2
3use crate::StoreError;
4
5#[derive(Debug, Clone)]
6pub struct RepoLayout {
7 root: PathBuf,
8}
9
10impl RepoLayout {
11 pub fn new(root: &Path) -> Self {
12 Self {
13 root: root.to_path_buf(),
14 }
15 }
16
17 pub fn root(&self) -> &Path {
18 &self.root
19 }
20
21 pub fn claw_dir(&self) -> PathBuf {
22 self.root.join(".claw")
23 }
24
25 pub fn objects_dir(&self) -> PathBuf {
26 self.claw_dir().join("objects")
27 }
28
29 pub fn refs_dir(&self) -> PathBuf {
30 self.claw_dir().join("refs")
31 }
32
33 pub fn config_file(&self) -> PathBuf {
34 self.claw_dir().join("repo.toml")
35 }
36
37 pub fn index_file(&self) -> PathBuf {
38 self.claw_dir().join("meta.db")
39 }
40
41 pub fn packs_dir(&self) -> PathBuf {
42 self.claw_dir().join("packs")
43 }
44
45 pub fn indices_dir(&self) -> PathBuf {
46 self.claw_dir().join("indices")
47 }
48
49 pub fn cache_dir(&self) -> PathBuf {
50 self.claw_dir().join("cache")
51 }
52
53 pub fn head_file(&self) -> PathBuf {
54 self.claw_dir().join("HEAD")
55 }
56
57 pub fn reflogs_dir(&self) -> PathBuf {
58 self.claw_dir().join("reflogs")
59 }
60
61 pub fn create_dirs(&self) -> Result<(), StoreError> {
62 std::fs::create_dir_all(self.objects_dir())?;
63 std::fs::create_dir_all(self.refs_dir().join("changes"))?;
64 std::fs::create_dir_all(self.refs_dir().join("intents"))?;
65 std::fs::create_dir_all(self.refs_dir().join("workstreams"))?;
66 std::fs::create_dir_all(self.refs_dir().join("heads"))?;
67 std::fs::create_dir_all(self.packs_dir())?;
68 std::fs::create_dir_all(self.indices_dir())?;
69 std::fs::create_dir_all(self.cache_dir())?;
70 std::fs::create_dir_all(self.reflogs_dir())?;
71 Ok(())
72 }
73}