History

Now with counting of consumed bytes in extensions (#293)

This leads to the first seemingly correct parsing of simple index files.

Sebastian Thiel committed 4 years ago

Commit 77a062c1 parent da556b02 files · +11 −4Browse files

Unified · Split

2 files
  1. git-index/src/decode.rs +3 −3
  2. git-index/src/extension/mod.rs +8 −1
git-index/src/decode.rs+3−3
@@ -318,9 +318,9 @@ fn read_u16(data: &[u8]) -> Option<(u16, &[u8])> { · 317 unmodified lines
318 318
319fn load_extensions(beginning_of_extensions: &[u8], object_hash: git_hash::Kind) -> (Extensions, &[u8]) {319fn load_extensions(beginning_of_extensions: &[u8], object_hash: git_hash::Kind) -> (Extensions, &[u8]) {
320 extension::Iter::new_without_checksum(beginning_of_extensions, object_hash)320 extension::Iter::new_without_checksum(beginning_of_extensions, object_hash)
321 .map(|mut extensions| {321 .map(|mut ext_iter| {
322 let mut ext = Extensions::default();322 let mut ext = Extensions::default();
323 for (signature, ext_data) in extensions.by_ref() {323 for (signature, ext_data) in ext_iter.by_ref() {
324 match signature {324 match signature {
325 extension::tree::SIGNATURE => {325 extension::tree::SIGNATURE => {
326 ext.cache_tree = extension::tree::decode(ext_data, object_hash);326 ext.cache_tree = extension::tree::decode(ext_data, object_hash);
@@ -329,7 +329,7 @@ fn load_extensions(beginning_of_extensions: &[u8], object_hash: git_hash::Kind) · 2 unmodified lines
329 _unknown => {} // skip unknown extensions, too329 _unknown => {} // skip unknown extensions, too
330 }330 }
331 }331 }
332 (ext, extensions.data)332 (ext, &beginning_of_extensions[ext_iter.consumed..])
333 })333 })
334 .unwrap_or_else(|| (Extensions::default(), beginning_of_extensions))334 .unwrap_or_else(|| (Extensions::default(), beginning_of_extensions))
335}335}
git-index/src/extension/mod.rs+8−1
@@ -81,6 +81,7 @@ mod iter { · 80 unmodified lines
81 pub fn new(data_at_beginning_of_extensions_and_truncated: &'a [u8]) -> Self {81 pub fn new(data_at_beginning_of_extensions_and_truncated: &'a [u8]) -> Self {
82 Iter {82 Iter {
83 data: data_at_beginning_of_extensions_and_truncated,83 data: data_at_beginning_of_extensions_and_truncated,
84 consumed: 0,
84 }85 }
85 }86 }
86 87
@@ -93,6 +94,7 @@ mod iter { · 6 unmodified lines
93 .checked_sub(object_hash.len_in_bytes())?;94 .checked_sub(object_hash.len_in_bytes())?;
94 Iter {95 Iter {
95 data: &data_at_beginning_of_extensions[..end],96 data: &data_at_beginning_of_extensions[..end],
97 consumed: 0,
96 }98 }
97 .into()99 .into()
98 }100 }
@@ -108,11 +110,15 @@ mod iter { · 9 unmodified lines
108 110
109 let (signature, data) = self.data.split_at(4);111 let (signature, data) = self.data.split_at(4);
110 let (size, data) = data.split_at(4);112 let (size, data) = data.split_at(4);
113 self.data = data;
114 self.consumed += 4 + 4;
115
111 let size = from_be_u32(size) as usize;116 let size = from_be_u32(size) as usize;
112 117
113 match data.get(..size) {118 match data.get(..size) {
114 Some(ext_data) => {119 Some(ext_data) => {
115 self.data = &data[size..];120 self.data = &data[size..];
121 self.consumed += size;
116 Some((signature.try_into().unwrap(), ext_data))122 Some((signature.try_into().unwrap(), ext_data))
117 }123 }
118 None => {124 None => {
@@ -125,5 +131,6 @@ mod iter { · 6 unmodified lines
125}131}
126 132
127pub struct Iter<'a> {133pub struct Iter<'a> {
128 pub data: &'a [u8],134 data: &'a [u8],
135 pub consumed: usize,
129}136}