def __topological_sort(self, graph): """ Effectively executes topological sorting on given graph. """ # initialize count map count = dict((node, 0) for node in graph) for node in graph: for successor in graph[node]: count[successor] += 1 ready_stack = Lifo() for node in graph: if count[node] == 0: ready_stack.push(node) dep_level = 1 result = {} while ready_stack.is_filled(): node = ready_stack.pop() result[dep_level] = node dep_level += 1 for successor in graph[node]: count[successor] -= 1 if count[successor] == 0: ready_stack.push(successor) return result
def _graph_to_stdout(entropy_client, graph, start_item, item_translation_callback, show_already_pulled_in, quiet): if not quiet: entropy_client.output("="*40, level="generic") sorted_data = graph.solve_nodes() stack = Lifo() for dep_level in sorted(sorted_data.keys(), reverse = True): stack.push(sorted_data[dep_level]) # required to make sure that our first pkg is user required one stack.push((start_item,)) out_data = { 'cache': set(), 'lvl': 0, 'txc_cb': item_translation_callback, 'show_already_pulled_in': show_already_pulled_in, } first_tree_item = True while stack.is_filled(): stack_items = stack.pop() # cleanup already printed items items = [x for x in stack_items if x not in out_data['cache']] if not items: continue out_data['cache'].update(stack_items) # print items and its deps for item in items: old_level = out_data['lvl'] _print_graph_item_deps( entropy_client, item, out_data, colorize = blue) out_data['lvl'] = old_level if first_tree_item: out_data['lvl'] += 1 first_tree_item = False del stack
def _get_flat_deps(self, ids_to_check, get_deps_func): """ Return a set (frozenset) of package IDs that are dependencies of provided packages, recursively. """ stack = Lifo() result_deps = set() for pkg_id in ids_to_check: stack.push(pkg_id) while stack.is_filled(): pkg_id = stack.pop() if pkg_id in result_deps: continue result_deps.add(pkg_id) for dep_id in get_deps_func(pkg_id): if dep_id not in result_deps: stack.push(dep_id) return frozenset(result_deps)
def _graph_package(match, package, entropy_intf, show_complete = False, quiet = False): include_sys_pkgs = False show_already_pulled_in = False if show_complete: include_sys_pkgs = True show_already_pulled_in = True graph = Graph() stack = Lifo() start_item = (match, package, None) stack.push(start_item) stack_cache = set() # ensure package availability in graph, initialize now graph.add(start_item, []) depsorter = lambda x: entropy.dep.dep_getcpv(x[0]) while stack.is_filled(): item = stack.pop() if item in stack_cache: continue stack_cache.add(item) ((pkg_id, repo_id,), _was_dep, dep_type) = item # deps repodb = entropy_intf.open_repository(repo_id) deps = repodb.retrieveDependencies(pkg_id, extended = True, resolve_conditional_deps = False) graph_deps = [] for dep, x_dep_type in sorted(deps, key = depsorter): if dep.startswith("!"): # conflict continue dep_item = entropy_intf.atom_match(dep) if dep_item[0] == -1: continue do_include = True if not include_sys_pkgs: dep_repodb = entropy_intf.open_repository(dep_item[1]) do_include = not dep_repodb.isSystemPackage(dep_item[0]) g_item = (dep_item, dep, x_dep_type) if do_include: stack.push(g_item) graph_deps.append(g_item) graph.add(item, graph_deps) def item_translation_func(match): value = "%s" % (match[1],) if match[2] is not None: value += " %s%s%s" % (teal("{"), brown(str(match[2])), teal("}"),) return value _graph_to_stdout(entropy_intf, graph, graph.get_node(start_item), item_translation_func, show_already_pulled_in, quiet) if not quiet: _show_graph_legend(entropy_intf) show_dependencies_legend(entropy_intf) del stack graph.destroy() return 0
def _revgraph_package(entropy_client, installed_pkg_id, package, dbconn, show_complete = False, quiet = False): include_sys_pkgs = False show_already_pulled_in = False include_build_deps = False if show_complete: include_sys_pkgs = True show_already_pulled_in = True include_build_deps = True excluded_dep_types = [etpConst['dependency_type_ids']['bdepend_id']] if not include_build_deps: excluded_dep_types = None graph = Graph() stack = Lifo() inst_item = (installed_pkg_id, package) stack.push(inst_item) stack_cache = set() # ensure package availability in graph, initialize now graph.add(inst_item, set()) def rev_pkgs_sorter(_pkg_id): return dbconn.retrieveAtom(_pkg_id) while stack.is_filled(): item = stack.pop() if item in stack_cache: continue stack_cache.add(item) pkg_id, _was_dep = item rev_deps = dbconn.retrieveReverseDependencies(pkg_id, exclude_deptypes = excluded_dep_types) graph_deps = [] for rev_pkg_id in sorted(rev_deps, key = rev_pkgs_sorter): dep = dbconn.retrieveAtom(rev_pkg_id) do_include = True if not include_sys_pkgs: do_include = not dbconn.isSystemPackage(rev_pkg_id) g_item = (rev_pkg_id, dep) if do_include: stack.push(g_item) graph_deps.append(g_item) graph.add(item, graph_deps) def item_translation_func(match): return match[1] _graph_to_stdout(entropy_client, graph, graph.get_node(inst_item), item_translation_func, show_already_pulled_in, quiet) if not quiet: _show_graph_legend(entropy_client) del stack graph.destroy() return 0