# HG changeset patch # User Georges Racinet on incendie.racinet.fr # Date 1698441710 -7200 # Node ID 456e0fe702e86d6adc3a90bee4785a3718c9ca48 # Parent 59183a19954ef56050c7320d8563bc955cfaa09d rust-index: honour incoming using_general_delta in `deltachain` It looks to be a leftover from some past, but the C index considers only the value passed from Python whereas up to now the Rust index was using the value of its attribute. As a middle ground, we make this argument of `deltachain` optional from the Python side, with the Rust implementation only defaulting to its attribute. This way, we reduce false leads when a difference in results is spotted. diff -r 59183a19954e -r 456e0fe702e8 rust/hg-core/src/revlog/index.rs --- a/rust/hg-core/src/revlog/index.rs Fri Oct 27 21:48:45 2023 +0200 +++ b/rust/hg-core/src/revlog/index.rs Fri Oct 27 23:21:50 2023 +0200 @@ -599,15 +599,18 @@ &self, rev: Revision, stop_rev: Option, + using_general_delta: Option, ) -> Result<(Vec, bool), HgError> { let mut current_rev = rev; let mut entry = self.get_entry(rev).unwrap(); let mut chain = vec![]; + let using_general_delta = + using_general_delta.unwrap_or_else(|| self.uses_generaldelta()); while current_rev.0 != entry.base_revision_or_base_of_delta_chain().0 && stop_rev.map(|r| r != current_rev).unwrap_or(true) { chain.push(current_rev); - let new_rev = if self.uses_generaldelta() { + let new_rev = if using_general_delta { entry.base_revision_or_base_of_delta_chain() } else { UncheckedRevision(current_rev.0 - 1) diff -r 59183a19954e -r 456e0fe702e8 rust/hg-cpython/src/revlog.rs --- a/rust/hg-cpython/src/revlog.rs Fri Oct 27 21:48:45 2023 +0200 +++ b/rust/hg-cpython/src/revlog.rs Fri Oct 27 23:21:50 2023 +0200 @@ -368,7 +368,12 @@ nodemap_error(py, NodeMapError::RevisionNotInIndex(stop_rev)) })?) } else {None}; - let (chain, stopped) = index.delta_chain(rev, stop_rev).map_err(|e| { + let using_general_delta = args.get_item(py, 2) + .extract::>(py)? + .map(|i| i != 0); + let (chain, stopped) = index.delta_chain( + rev, stop_rev, using_general_delta + ).map_err(|e| { PyErr::new::(py, e.to_string()) })?;