Function git_features::progress::bytes
source · Available on crate feature
progress
only.Expand description
A unit for displaying bytes with throughput and progress percentage.
Examples found in repository?
src/hash.rs (line 125)
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
pub fn bytes(
mut read: impl std::io::Read,
num_bytes_from_start: usize,
kind: git_hash::Kind,
progress: &mut impl crate::progress::Progress,
should_interrupt: &std::sync::atomic::AtomicBool,
) -> std::io::Result<git_hash::ObjectId> {
let mut hasher = hasher(kind);
let start = std::time::Instant::now();
// init progress before the possibility for failure, as convenience in case people want to recover
progress.init(Some(num_bytes_from_start), crate::progress::bytes());
const BUF_SIZE: usize = u16::MAX as usize;
let mut buf = [0u8; BUF_SIZE];
let mut bytes_left = num_bytes_from_start;
while bytes_left > 0 {
let out = &mut buf[..BUF_SIZE.min(bytes_left)];
read.read_exact(out)?;
bytes_left -= out.len();
progress.inc_by(out.len());
hasher.update(out);
if should_interrupt.load(std::sync::atomic::Ordering::SeqCst) {
return Err(std::io::Error::new(std::io::ErrorKind::Other, "Interrupted"));
}
}
let id = git_hash::ObjectId::from(hasher.digest());
progress.show_throughput(start);
Ok(id)
}