forked from importers/git-importer
		
	Switch to walker for tree print
This commit is contained in:
		| @@ -2,6 +2,19 @@ from lib.db_revision import DBRevision | ||||
| from lib.request import Request | ||||
|  | ||||
|  | ||||
| class AbstractWalker: | ||||
|     def call(self, node, is_source): | ||||
|         pass | ||||
|  | ||||
|  | ||||
| class PrintWalker(AbstractWalker): | ||||
|     def call(self, node, is_source): | ||||
|         if is_source: | ||||
|             print("   ", node.revision, node.revision.files_hash) | ||||
|         else: | ||||
|             print(node.revision, node.revision.files_hash) | ||||
|  | ||||
|  | ||||
| class TreeNode: | ||||
|     """ | ||||
|     Nodes in this "tree" have either no parent (root), one parent (in a chain) | ||||
| @@ -13,20 +26,24 @@ class TreeNode: | ||||
|         self.merged = None | ||||
|         self.revision = rev | ||||
|         self.merged_into = None | ||||
|         self.git_commit = None | ||||
|  | ||||
|     def print(self): | ||||
|     def walk(self, walker: AbstractWalker): | ||||
|         node = self | ||||
|         while node: | ||||
|             print(node.revision, node.revision.files_hash) | ||||
|             walker.call(node, False) | ||||
|             if node.merged: | ||||
|                 source_node = node.merged | ||||
|                 while source_node: | ||||
|                     print("   ", source_node.revision, source_node.revision.files_hash) | ||||
|                     walker.call(node, True) | ||||
|                     source_node = source_node.parent | ||||
|                     if source_node and source_node.merged_into: | ||||
|                         break | ||||
|             node = node.parent | ||||
|  | ||||
|     def print(self): | ||||
|         self.walk(PrintWalker()) | ||||
|  | ||||
|     def as_list(self): | ||||
|         """Return a list for test cases""" | ||||
|         node = self | ||||
| @@ -51,6 +68,8 @@ class TreeBuilder: | ||||
|         self.db = db | ||||
|  | ||||
|     def revisions_chain(self, project, package): | ||||
|         """Build a tree without branches (chain) from a project's | ||||
|         history ignoring empty and broken revisions""" | ||||
|         revisions = DBRevision.all_revisions(self.db, project, package) | ||||
|         revisions.sort() | ||||
|         prev = None | ||||
| @@ -69,6 +88,8 @@ class TreeBuilder: | ||||
|         return tree | ||||
|  | ||||
|     def find_merge(self, revision, source_chain): | ||||
|         """For a given revision in the target, find the node in the source chain | ||||
|         that matches the files""" | ||||
|         node = source_chain | ||||
|         while node: | ||||
|             # exclude reverts happening after the merge | ||||
| @@ -80,6 +101,8 @@ class TreeBuilder: | ||||
|             node = node.parent | ||||
|  | ||||
|     def add_merge_points(self, factory_revisions): | ||||
|         """For all target revisions that accepted a request, look up the merge | ||||
|         points in the source chains (ignoring the actual revision submitted for now)""" | ||||
|         source_revisions = dict() | ||||
|         factory_node = factory_revisions | ||||
|         while factory_node: | ||||
| @@ -120,6 +143,7 @@ class TreeBuilder: | ||||
|             factory_node = factory_node.parent | ||||
|  | ||||
|     def build(self, package): | ||||
|         """Create a Factory tree (returning the top)""" | ||||
|         factory_revisions = self.revisions_chain("openSUSE:Factory", package) | ||||
|         self.add_merge_points(factory_revisions) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user