pub struct CommitGraphChain { /* private fields */ }Expand description
Loaded commit-graph chain (newest layer first, matching commit-graph-chain file order).
Implementations§
Source§impl CommitGraphChain
impl CommitGraphChain
Sourcepub fn from_bytes(bytes: Vec<u8>) -> Result<Self, Error>
pub fn from_bytes(bytes: Vec<u8>) -> Result<Self, Error>
Parse a complete, self-contained commit-graph file held in memory.
bytes is what Git stores at objects/info/commit-graph, for example the output of
crate::maintenance::build_commit_graph that a custom object store persisted in its
own storage. Attach the result with
OdbBuilder::commit_graph so history walks
read parents, committer dates, generation numbers and changed-path Bloom filters from
it instead of reading commit objects.
The file is fully verified (trailing checksum, chunk table, object id order, parent positions). It is not checked against any object store: every commit it lists must exist in the store it is attached to.
§Errors
Returns Error::CorruptObject when the bytes are not a valid commit-graph file, or
when the file is one layer of a split chain (it names base graphs it depends on).
Sourcepub fn top_layer_bloom_settings(&self) -> Option<BloomFilterSettings>
pub fn top_layer_bloom_settings(&self) -> Option<BloomFilterSettings>
Bloom settings from the newest layer, if that layer carries Bloom data.
Sourcepub fn total_commits(&self) -> u32
pub fn total_commits(&self) -> u32
Total commits across all layers (Git num_commits_in_base offset for new layers).
Sourcepub fn layer_paths_oldest_first(&self) -> Vec<PathBuf>
pub fn layer_paths_oldest_first(&self) -> Vec<PathBuf>
Layer file paths from oldest base to newest (reverse of chain file order).
Sourcepub fn num_layers(&self) -> usize
pub fn num_layers(&self) -> usize
Number of layers in the chain.
Sourcepub fn layer_commit_counts_tip_first(&self) -> Vec<u32>
pub fn layer_commit_counts_tip_first(&self) -> Vec<u32>
Commit counts per layer, tip-first (layer 0 is the newest tip).
Sourcepub fn layer_has_generation_data_tip_first(&self) -> Vec<bool>
pub fn layer_has_generation_data_tip_first(&self) -> Vec<bool>
Whether each layer carries a generation-data (GDA2) chunk, tip-first.
Sourcepub fn layer_hashes_tip_first(&self) -> Vec<String>
pub fn layer_hashes_tip_first(&self) -> Vec<String>
Layer hex hashes (from graph-<hash>.graph file stem), tip-first.
Sourcepub fn layer_object_dirs_tip_first(&self) -> Vec<PathBuf>
pub fn layer_object_dirs_tip_first(&self) -> Vec<PathBuf>
Source object directory each layer was loaded from (its .git/objects),
tip-first. Derived from the layer path: <objdir>/info/commit-graphs/graph-*.graph
or <objdir>/info/commit-graph.
Sourcepub fn sub_chain_tip_first(&self, start: usize, end: usize) -> Option<Self>
pub fn sub_chain_tip_first(&self, start: usize, end: usize) -> Option<Self>
A sub-chain made of the layers at tip-first indices start..end
(so start becomes the new tip). Used by the writer when only some base
layers are kept after a split merge.
Sourcepub fn layer_oids(&self, tip_first_idx: usize) -> Vec<ObjectId>
pub fn layer_oids(&self, tip_first_idx: usize) -> Vec<ObjectId>
All commit OIDs in one layer (by tip-first index), in lexicographic order.
Sourcepub fn try_load(objects_dir: &Path) -> Result<Option<Self>, Error>
pub fn try_load(objects_dir: &Path) -> Result<Option<Self>, Error>
Load from objects/info/commit-graph or objects/info/commit-graphs/commit-graph-chain.
Returns Ok(None) when no commit-graph exists. Corrupt graphs (including invalid GDO2)
return Err.
Sourcepub fn try_load_with_caches(
objects_dir: &Path,
caches: Option<&RepoCaches>,
) -> Result<Option<Self>, Error>
pub fn try_load_with_caches( objects_dir: &Path, caches: Option<&RepoCaches>, ) -> Result<Option<Self>, Error>
Load a commit-graph chain, deduplicating warnings through caches when provided.
Sourcepub fn load(objects_dir: &Path) -> Option<Self>
pub fn load(objects_dir: &Path) -> Option<Self>
Like Self::try_load but ignores parse errors (returns None).
Sourcepub fn verify_on_disk(objects_dir: &Path) -> Result<(), Error>
pub fn verify_on_disk(objects_dir: &Path) -> Result<(), Error>
Full commit-graph verification (checksum, OID order, generation/parent checks).
Mirrors git commit-graph verify — used by fsck, not the hot read path.
§Errors
Returns Error::CorruptObject when any layer fails verification.
Sourcepub fn try_load_across(
objects_dir: &Path,
alt_dirs: &[PathBuf],
) -> Result<Option<Self>, Error>
pub fn try_load_across( objects_dir: &Path, alt_dirs: &[PathBuf], ) -> Result<Option<Self>, Error>
Load a split commit-graph chain that may live in (and reference layers across) an alternate object directory.
Git’s commit-graph chain is owned by exactly one object directory, but its layer
graph-<hash>.graph files may be split between that directory and the alternate(s) it
inherits from. This is the situation created by a local clone whose info/alternates
points at a source repository that already has a split chain: a new commit-graph write --split produces a chain file (in the local object dir) that lists the alternate’s base
layer hashes followed by the locally-written tip layer.
The chain file itself is taken from objects_dir if present, otherwise from the first
alt_dirs entry that has one. Each referenced graph-<hash>.graph layer is then resolved
by searching objects_dir first and each alternate in turn.
§Parameters
objects_dir: the primary object directory (e.g. the local.git/objects).alt_dirs: alternate object directories, in search order.
§Returns
Ok(None) when no chain/single graph is found in any directory; Ok(Some(_)) on success.
§Errors
Returns an error if a referenced layer file is missing/unreadable or fails to parse.
Sourcepub fn try_load_across_with_caches(
objects_dir: &Path,
alt_dirs: &[PathBuf],
caches: Option<&RepoCaches>,
) -> Result<Option<Self>, Error>
pub fn try_load_across_with_caches( objects_dir: &Path, alt_dirs: &[PathBuf], caches: Option<&RepoCaches>, ) -> Result<Option<Self>, Error>
Like Self::try_load_across but reuses parsed commit-graph caches when provided.
§Errors
Returns an error if a referenced layer file is missing, unreadable, or fails to parse.
Sourcepub fn existing_filter_bytes(
&self,
oid: &ObjectId,
want: &BloomFilterSettings,
) -> Option<Vec<u8>>
pub fn existing_filter_bytes( &self, oid: &ObjectId, want: &BloomFilterSettings, ) -> Option<Vec<u8>>
Existing changed-path Bloom filter bytes for oid, if present in any layer
whose Bloom settings are compatible with want. Returns Some(bytes) (possibly
empty for an empty/no-change filter) when the filter can be reused verbatim, or
None when no compatible filter exists. Used by the writer to backfill / reuse
already-computed filters (Git counts these as filter_not_computed).
Sourcepub fn upgradable_filter_bytes(
&self,
oid: &ObjectId,
want: &BloomFilterSettings,
) -> Option<Vec<u8>>
pub fn upgradable_filter_bytes( &self, oid: &ObjectId, want: &BloomFilterSettings, ) -> Option<Vec<u8>>
Existing non-empty filter bytes for oid whose stored hash_version
differs from want.hash_version but is otherwise compatible (same
num_hashes/bits_per_entry). Used to detect filters that may be
upgraded (relabeled to the new version without recomputation) when the
changed paths contain no high-bit bytes.
Sourcepub fn find_commit(&self, oid: &ObjectId) -> Option<(usize, u32)>
pub fn find_commit(&self, oid: &ObjectId) -> Option<(usize, u32)>
Lexicographic position in the full chain, or None if not in any layer.
Sourcepub fn global_position(&self, oid: &ObjectId) -> Option<u32>
pub fn global_position(&self, oid: &ObjectId) -> Option<u32>
Global commit-graph position (Git graph_pos): base layers first, then newer layers.
Sourcepub fn graph_commit(&self, oid: &ObjectId) -> Option<(Vec<ObjectId>, i64)>
pub fn graph_commit(&self, oid: &ObjectId) -> Option<(Vec<ObjectId>, i64)>
Commit parents and committer time read straight from the commit-graph file
(no object decompression). Returns None when oid is not in the graph.
Sourcepub fn commit_generation_for_walk(&self, oid: &ObjectId) -> u64
pub fn commit_generation_for_walk(&self, oid: &ObjectId) -> u64
Generation number for ordering merge-base walks (2^63-1 when unknown).
Sourcepub fn parent_global_positions(&self, oid: &ObjectId) -> Option<Vec<u32>>
pub fn parent_global_positions(&self, oid: &ObjectId) -> Option<Vec<u32>>
Parent commit positions in global graph order (CDAT + EXTRA_EDGES), or None if oid
is not in the chain.
Sourcepub fn count_reachable_commits(
&self,
tips: &[ObjectId],
hide: &[ObjectId],
first_parent_only: bool,
shallow: &HashSet<ObjectId>,
) -> Option<usize>
pub fn count_reachable_commits( &self, tips: &[ObjectId], hide: &[ObjectId], first_parent_only: bool, shallow: &HashSet<ObjectId>, ) -> Option<usize>
Count commits reachable from tips minus those reachable from hide, using only
commit-graph parent links (no object reads). Returns None when any tip is missing
from the graph or parent data cannot be decoded from the file.
Sourcepub fn all_oids_in_order(&self) -> Vec<ObjectId>
pub fn all_oids_in_order(&self) -> Vec<ObjectId>
All commit OIDs in the chain (oldest base first, then newer layers).