Skip to main content

claw_store/
layout.rs

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}