summaryrefslogtreecommitdiffstats
path: root/vendor/gix-pack/src/index/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gix-pack/src/index/util.rs')
-rw-r--r--vendor/gix-pack/src/index/util.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/vendor/gix-pack/src/index/util.rs b/vendor/gix-pack/src/index/util.rs
new file mode 100644
index 000000000..284ee6158
--- /dev/null
+++ b/vendor/gix-pack/src/index/util.rs
@@ -0,0 +1,47 @@
+use std::{io, time::Instant};
+
+use gix_features::progress::{self, Progress};
+
+pub(crate) fn index_entries_sorted_by_offset_ascending(
+ idx: &crate::index::File,
+ mut progress: impl Progress,
+) -> Vec<crate::index::Entry> {
+ progress.init(Some(idx.num_objects as usize), progress::count("entries"));
+ let start = Instant::now();
+
+ let mut v = Vec::with_capacity(idx.num_objects as usize);
+ for entry in idx.iter() {
+ v.push(entry);
+ progress.inc();
+ }
+ v.sort_by_key(|e| e.pack_offset);
+
+ progress.show_throughput(start);
+ v
+}
+
+pub(crate) struct Count<W> {
+ pub bytes: u64,
+ pub inner: W,
+}
+
+impl<W> Count<W> {
+ pub fn new(inner: W) -> Self {
+ Count { bytes: 0, inner }
+ }
+}
+
+impl<W> io::Write for Count<W>
+where
+ W: io::Write,
+{
+ fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+ let written = self.inner.write(buf)?;
+ self.bytes += written as u64;
+ Ok(written)
+ }
+
+ fn flush(&mut self) -> io::Result<()> {
+ self.inner.flush()
+ }
+}