use std::{cell::RefCell, path::PathBuf};
use git_hash::ObjectId;
use crate::{head, remote};
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum Kind {
Submodule,
Bare,
WorkTree {
is_linked: bool,
},
}
pub struct Worktree<'repo> {
pub(crate) parent: &'repo Repository,
pub(crate) path: &'repo std::path::Path,
}
#[derive(Clone)]
pub struct Head<'repo> {
pub kind: head::Kind,
pub(crate) repo: &'repo Repository,
}
#[derive(Clone, Copy)]
pub struct Id<'r> {
pub(crate) inner: ObjectId,
pub(crate) repo: &'r Repository,
}
pub struct Object<'repo> {
pub id: ObjectId,
pub kind: git_object::Kind,
pub data: Vec<u8>,
pub(crate) repo: &'repo Repository,
}
impl<'a> Drop for Object<'a> {
fn drop(&mut self) {
self.repo.reuse_buffer(&mut self.data);
}
}
pub struct Tree<'repo> {
pub id: ObjectId,
pub data: Vec<u8>,
pub(crate) repo: &'repo Repository,
}
impl<'a> Drop for Tree<'a> {
fn drop(&mut self) {
self.repo.reuse_buffer(&mut self.data);
}
}
pub struct Tag<'repo> {
pub id: ObjectId,
pub data: Vec<u8>,
pub(crate) repo: &'repo Repository,
}
impl<'a> Drop for Tag<'a> {
fn drop(&mut self) {
self.repo.reuse_buffer(&mut self.data);
}
}
pub struct Commit<'repo> {
pub id: ObjectId,
pub data: Vec<u8>,
pub(crate) repo: &'repo Repository,
}
impl<'a> Drop for Commit<'a> {
fn drop(&mut self) {
self.repo.reuse_buffer(&mut self.data);
}
}
#[derive(Clone)]
pub struct ObjectDetached {
pub id: ObjectId,
pub kind: git_object::Kind,
pub data: Vec<u8>,
}
#[derive(Clone)]
pub struct Reference<'r> {
pub inner: git_ref::Reference,
pub(crate) repo: &'r Repository,
}
pub struct Repository {
pub refs: crate::RefStore,
pub objects: crate::OdbHandle,
pub(crate) work_tree: Option<PathBuf>,
pub(crate) common_dir: Option<PathBuf>,
pub(crate) bufs: RefCell<Vec<Vec<u8>>>,
pub(crate) config: crate::config::Cache,
pub(crate) options: crate::open::Options,
pub(crate) index: crate::worktree::IndexStorage,
}
pub struct ThreadSafeRepository {
pub refs: crate::RefStore,
pub objects: git_features::threading::OwnShared<git_odb::Store>,
pub work_tree: Option<PathBuf>,
pub common_dir: Option<PathBuf>,
pub(crate) config: crate::config::Cache,
pub(crate) linked_worktree_options: crate::open::Options,
pub(crate) index: crate::worktree::IndexStorage,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Remote<'repo> {
pub(crate) name: Option<remote::Name<'static>>,
pub(crate) url: Option<git_url::Url>,
pub(crate) url_alias: Option<git_url::Url>,
pub(crate) push_url: Option<git_url::Url>,
pub(crate) push_url_alias: Option<git_url::Url>,
pub(crate) fetch_specs: Vec<git_refspec::RefSpec>,
pub(crate) push_specs: Vec<git_refspec::RefSpec>,
pub(crate) fetch_tags: remote::fetch::Tags,
pub(crate) repo: &'repo Repository,
}