History

minor cleanup

Sebastian Thiel committed 8 years ago

Commit 4b7e9ee1 parent 5ef64852 files · +15 −42Browse files

Unified · Split

2 files
  1. lib/git-odb/src/deflate.rs +6 −25
  2. lib/git-odb/src/loose.rs +9 −17
lib/git-odb/src/deflate.rs+6−25
@@ -1,11 +1,11 @@
11 use failure::Error;
22 use miniz_oxide::inflate::core::DecompressorOxide;
3−use std::io::Cursor;
3+use std::io::{self, Cursor};
44 use miniz_oxide::inflate::{TINFLStatus,
55 core::{decompress,
66 inflate_flags::{TINFL_FLAG_HAS_MORE_INPUT,
7+ TINFL_FLAG_PARSE_ZLIB_HEADER,
78 TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF}}};
8−use std::io;
99
1010 pub struct State {
1111 inner: DecompressorOxide,
@@ -26,34 +26,15 @@ impl State { · 14 unmodified lines
2626 &mut self,
2727 input: &[u8],
2828 mut out: impl io::Write,
29− flags: u32,
3029 ) -> Result<(usize, usize), Error> {
31− let mut buf = [0; 1024];
30+ let mut buf = [0; 8192]; // as per git itself
3231 let mut in_pos = 0;
3332 let mut out_pos = 0;
3433 loop {
35− // let (status, in_consumed, out_consumed) = {
36− // let mut c = Cursor::new(&mut buf[..]);
37− // decompress(
38− // &mut self.inner,
39− // &input[in_pos..],
40− // &mut c,
41− // flags | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF
42− //
43− // )
44− // };
4534 let (status, in_consumed, out_consumed) = {
4635 let mut c = Cursor::new(&mut buf[..]);
47− self.once(&input[in_pos..], &mut c, flags)?
36+ self.once(&input[in_pos..], &mut c)?
4837 };
49− println!(
50− "in {} + {} of {}\nout {} + {}",
51− in_pos,
52− in_consumed,
53− input.len(),
54− out_pos,
55− out_consumed
56− );
5738 out.write_all(&buf[..out_consumed])?;
5839 in_pos += in_consumed;
5940 out_pos += out_consumed;
@@ -78,13 +59,13 @@ impl State { · 18 unmodified lines
7859 &mut self,
7960 input: &[u8],
8061 out: &mut Cursor<&mut [u8]>,
81− flags: u32,
8262 ) -> Result<(TINFLStatus, usize, usize), Error> {
8363 let (status, in_consumed, out_consumed) = decompress(
8464 &mut self.inner,
8565 input,
8666 out,
87− flags | TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF,
67+ TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_HAS_MORE_INPUT
68+ | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF,
8869 );
8970
9071 use miniz_oxide::inflate::TINFLStatus::*;
lib/git-odb/src/loose.rs+9−17
@@ -8,7 +8,6 @@ use std::{fs::File, io::{Cursor, Read}, path::PathBuf}; · 7 unmodified lines
88 use std::os::unix::fs::MetadataExt;
99 use deflate;
1010 use object::parsed;
11−use miniz_oxide::inflate::core::inflate_flags::TINFL_FLAG_PARSE_ZLIB_HEADER;
1211
1312 const HEADER_READ_COMPRESSED_BYTES: usize = 256;
1413 const HEADER_READ_UNCOMPRESSED_BYTES: usize = 256;
@@ -37,27 +36,25 @@ impl Object { · 22 unmodified lines
3736 let total_size = self.header_size + self.size;
3837 let cap = self.decompressed_data.capacity();
3938 if cap < total_size {
40− self.decompressed_data
41− .reserve_exact(total_size - cap);
39+ self.decompressed_data.reserve_exact(total_size - cap);
4240 }
4341 unsafe {
4442 debug_assert!(self.decompressed_data.capacity() >= total_size);
4543 self.decompressed_data.set_len(total_size);
4644 }
47− println!("out capacity: {}", self.decompressed_data.len());
4845 let mut cursor = Cursor::new(&mut self.decompressed_data[..]);
46+ // TODO Performance opportunity
47+ // here we do a lot of additional work, which could be saved if we
48+ // could re-use the previous state. This doesn't work for some reason.
4949 self.deflate = Default::default();
50− let (consumed_in, consumed_out) = self.deflate.to_end(
51− &self.compressed_data[..],
52− &mut cursor,
53− TINFL_FLAG_PARSE_ZLIB_HEADER,
54− )?;
50+ let (consumed_in, consumed_out) =
51+ self.deflate.to_end(&self.compressed_data[..], &mut cursor)?;
5552 debug_assert!(self.deflate.is_done);
5653 self.end_of_decompressed_bytes = consumed_out;
5754 self.end_of_consumed_compressed_bytes = consumed_in;
5855 debug_assert!(self.end_of_decompressed_bytes == total_size);
5956 }
60− let bytes = &self.decompressed_data[..self.end_of_decompressed_bytes];
57+ let bytes = &self.decompressed_data[self.header_size..];
6158 match self.kind {
6259 Kind::Tag => parsed::Object::Tag(parsed::Tag::from_bytes(bytes)?),
6360 _ => unimplemented!(),
@@ -129,11 +126,7 @@ impl Db { · 65 unmodified lines
129126
130127 (
131128 deflate
132− .once(
133− &compressed[..bytes_read],
134− &mut out,
135− TINFL_FLAG_PARSE_ZLIB_HEADER,
136− )
129+ .once(&compressed[..bytes_read], &mut out)
137130 .with_context(|_| {
138131 format!("ZIP inflating failed while reading '{}'", path.display())
139132 })?,
@@ -141,7 +134,6 @@ impl Db { · 1 unmodified line
141134 istream,
142135 )
143136 };
144− println!("{:?} = stauts", _status);
145137
146138 let (kind, size, header_size) =
147139 parse::header(&decompressed[..consumed_out]).with_context(|_| {
@@ -208,7 +200,7 @@ pub mod parse { · 60 unmodified lines
208200 (Some(kind), Some(size)) => Ok((
209201 object::Kind::from_bytes(kind)?,
210202 str::from_utf8(size)?.parse()?,
211− header_end + 1 // account for 0 byte
203+ header_end + 1, // account for 0 byte
212204 )),
213205 _ => bail!("expected '<type> <size>'"),
214206 }