summaryrefslogtreecommitdiffstats
path: root/vendor/gix-pack/src/bundle/find.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gix-pack/src/bundle/find.rs')
-rw-r--r--vendor/gix-pack/src/bundle/find.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/gix-pack/src/bundle/find.rs b/vendor/gix-pack/src/bundle/find.rs
new file mode 100644
index 000000000..d39ed49a9
--- /dev/null
+++ b/vendor/gix-pack/src/bundle/find.rs
@@ -0,0 +1,63 @@
+impl crate::Bundle {
+ /// Find an object with the given [`ObjectId`][gix_hash::ObjectId] and place its data into `out`.
+ ///
+ /// [`cache`][crate::cache::DecodeEntry] is used to accelerate the lookup.
+ ///
+ /// **Note** that ref deltas are automatically resolved within this pack only, which makes this implementation unusable
+ /// for thin packs, which by now are expected to be resolved already.
+ pub fn find<'a>(
+ &self,
+ id: impl AsRef<gix_hash::oid>,
+ out: &'a mut Vec<u8>,
+ cache: &mut impl crate::cache::DecodeEntry,
+ ) -> Result<Option<(gix_object::Data<'a>, crate::data::entry::Location)>, crate::data::decode::Error> {
+ let idx = match self.index.lookup(id) {
+ Some(idx) => idx,
+ None => return Ok(None),
+ };
+ self.get_object_by_index(idx, out, cache).map(Some)
+ }
+
+ /// Special-use function to get an object given an index previously returned from
+ /// internal_find_pack_index.
+ ///
+ /// # Panics
+ ///
+ /// If `index` is out of bounds.
+ pub fn get_object_by_index<'a>(
+ &self,
+ idx: u32,
+ out: &'a mut Vec<u8>,
+ cache: &mut impl crate::cache::DecodeEntry,
+ ) -> Result<(gix_object::Data<'a>, crate::data::entry::Location), crate::data::decode::Error> {
+ let ofs = self.index.pack_offset_at_index(idx);
+ let pack_entry = self.pack.entry(ofs);
+ let header_size = pack_entry.header_size();
+ self.pack
+ .decode_entry(
+ pack_entry,
+ out,
+ |id, _out| {
+ self.index.lookup(id).map(|idx| {
+ crate::data::decode::entry::ResolvedBase::InPack(
+ self.pack.entry(self.index.pack_offset_at_index(idx)),
+ )
+ })
+ },
+ cache,
+ )
+ .map(move |r| {
+ (
+ gix_object::Data {
+ kind: r.kind,
+ data: out.as_slice(),
+ },
+ crate::data::entry::Location {
+ pack_id: self.pack.id,
+ pack_offset: ofs,
+ entry_size: r.compressed_size + header_size,
+ },
+ )
+ })
+ }
+}