1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
use std::{cell::RefCell, path::PathBuf};
use git_hash::ObjectId;
use crate::head;
/// The head reference, as created from looking at `.git/HEAD`, able to represent all of its possible states.
///
/// Note that like [`Reference`], this type's data is snapshot of persisted state on disk.
pub struct Head<'repo> {
/// One of various possible states for the HEAD reference
pub kind: head::Kind,
pub(crate) repo: &'repo crate::Repository,
}
/// An [ObjectId] with access to a repository.
#[derive(Clone, Copy)]
pub struct Id<'r> {
/// The actual object id
pub(crate) inner: ObjectId,
pub(crate) repo: &'r crate::Repository,
}
/// A decoded object with a reference to its owning repository.
pub struct Object<'repo> {
/// The id of the object
pub id: ObjectId,
/// The kind of the object
pub kind: git_object::Kind,
/// The fully decoded object data
pub data: Vec<u8>,
pub(crate) repo: &'repo crate::Repository,
}
impl<'a> Drop for Object<'a> {
fn drop(&mut self) {
self.repo.reuse_buffer(&mut self.data);
}
}
/// A decoded tree object with access to its owning repository.
pub struct Tree<'repo> {
/// The id of the tree
pub id: ObjectId,
/// The fully decoded tree data
pub data: Vec<u8>,
pub(crate) repo: &'repo crate::Repository,
}
impl<'a> Drop for Tree<'a> {
fn drop(&mut self) {
self.repo.reuse_buffer(&mut self.data);
}
}
/// A decoded tag object with access to its owning repository.
pub struct Tag<'repo> {
/// The id of the tree
pub id: ObjectId,
/// The fully decoded tag data
pub data: Vec<u8>,
pub(crate) repo: &'repo crate::Repository,
}
impl<'a> Drop for Tag<'a> {
fn drop(&mut self) {
self.repo.reuse_buffer(&mut self.data);
}
}
/// A decoded commit object with access to its owning repository.
pub struct Commit<'repo> {
/// The id of the commit
pub id: ObjectId,
/// The fully decoded commit data
pub data: Vec<u8>,
pub(crate) repo: &'repo crate::Repository,
}
impl<'a> Drop for Commit<'a> {
fn drop(&mut self) {
self.repo.reuse_buffer(&mut self.data);
}
}
/// A detached, self-contained object, without access to its source repository.
///
/// Use it if an `ObjectRef` should be sent over thread boundaries or stored in collections.
#[derive(Clone)]
pub struct DetachedObject {
/// The id of the object
pub id: ObjectId,
/// The kind of the object
pub kind: git_object::Kind,
/// The fully decoded object data
pub data: Vec<u8>,
}
/// A reference that points to an object or reference, with access to its source repository.
///
/// Note that these are snapshots and won't recognize if they are stale.
pub struct Reference<'r> {
/// The actual reference data
pub inner: git_ref::Reference,
pub(crate) repo: &'r crate::Repository,
}
/// A thread-local handle to interact with a repository from a single thread.
///
/// It is `Send` but **not** `Sync` - for the latter you can convert it `to_sync()`.
/// Note that it clones itself so that it is empty, requiring the user to configure each clone separately, specifically
/// and explicitly. This is to have the fastest-possible default configuration available by default, but allow
/// those who experiment with workloads to get speed boosts of 2x or more.
pub struct Repository {
/// A ref store with shared ownership (or the equivalent of it).
pub refs: crate::RefStore,
/// A way to access objects.
pub objects: crate::OdbHandle,
pub(crate) work_tree: Option<PathBuf>,
/// A free-list of re-usable object backing buffers
pub(crate) bufs: RefCell<Vec<Vec<u8>>>,
/// A pre-assembled selection of often-accessed configuration values for quick access.
pub(crate) config: crate::config::Cache,
}
/// An instance with access to everything a git repository entails, best imagined as container implementing `Sync + Send` for _most_
/// for system resources required to interact with a `git` repository which are loaded in once the instance is created.
///
/// Use this type to reference it in a threaded context for creation the creation of a thread-local [`Repositories`][crate::Repository].
///
/// Note that this type purposefully isn't very useful until it is converted into a thread-local repository with `to_thread_local()`,
/// it's merely meant to be able to exist in a `Sync` context.
pub struct ThreadSafeRepository {
/// A store for references to point at objects
pub refs: crate::RefStore,
/// A store for objects that contain data
#[cfg(feature = "unstable")]
pub objects: git_features::threading::OwnShared<git_odb::Store>,
#[cfg(not(feature = "unstable"))]
pub(crate) objects: git_features::threading::OwnShared<git_odb::Store>,
/// The path to the worktree at which to find checked out files
pub work_tree: Option<PathBuf>,
// TODO: git-config should be here - it's read a lot but not written much in must applications, so shouldn't be in `State`.
// Probably it's best reload it on signal (in servers) or refresh it when it's known to have been changed similar to how
// packs are refreshed. This would be `git_config::fs::Config` when ready.
pub(crate) config: crate::config::Cache,
}