changeset 41132:55dc1da8df2f

rust-ancestors: duplicate loop that visits parents of revs/bases As the inline comment says, it can't be cleanly implemented in Rust. It's better to duplicate the code instead of inserting "if"s. The loop will be cleaned up by future commits.
author Yuya Nishihara <yuya@tcha.org>
date Wed, 19 Dec 2018 21:51:08 +0900
parents 486908e691be
children a1b3800c8a19
files rust/hg-core/src/ancestors.rs
diffstat 1 files changed, 29 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/rust/hg-core/src/ancestors.rs	Wed Dec 19 21:42:06 2018 +0900
+++ b/rust/hg-core/src/ancestors.rs	Wed Dec 19 21:51:08 2018 +0900
@@ -345,14 +345,6 @@
             if revs_visit.remove(&curr) {
                 missing.push(curr);
                 this_visit_is_revs = true;
-            } else if bases_visit.contains(&curr) {
-                this_visit_is_revs = false;
-            } else {
-                // not an ancestor of revs or bases: ignore
-                continue;
-            }
-
-            {
                 for p in self.graph.parents(curr)?.iter().cloned() {
                     if p == NULL_REVISION {
                         continue;
@@ -378,6 +370,35 @@
                         }
                     }
                 }
+            } else if bases_visit.contains(&curr) {
+                this_visit_is_revs = false;
+                for p in self.graph.parents(curr)?.iter().cloned() {
+                    if p == NULL_REVISION {
+                        continue;
+                    }
+                    let in_other_visit = if this_visit_is_revs {
+                        bases_visit.contains(&p)
+                    } else {
+                        revs_visit.contains(&p)
+                    };
+                    if in_other_visit || both_visit.contains(&p) {
+                        // p is implicitely in this_visit.
+                        // This means p is or should be in bothvisit
+                        // TODO optim: hence if bothvisit, we look up twice
+                        revs_visit.remove(&p);
+                        bases_visit.insert(p);
+                        both_visit.insert(p);
+                    } else {
+                        // visit later
+                        if this_visit_is_revs {
+                            revs_visit.insert(p);
+                        } else {
+                            bases_visit.insert(p);
+                        }
+                    }
+                }
+            } else {
+                // not an ancestor of revs or bases: ignore
             }
         }
         missing.reverse();