Fix bug when packing files smaller than 16 bytes
Git's packfile format, requires an extra empty byte to be written, even
if the full file size can be packed into what is left of the previous 8
bits.
Diff
src/low_level.rs | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
@@ -251,7 +251,7 @@ impl PackFileEntry {
}
while size != 0 {
loop {
#[allow(clippy::cast_possible_truncation)] let mut val = (size & 0b111_1111) as u8;
@@ -264,6 +264,10 @@ impl PackFileEntry {
}
buf.put_u8(val);
if size == 0 {
break;
}
}
}
@@ -349,3 +353,31 @@ impl PackFileEntry {
Ok(sha1::Sha1::digest(&out).into())
}
}
#[cfg(test)]
mod test {
mod packfile_entry {
use bytes::{Bytes, BytesMut};
use crate::low_level::PackFileEntry;
#[test]
fn header_size_bytes_large() {
let entry = PackFileEntry::Blob(Bytes::from(vec![0u8; 16]));
let mut header = BytesMut::new();
entry.write_header(&mut header);
assert_eq!(header.to_vec(), &[0xb0, 0x01]);
}
#[test]
fn header_size_bytes_small() {
let entry = PackFileEntry::Blob(Bytes::from(vec![0u8; 15]));
let mut header = BytesMut::new();
entry.write_header(&mut header);
assert_eq!(header.to_vec(), &[0xbf, 0x00]);
}
}
}