def make_dep_tree(self, pkg_list, filter_callback): """ - pkg_list: List of package names. - filter_callback: Function that takes a package name and returns True if the package should go into the tree. """ # - all of pkg_list goes into a set P # - init an empty dict D # - for every element p of P: # - create a full dep tree T # - D[p] -> T # - for every element q of P\p: # - if q is in T, then P <- P\q and del(D[q]) if exists # - merge all elements of D into T' and return that pkg_set = set(filter(filter_callback, pkg_list)) new_pkg_set = set(filter(filter_callback, pkg_list)) dep_trees = {} for pkg in pkg_set: dep_trees[pkg] = self.make_tree_recursive(pkg, filter_callback) assert dep_trees[pkg] is not None for other_pkg in new_pkg_set.difference([pkg]): if other_pkg in dep_trees[pkg]: new_pkg_set.remove(other_pkg) install_tree = TreeNode() for pkg in new_pkg_set: install_tree.add_child(dep_trees[pkg]) return install_tree
def make_tree_recursive(self, pkg, filter_callback): """ Make a dependency tree for one package """ if not filter_callback(pkg): return None tree = TreeNode(pkg) deps = recipe.get_recipe(pkg).get_local_package_data()['depends'] or [] for dep in deps: if dep is not None and not self.pm.exists(pkg): self.log.error( "Package does not exist: {0} (declared as dependency for package {1})".format( dep, pkg ) ) exit(1) deps_to_install = set([ dep for dep in deps \ if dep is not None and filter_callback(dep) and not isinstance(dep, list) \ ]) for dep in deps_to_install: subtree = self.make_tree_recursive(dep, filter_callback) if subtree is not None: tree.add_child(subtree) return tree
def make_tree_recursive(self, pkg, filter_callback): """ Make a dependency tree for one package. Assumption is that pkg actually needs to go into the tree, it will not get checked by filter_callback again. """ assert pkg is not None tree = TreeNode(pkg) all_deps = recipe.get_recipe(pkg).depends or [] deps_to_install = set([dep for dep in all_deps if filter_callback(dep)]) for dep in deps_to_install: tree.add_child(self.make_tree_recursive(dep, filter_callback)) return tree
def make_tree_recursive(self, pkg, filter_callback): """ Make a dependency tree for one package """ if not filter_callback(pkg): return None tree = TreeNode(pkg) deps = recipe.get_recipe(pkg).depends or [] for dep in deps: if not self.pm.exists(pkg): raise PBException( "Package does not exist: {0} (declared as dependency for package {1})" .format(dep, pkg)) deps_to_install = set([dep for dep in deps if filter_callback(dep)]) for dep in deps_to_install: subtree = self.make_tree_recursive(dep, filter_callback) if subtree is not None: tree.add_child(subtree) return tree
def make_tree_recursive(self, pkg, filter_callback): """ Make a dependency tree for one package """ if not filter_callback(pkg): return None tree = TreeNode(pkg) deps = recipe.get_recipe(pkg).depends or [] for dep in deps: if not self.pm.exists(pkg): raise PBException( "Package does not exist: {0} (declared as dependency for package {1})".format( dep, pkg ) ) deps_to_install = set([dep for dep in deps if filter_callback(dep)]) for dep in deps_to_install: subtree = self.make_tree_recursive(dep, filter_callback) if subtree is not None: tree.add_child(subtree) return tree