use crate::data::Entry; const _TYPE_EXT1: u8 = 0; const COMMIT: u8 = 1; const TREE: u8 = 2; const BLOB: u8 = 3; const TAG: u8 = 4; const _TYPE_EXT2: u8 = 5; const OFS_DELTA: u8 = 6; const REF_DELTA: u8 = 7; /// A way to uniquely identify the location of an entry within a pack bundle #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct Location { /// The id of the pack containing the object. It's unique within its frame of reference which is the owning object database. pub pack_id: u32, /// The size of the entry of disk so that the range of bytes of the entry is `pack_offset..pack_offset + entry_size`. pub entry_size: usize, /// The start of the entry in the pack identified by `pack_id`. pub pack_offset: data::Offset, } impl Location { /// Compute a range suitable for lookup in pack data using the [`entry_slice()`][crate::data::File::entry_slice()] method. pub fn entry_range(&self, pack_offset: data::Offset) -> crate::data::EntryRange { pack_offset..pack_offset + self.entry_size as u64 } } /// Access impl Entry { /// Compute the pack offset to the base entry of the object represented by this entry. pub fn base_pack_offset(&self, distance: u64) -> data::Offset { let pack_offset = self.data_offset - self.header_size() as u64; pack_offset.checked_sub(distance).expect("in-bound distance of deltas") } /// The pack offset at which this entry starts pub fn pack_offset(&self) -> data::Offset { self.data_offset - self.header_size() as u64 } /// The amount of bytes used to describe this entry in the pack. The header starts at [`Self::pack_offset()`] pub fn header_size(&self) -> usize { self.header.size(self.decompressed_size) } } mod decode; mod header; pub use header::Header; use crate::data;