Skip to content

Commit

Permalink
upload: Add topological_topics as a generator
Browse files Browse the repository at this point in the history
  • Loading branch information
jerry-skydio committed Mar 12, 2024
1 parent edb2370 commit 0a455aa
Showing 1 changed file with 33 additions and 2 deletions.
35 changes: 33 additions & 2 deletions revup/topic_stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,23 @@ class Topic:
# Reviews for this topic, keyed by base branch
reviews: Dict[str, Review] = field(default_factory=dict)

def depth_first_iter(self) -> Iterator[Topic]:
seen: Set[str] = set()
for t in self.depth_first_iter_helper(seen):
yield t

def depth_first_iter_helper(self, seen: Set[str]) -> Iterator[Topic]:
seen.add(self.name)

if self.relative_topic:
for t in self.relative_topic.depth_first_iter_helper(seen):
if t.name in seen:
raise RevupUsageException(
f'Unexpected relative topic cycle from "{self.name}" to "{t.name}"'
)
yield t
yield self


@dataclass
class TopicStack:
Expand Down Expand Up @@ -234,10 +251,24 @@ def all_reviews_iter(self) -> Iterator[Tuple[str, Topic, str, Review]]:
"""
One liner for common iteration pattern to reduce indentation a bit.
"""
for name, topic in self.topics.items():
for name, topic in self.topological_topics():
for base_branch, review in topic.reviews.items():
yield name, topic, base_branch, review

def topological_topics(self) -> Iterator[Tuple[str, Topic]]:
"""
Iterate through all topics one at a time with the requirement that any topic must always
come after a topic it is relative to.
"""
seen: Set[str] = set()
for _, topic in self.topics.items():
for t in topic.depth_first_iter():
if t.name in seen:
# If this topic has been seen, then all in the chain must have been seen
break
seen.add(t.name)
yield t.name, t

def parse_commit_tags(self, commit_msg: str) -> Tuple[Dict[str, Set[str]], str]:
"""
Parse all commit tags in the commit message and return them in a dict, as well as
Expand Down Expand Up @@ -516,7 +547,7 @@ async def populate_reviews(

seen_topics[name] = topic

for name, topic in list(self.topics.items()):
for name, topic in self.topological_topics():
if topic.relative_topic:
if len(topic.tags[TAG_BRANCH]) == 0:
topic.tags[TAG_BRANCH].update(topic.relative_topic.tags[TAG_BRANCH])
Expand Down

0 comments on commit 0a455aa

Please sign in to comment.