History

generalize extension writing so that writing more will be easier

Sebastian Thiel committed 4 years ago

Commit 8ef53781 parent 18b722e2 files · +29 −15Browse files

Unified · Split

2 files
  1. git-index/src/extension/end_of_index_entry/write.rs +2 −2
  2. git-index/src/write.rs +27 −13
git-index/src/extension/end_of_index_entry/write.rs+2−2
@@ -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())?;
git-index/src/write.rs+27−13
@@ -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_extension67 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(())