claw-vcs-store 0.1.1

Content-addressed object storage, refs, and snapshot support for Claw VCS.
Documentation
use std::path::{Path, PathBuf};

use crate::StoreError;

#[derive(Debug, Clone)]
pub struct RepoLayout {
    root: PathBuf,
}

impl RepoLayout {
    pub fn new(root: &Path) -> Self {
        Self {
            root: root.to_path_buf(),
        }
    }

    pub fn root(&self) -> &Path {
        &self.root
    }

    pub fn claw_dir(&self) -> PathBuf {
        self.root.join(".claw")
    }

    pub fn objects_dir(&self) -> PathBuf {
        self.claw_dir().join("objects")
    }

    pub fn refs_dir(&self) -> PathBuf {
        self.claw_dir().join("refs")
    }

    pub fn config_file(&self) -> PathBuf {
        self.claw_dir().join("repo.toml")
    }

    pub fn index_file(&self) -> PathBuf {
        self.claw_dir().join("meta.db")
    }

    pub fn packs_dir(&self) -> PathBuf {
        self.claw_dir().join("packs")
    }

    pub fn indices_dir(&self) -> PathBuf {
        self.claw_dir().join("indices")
    }

    pub fn cache_dir(&self) -> PathBuf {
        self.claw_dir().join("cache")
    }

    pub fn head_file(&self) -> PathBuf {
        self.claw_dir().join("HEAD")
    }

    pub fn reflogs_dir(&self) -> PathBuf {
        self.claw_dir().join("reflogs")
    }

    pub fn create_dirs(&self) -> Result<(), StoreError> {
        std::fs::create_dir_all(self.objects_dir())?;
        std::fs::create_dir_all(self.refs_dir().join("changes"))?;
        std::fs::create_dir_all(self.refs_dir().join("intents"))?;
        std::fs::create_dir_all(self.refs_dir().join("workstreams"))?;
        std::fs::create_dir_all(self.refs_dir().join("heads"))?;
        std::fs::create_dir_all(self.packs_dir())?;
        std::fs::create_dir_all(self.indices_dir())?;
        std::fs::create_dir_all(self.cache_dir())?;
        std::fs::create_dir_all(self.reflogs_dir())?;
        Ok(())
    }
}