From 18d209be7569eb55ad056b095de932f0a28689f8 Mon Sep 17 00:00:00 2001 From: datdenkikniet Date: Thu, 26 Mar 2026 18:51:09 +0100 Subject: [PATCH 1/2] misc(tree/peel_to_entry): remove confusing map() --- gix/src/object/tree/mod.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/gix/src/object/tree/mod.rs b/gix/src/object/tree/mod.rs index d5c4b1792..a283fbc00 100644 --- a/gix/src/object/tree/mod.rs +++ b/gix/src/object/tree/mod.rs @@ -129,23 +129,27 @@ impl<'repo> Tree<'repo> { res } ControlFlow::Break(entry) => { - let mapped = entry.map(|e| Entry { - inner: e.into(), - repo: self.repo, - }); - if let Some(entry) = &mapped { - if entry.mode().is_tree() { - let id = entry.object_id(); - self.repo.find(&id, &mut self.data)?; + let entry = if let Some(e) = entry { + let inner = e.into(); + + if e.mode.is_tree() { + let id = e.oid.to_owned(); data_id = id; + self.repo.find(&id, &mut self.data)?; self.id = data_id; } - } + + Some(Entry { inner, repo: self.repo }) + } else { + None + }; + if data_id != self.id { // Ensure that our data always matches our id, even if this means an extra lookup. self.repo.find(&self.id, &mut self.data)?; } - break Ok(mapped); + + break Ok(entry); } } } From cb7d0883560e2b484729b3fb27462337fa97f927 Mon Sep 17 00:00:00 2001 From: datdenkikniet Date: Thu, 26 Mar 2026 19:12:23 +0100 Subject: [PATCH 2/2] misc(tree/peel_to_entry): rework logic to reflect intent more clearly --- gix/src/object/tree/mod.rs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/gix/src/object/tree/mod.rs b/gix/src/object/tree/mod.rs index a283fbc00..b4e97ef2f 100644 --- a/gix/src/object/tree/mod.rs +++ b/gix/src/object/tree/mod.rs @@ -116,37 +116,38 @@ impl<'repo> Tree<'repo> { { let mut iter = path.into_iter().peekable(); let mut data = gix_object::Data::new(gix_object::Kind::Tree, &self.data); - let mut data_id = self.id; + let mut last_tree_id = self.id; loop { data = match next_entry(&mut iter, data) { ControlFlow::Continue(id) => { let res = self.repo.find(&id, &mut self.data)?; - data_id = id; + self.id = id; + if res.kind.is_tree() { - self.id = data_id; + last_tree_id = id; } + res } ControlFlow::Break(entry) => { let entry = if let Some(e) = entry { - let inner = e.into(); - if e.mode.is_tree() { - let id = e.oid.to_owned(); - data_id = id; - self.repo.find(&id, &mut self.data)?; - self.id = data_id; + last_tree_id = e.oid.to_owned(); } - - Some(Entry { inner, repo: self.repo }) + Some(Entry { + inner: e.into(), + repo: self.repo, + }) } else { None }; - if data_id != self.id { - // Ensure that our data always matches our id, even if this means an extra lookup. - self.repo.find(&self.id, &mut self.data)?; + if self.id != last_tree_id { + // Ensure that our data & ID alway match the last seen tree so that + // this tree can be reused, even if this means an extra lookup. + self.repo.find(&last_tree_id, &mut self.data)?; + self.id = last_tree_id; } break Ok(entry);