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 @@
1use failure::Error;1use failure::Error;
2use miniz_oxide::inflate::core::DecompressorOxide;2use miniz_oxide::inflate::core::DecompressorOxide;
3use std::io::Cursor;3use std::io::{self, Cursor};
4use miniz_oxide::inflate::{TINFLStatus,4use miniz_oxide::inflate::{TINFLStatus,
5 core::{decompress,5 core::{decompress,
6 inflate_flags::{TINFL_FLAG_HAS_MORE_INPUT,6 inflate_flags::{TINFL_FLAG_HAS_MORE_INPUT,
7 TINFL_FLAG_PARSE_ZLIB_HEADER,
7 TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF}}};8 TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF}}};
8use std::io;
9 9
10pub struct State {10pub struct State {
11 inner: DecompressorOxide,11 inner: DecompressorOxide,
@@ -26,34 +26,15 @@ impl State { · 14 unmodified lines
26 &mut self,26 &mut self,
27 input: &[u8],27 input: &[u8],
28 mut out: impl io::Write,28 mut out: impl io::Write,
29 flags: u32,
30 ) -> Result<(usize, usize), Error> {29 ) -> Result<(usize, usize), Error> {
31 let mut buf = [0; 1024];30 let mut buf = [0; 8192]; // as per git itself
32 let mut in_pos = 0;31 let mut in_pos = 0;
33 let mut out_pos = 0;32 let mut out_pos = 0;
34 loop {33 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 // };
45 let (status, in_consumed, out_consumed) = {34 let (status, in_consumed, out_consumed) = {
46 let mut c = Cursor::new(&mut buf[..]);35 let mut c = Cursor::new(&mut buf[..]);
47 self.once(&input[in_pos..], &mut c, flags)?36 self.once(&input[in_pos..], &mut c)?
48 };37 };
49 println!(
50 "in {} + {} of {}\nout {} + {}",
51 in_pos,
52 in_consumed,
53 input.len(),
54 out_pos,
55 out_consumed
56 );
57 out.write_all(&buf[..out_consumed])?;38 out.write_all(&buf[..out_consumed])?;
58 in_pos += in_consumed;39 in_pos += in_consumed;
59 out_pos += out_consumed;40 out_pos += out_consumed;
@@ -78,13 +59,13 @@ impl State { · 18 unmodified lines
78 &mut self,59 &mut self,
79 input: &[u8],60 input: &[u8],
80 out: &mut Cursor<&mut [u8]>,61 out: &mut Cursor<&mut [u8]>,
81 flags: u32,
82 ) -> Result<(TINFLStatus, usize, usize), Error> {62 ) -> Result<(TINFLStatus, usize, usize), Error> {
83 let (status, in_consumed, out_consumed) = decompress(63 let (status, in_consumed, out_consumed) = decompress(
84 &mut self.inner,64 &mut self.inner,
85 input,65 input,
86 out,66 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,
88 );69 );
89 70
90 use miniz_oxide::inflate::TINFLStatus::*;71 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
8use std::os::unix::fs::MetadataExt;8use std::os::unix::fs::MetadataExt;
9use deflate;9use deflate;
10use object::parsed;10use object::parsed;
11use miniz_oxide::inflate::core::inflate_flags::TINFL_FLAG_PARSE_ZLIB_HEADER;
12 11
13const HEADER_READ_COMPRESSED_BYTES: usize = 256;12const HEADER_READ_COMPRESSED_BYTES: usize = 256;
14const HEADER_READ_UNCOMPRESSED_BYTES: usize = 256;13const HEADER_READ_UNCOMPRESSED_BYTES: usize = 256;
@@ -37,27 +36,25 @@ impl Object { · 22 unmodified lines
37 let total_size = self.header_size + self.size;36 let total_size = self.header_size + self.size;
38 let cap = self.decompressed_data.capacity();37 let cap = self.decompressed_data.capacity();
39 if cap < total_size {38 if cap < total_size {
40 self.decompressed_data39 self.decompressed_data.reserve_exact(total_size - cap);
41 .reserve_exact(total_size - cap);
42 }40 }
43 unsafe {41 unsafe {
44 debug_assert!(self.decompressed_data.capacity() >= total_size);42 debug_assert!(self.decompressed_data.capacity() >= total_size);
45 self.decompressed_data.set_len(total_size);43 self.decompressed_data.set_len(total_size);
46 }44 }
47 println!("out capacity: {}", self.decompressed_data.len());
48 let mut cursor = Cursor::new(&mut self.decompressed_data[..]);45 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.
49 self.deflate = Default::default();49 self.deflate = Default::default();
50 let (consumed_in, consumed_out) = self.deflate.to_end(50 let (consumed_in, consumed_out) =
51 &self.compressed_data[..],51 self.deflate.to_end(&self.compressed_data[..], &mut cursor)?;
52 &mut cursor,
53 TINFL_FLAG_PARSE_ZLIB_HEADER,
54 )?;
55 debug_assert!(self.deflate.is_done);52 debug_assert!(self.deflate.is_done);
56 self.end_of_decompressed_bytes = consumed_out;53 self.end_of_decompressed_bytes = consumed_out;
57 self.end_of_consumed_compressed_bytes = consumed_in;54 self.end_of_consumed_compressed_bytes = consumed_in;
58 debug_assert!(self.end_of_decompressed_bytes == total_size);55 debug_assert!(self.end_of_decompressed_bytes == total_size);
59 }56 }
60 let bytes = &self.decompressed_data[..self.end_of_decompressed_bytes];57 let bytes = &self.decompressed_data[self.header_size..];
61 match self.kind {58 match self.kind {
62 Kind::Tag => parsed::Object::Tag(parsed::Tag::from_bytes(bytes)?),59 Kind::Tag => parsed::Object::Tag(parsed::Tag::from_bytes(bytes)?),
63 _ => unimplemented!(),60 _ => unimplemented!(),
@@ -129,11 +126,7 @@ impl Db { · 65 unmodified lines
129 126
130 (127 (
131 deflate128 deflate
132 .once(129 .once(&compressed[..bytes_read], &mut out)
133 &compressed[..bytes_read],
134 &mut out,
135 TINFL_FLAG_PARSE_ZLIB_HEADER,
136 )
137 .with_context(|_| {130 .with_context(|_| {
138 format!("ZIP inflating failed while reading '{}'", path.display())131 format!("ZIP inflating failed while reading '{}'", path.display())
139 })?,132 })?,
@@ -141,7 +134,6 @@ impl Db { · 1 unmodified line
141 istream,134 istream,
142 )135 )
143 };136 };
144 println!("{:?} = stauts", _status);
145 137
146 let (kind, size, header_size) =138 let (kind, size, header_size) =
147 parse::header(&decompressed[..consumed_out]).with_context(|_| {139 parse::header(&decompressed[..consumed_out]).with_context(|_| {
@@ -208,7 +200,7 @@ pub mod parse { · 60 unmodified lines
208 (Some(kind), Some(size)) => Ok((200 (Some(kind), Some(size)) => Ok((
209 object::Kind::from_bytes(kind)?,201 object::Kind::from_bytes(kind)?,
210 str::from_utf8(size)?.parse()?,202 str::from_utf8(size)?.parse()?,
211 header_end + 1 // account for 0 byte203 header_end + 1, // account for 0 byte
212 )),204 )),
213 _ => bail!("expected '<type> <size>'"),205 _ => bail!("expected '<type> <size>'"),
214 }206 }