Unified · Split
| @@ -11,7 +11,7 @@ pub fn write_to( · 10 unmodified lines | |||
| 11 | out: &mut impl std::io::Write, | 11 | out: &mut impl std::io::Write, |
| 12 | hash_kind: git_hash::Kind, | 12 | hash_kind: git_hash::Kind, |
| 13 | offset_to_extensions: u32, | 13 | offset_to_extensions: u32, |
| 14 | prior_extensions: &[(Signature, u32)], | 14 | prior_extensions: impl Iterator<Item = (Signature, u32)>, |
| 15 | ) -> Result<(), std::io::Error> { | 15 | ) -> Result<(), std::io::Error> { |
| 16 | out.write_all(&SIGNATURE)?; | 16 | out.write_all(&SIGNATURE)?; |
| 17 | let extension_size: u32 = 4 + hash_kind.len_in_bytes() as u32; | 17 | let extension_size: u32 = 4 + hash_kind.len_in_bytes() as u32; |
| @@ -21,7 +21,7 @@ pub fn write_to( · 3 unmodified lines | |||
| 21 | 21 | ||
| 22 | let mut hasher = git_features::hash::hasher(hash_kind); | 22 | let mut hasher = git_features::hash::hasher(hash_kind); |
| 23 | for (signature, size) in prior_extensions { | 23 | for (signature, size) in prior_extensions { |
| 24 | hasher.update(signature); | 24 | hasher.update(&signature); |
| 25 | hasher.update(&size.to_be_bytes()); | 25 | hasher.update(&size.to_be_bytes()); |
| 26 | } | 26 | } |
| 27 | out.write_all(&hasher.digest())?; | 27 | out.write_all(&hasher.digest())?; |
| @@ -63,21 +63,35 @@ impl State { · 62 unmodified lines | |||
| 63 | let offset_to_entries = header(&mut write, version, num_entries)?; | 63 | let offset_to_entries = header(&mut write, version, num_entries)?; |
| 64 | let offset_to_extensions = entries(&mut write, self, offset_to_entries)?; | 64 | let offset_to_extensions = entries(&mut write, self, offset_to_entries)?; |
| 65 | 65 | ||
| 66 | let mut extensions = Vec::with_capacity(5); | 66 | let extensions = { |
| 67 | if let Some(offset_past_tree_ext) = tree_cache_extension | 67 | let extensions: &[&dyn Fn(&mut dyn std::io::Write) -> Option<std::io::Result<extension::Signature>>] = |
| 68 | .then(|| self.tree()) | 68 | &[&|write| { |
| 69 | .flatten() | 69 | tree_cache_extension |
| 70 | .map(|tree| tree.write_to(&mut write).map(|_| write.count)) | 70 | .then(|| self.tree()) |
| 71 | .transpose()? | 71 | .flatten() |
| 72 | { | 72 | .map(|tree| tree.write_to(write).map(|_| extension::tree::SIGNATURE)) |
| 73 | extensions.push(( | 73 | }]; |
| 74 | extension::tree::SIGNATURE, | 74 | |
| 75 | offset_past_tree_ext - offset_to_extensions - (extension::MIN_SIZE as u32), | 75 | let mut offset_to_previous_ext = offset_to_extensions; |
| 76 | )); | 76 | let mut out = Vec::with_capacity(5); |
| 77 | } | 77 | for write_ext in extensions { |
| 78 | if let Some(signature) = write_ext(&mut write).transpose()? { | ||
| 79 | let offset_past_ext = write.count; | ||
| 80 | let ext_size = offset_past_ext - offset_to_previous_ext - (extension::MIN_SIZE as u32); | ||
| 81 | offset_to_previous_ext = offset_past_ext; | ||
| 82 | out.push((signature, ext_size)); | ||
| 83 | } | ||
| 84 | } | ||
| 85 | out | ||
| 86 | }; | ||
| 78 | 87 | ||
| 79 | if num_entries > 0 && end_of_index_entry_extension && !extensions.is_empty() { | 88 | if num_entries > 0 && end_of_index_entry_extension && !extensions.is_empty() { |
| 80 | extension::end_of_index_entry::write_to(write.inner, hash_kind, offset_to_extensions, &extensions)? | 89 | extension::end_of_index_entry::write_to( |
| 90 | write.inner, | ||
| 91 | hash_kind, | ||
| 92 | offset_to_extensions, | ||
| 93 | extensions.into_iter(), | ||
| 94 | )? | ||
| 81 | } | 95 | } |
| 82 | 96 | ||
| 83 | Ok(()) | 97 | Ok(()) |