Thanks for taking on this ! I have only one minor remark below On 12/5/18 2:43 PM, Yuya Nishihara wrote: > # HG changeset patch > # User Yuya Nishihara <y...@tcha.org> > # Date 1540817453 -32400 > # Mon Oct 29 21:50:53 2018 +0900 > # Node ID 3afbe6d40d6859d313f45b66ad5ca3c0a48f2e06 > # Parent f5cdfa49994e3943ba7c4ce2d66708142f0c7058 > rust: propagate error of index_get_parents() properly > > Before, rustla_contains() would return 0 on error, and the exception would > be cleared or noticed somewhere else. We need to propagate the error from > AncestorsIterator up to the FFI surface. > > diff --git a/rust/hg-core/src/ancestors.rs b/rust/hg-core/src/ancestors.rs > --- a/rust/hg-core/src/ancestors.rs > +++ b/rust/hg-core/src/ancestors.rs > @@ -77,19 +77,20 @@ impl<G: Graph> AncestorsIterator<G> { > /// is in the ancestors it emits. > /// This is meant for iterators actually dedicated to that kind of > /// purpose > - pub fn contains(&mut self, target: Revision) -> bool { > + pub fn contains(&mut self, target: Revision) -> Result<bool, GraphError> > { > if self.seen.contains(&target) && target != NULL_REVISION { > - return true; > + return Ok(true); > } > - for rev in self { > + for item in self { > + let rev = item?; > if rev == target { > - return true; > + return Ok(true); > } > if rev < target { > - return false; > + return Ok(false); > } > } > - false > + Ok(false) > } > } > > @@ -117,19 +118,19 @@ impl<G: Graph> AncestorsIterator<G> { > /// concrete caller we target, so we shouldn't need a finer error treatment > /// for the time being. I think the comment right above about error treatment becomes obsolete with this patch. > impl<G: Graph> Iterator for AncestorsIterator<G> { > - type Item = Revision; > + type Item = Result<Revision, GraphError>; > > - fn next(&mut self) -> Option<Revision> { > + fn next(&mut self) -> Option<Self::Item> { > let current = match self.visit.peek() { > None => { > return None; > } > Some(c) => *c, > }; > - let (p1, p2) = self > - .graph > - .parents(current) > - .unwrap_or((NULL_REVISION, NULL_REVISION)); > + let (p1, p2) = match self.graph.parents(current) { > + Ok(ps) => ps, > + Err(e) => return Some(Err(e)), > + }; > if p1 < self.stoprev || self.seen.contains(&p1) { > self.visit.pop(); > } else { > @@ -138,7 +139,7 @@ impl<G: Graph> Iterator for AncestorsIte > }; > > self.conditionally_push_rev(p2); > - Some(current) > + Some(Ok(current)) > } > } > > diff --git a/rust/hg-direct-ffi/src/ancestors.rs > b/rust/hg-direct-ffi/src/ancestors.rs > --- a/rust/hg-direct-ffi/src/ancestors.rs > +++ b/rust/hg-direct-ffi/src/ancestors.rs > @@ -139,7 +139,11 @@ pub extern "C" fn rustlazyancestors_next > #[inline] > fn raw_next<G: Graph>(raw: *mut AncestorsIterator<G>) -> c_long { > let as_ref = unsafe { &mut *raw }; > - as_ref.next().unwrap_or(NULL_REVISION) as c_long > + let rev = match as_ref.next() { > + Some(Ok(rev)) => rev, > + Some(Err(_)) | None => NULL_REVISION, > + }; > + rev as c_long > } > > #[no_mangle] > @@ -157,10 +161,10 @@ fn raw_contains<G: Graph>( > target: c_long, > ) -> c_int { > let as_ref = unsafe { &mut *raw }; > - if as_ref.contains(target as Revision) { > - return 1; > + match as_ref.contains(target as Revision) { > + Ok(r) => r as c_int, > + Err(_) => -1, > } > - 0 > } > > #[cfg(test)] > _______________________________________________ > Mercurial-devel mailing list > Mercurial-devel@mercurial-scm.org > https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
-- Georges Racinet Anybox SAS, http://anybox.fr Téléphone: +33 6 51 32 07 27 GPG: B59E 22AB B842 CAED 77F7 7A7F C34F A519 33AB 0A35, sur serveurs publics _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel