fix(format): a group attribute set again replaces the earlier value

Setting a group or root attribute twice wrote two attribute messages with
the same name, and h5py read back the first value: set_attr("w", 1) then
set_attr("w", "two") read as 1. The later value now replaces the earlier
one, as `attrs[name] = v` does in h5py, including when a group is merged
from two builders.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
osobh
2026-09-26 08:35:16 -05:00
co-authored by Claude Opus 5.5
parent bd36fe883b
commit b0a1e4f9a6
3 changed files with 39 additions and 6 deletions
+6 -6
View File
@@ -229,14 +229,14 @@ impl Builder {
/// Merge a builder's attributes, setting and items into group `idx`.
fn merge_into(&mut self, idx: usize, gb: GroupBuilder) -> Result<(), FormatError> {
// An attribute set again (by this builder or a merged one) takes the
// new value, as assigning `attrs[name]` in h5py does.
for (name, value) in gb.attrs {
if self.groups[idx].attrs.iter().any(|(n, _)| *n == name) {
return Err(err(format!(
"attribute {name:?} set twice on {}",
self.groups[idx].path
)));
let attrs = &mut self.groups[idx].attrs;
match attrs.iter_mut().find(|(n, _)| *n == name) {
Some(slot) => slot.1 = value,
None => attrs.push((name, value)),
}
self.groups[idx].attrs.push((name, value));
}
if let Some(t) = gb.track_order {
match self.groups[idx].track_order {