diff --git a/client/text_ui.py b/client/text_ui.py index 9e7bbb291..0f696b319 100644 --- a/client/text_ui.py +++ b/client/text_ui.py @@ -60,6 +60,7 @@ def package(options): e_req_save_here = False e_req_dump = False e_req_bdeps = False + e_req_recursive = True e_req_multifetch = 1 rc = 0 _myopts = [] @@ -86,6 +87,8 @@ def package(options): e_req_only_fetch = True elif (opt == "--deep"): e_req_deep = True + elif (opt == "--no-recursive"): + e_req_recursive = False elif (opt == "--dump"): e_req_dump = True elif (opt == "--listfiles"): @@ -150,7 +153,8 @@ def package(options): deepdeps = e_req_deep, pkgs = my_etp_pkg_paths, savecwd = e_req_save_here, relaxed_deps = e_req_relaxed, - build_deps = e_req_bdeps) + build_deps = e_req_bdeps, + recursive = e_req_recursive) else: print_error(red(" %s." % (_("Nothing to do"),) )) rc = 126 @@ -165,7 +169,8 @@ def package(options): multifetch = e_req_multifetch, dochecksum = e_req_checksum, relaxed_deps = e_req_relaxed, - build_deps = e_req_bdeps) + build_deps = e_req_bdeps, + recursive = e_req_recursive) else: print_error(red(" %s." % (_("Nothing to do"),) )) rc = 126 @@ -182,7 +187,8 @@ def package(options): multifetch = e_req_multifetch, check_critical_updates = True, relaxed_deps = e_req_relaxed, - build_deps = e_req_bdeps) + build_deps = e_req_bdeps, + recursive = e_req_recursive) else: print_error(red(" %s." % (_("Nothing to do"),) )) rc = 126 @@ -831,7 +837,7 @@ def _show_you_meant(entropy_client, package, from_installed): items_cache.add((key, slot)) def _generate_run_queue(entropy_client, found_pkg_atoms, deps, emptydeps, - deepdeps, relaxeddeps, builddeps): + deepdeps, relaxeddeps, builddeps, recursive): run_queue = [] removal_queue = [] @@ -841,12 +847,13 @@ def _generate_run_queue(entropy_client, found_pkg_atoms, deps, emptydeps, _("Calculating dependencies"),) ) run_queue, removal_queue, status = entropy_client.get_install_queue( found_pkg_atoms, emptydeps, deepdeps, relaxed_deps = relaxeddeps, - build_deps = builddeps) + build_deps = builddeps, recursive = recursive) if status == -2: print_error(red(" @@ ") + blue("%s: " % ( _("Cannot find needed dependencies"),) )) for package in run_queue: - _show_masked_pkg_info(entropy_client, package, from_user = False) + _show_masked_pkg_info(entropy_client, package, + from_user = False) return True, (125, -1), [] else: @@ -857,7 +864,7 @@ def _generate_run_queue(entropy_client, found_pkg_atoms, deps, emptydeps, def _download_sources(entropy_client, packages = None, deps = True, deepdeps = False, pkgs = None, savecwd = False, relaxed_deps = False, - build_deps = False): + build_deps = False, recursive = True): if packages is None: packages = [] @@ -877,7 +884,8 @@ def _download_sources(entropy_client, packages = None, deps = True, return myrc abort, run_queue, removal_queue = _generate_run_queue(entropy_client, - found_pkg_atoms, deps, False, deepdeps, relaxed_deps, build_deps) + found_pkg_atoms, deps, False, deepdeps, relaxed_deps, build_deps, + recursive) if abort: return run_queue @@ -986,7 +994,7 @@ def _fetch_packages(entropy_client, run_queue, downdata, multifetch = 1, def _download_packages(entropy_client, packages = None, deps = True, deepdeps = False, multifetch = 1, dochecksum = True, relaxed_deps = False, - build_deps = False): + build_deps = False, recursive = True): if packages is None: packages = [] @@ -1012,7 +1020,8 @@ def _download_packages(entropy_client, packages = None, deps = True, return myrc abort, run_queue, removal_queue = _generate_run_queue(entropy_client, - found_pkg_atoms, deps, False, deepdeps, relaxed_deps, build_deps) + found_pkg_atoms, deps, False, deepdeps, relaxed_deps, build_deps, + recursive) if abort: return run_queue @@ -1041,7 +1050,7 @@ def install_packages(entropy_client, emptydeps = False, onlyfetch = False, deepdeps = False, config_files = False, pkgs = None, resume = False, skipfirst = False, dochecksum = True, multifetch = 1, check_critical_updates = False, - relaxed_deps = False, build_deps = False): + relaxed_deps = False, build_deps = False, recursive = True): if packages is None: packages = [] @@ -1097,7 +1106,8 @@ def install_packages(entropy_client, return myrc abort, run_queue, removal_queue = _generate_run_queue(entropy_client, - found_pkg_atoms, deps, emptydeps, deepdeps, relaxed_deps, build_deps) + found_pkg_atoms, deps, emptydeps, deepdeps, relaxed_deps, + build_deps, recursive) if abort: return run_queue diff --git a/libraries/entropy/client/interfaces/dep.py b/libraries/entropy/client/interfaces/dep.py index 0bf23522c..e7560a126 100644 --- a/libraries/entropy/client/interfaces/dep.py +++ b/libraries/entropy/client/interfaces/dep.py @@ -892,8 +892,8 @@ class CalculatorsMixin: conflicts.add(c_idpackage) def __generate_dependency_tree_analyze_deplist(self, pkg_match, repo_db, - stack, deps_not_found, conflicts, unsat_cache, relaxed_deps, build_deps, - deep_deps, empty_deps): + stack, deps_not_found, conflicts, unsat_cache, relaxed_deps, + build_deps, deep_deps, empty_deps, recursive): pkg_id, repo_id = pkg_match # exclude build dependencies @@ -942,8 +942,11 @@ class CalculatorsMixin: # dependency not found ! deps_not_found.add(unsat_dep) continue + deps.add((match_pkg_id, match_repo_id)) - stack.push((match_pkg_id, match_repo_id)) + if recursive: + # push to stack only if recursive + stack.push((match_pkg_id, match_repo_id)) post_deps_matches = set() for post_dep in post_deps: @@ -953,14 +956,16 @@ class CalculatorsMixin: # not adding to deps_not_found continue post_deps_matches.add((match_pkg_id, match_repo_id)) - stack.push((match_pkg_id, match_repo_id)) + if recursive: + # push to stack only if recursive + stack.push((match_pkg_id, match_repo_id)) return deps, post_deps_matches def _generate_dependency_tree(self, matched_atom, graph, empty_deps = False, relaxed_deps = False, build_deps = False, deep_deps = False, unsatisfied_deps_cache = None, - elements_cache = None): + elements_cache = None, recursive = True): # this cache avoids adding the same element to graph # several times, when it is supposed to be already handled @@ -975,7 +980,6 @@ class CalculatorsMixin: stack = Lifo() stack.push(matched_atom) - while stack.is_filled(): # get item from stack @@ -1006,8 +1010,8 @@ class CalculatorsMixin: # search inside installed packages repository if there's something # in the same slot, if so, do some extra checks first. pkg_key, pkg_slot = repo_db.retrieveKeySlot(pkg_id) - cm_idpackage, cm_result = self._installed_repository.atomMatch(pkg_key, - matchSlot = pkg_slot) + cm_idpackage, cm_result = self._installed_repository.atomMatch( + pkg_key, matchSlot = pkg_slot) if cm_idpackage != -1: # this method does: @@ -1020,8 +1024,8 @@ class CalculatorsMixin: dep_matches, post_dep_matches = \ self.__generate_dependency_tree_analyze_deplist( pkg_match, repo_db, stack, deps_not_found, - conflicts, unsatisfied_deps_cache, - relaxed_deps, build_deps, deep_deps, empty_deps) + conflicts, unsatisfied_deps_cache, relaxed_deps, + build_deps, deep_deps, empty_deps, recursive) # eventually add our package match to depgraph graph.add(pkg_match, dep_matches) @@ -1321,16 +1325,17 @@ class CalculatorsMixin: def get_required_packages(self, matched_atoms, empty_deps = False, deep_deps = False, relaxed_deps = False, build_deps = False, - quiet = False): + quiet = False, recursive = True): c_hash = "%s%s" % ( EntropyCacher.CACHE_IDS['dep_tree'], - hash("%s|%s|%s|%s|%s|%s|%s" % ( + hash("%s|%s|%s|%s|%s|%s|%s|%s" % ( hash(frozenset(sorted(matched_atoms))), empty_deps, deep_deps, relaxed_deps, build_deps, + recursive, self._installed_repository.checksum(), # needed when users do bogus things like editing config files # manually (branch setting) @@ -1384,7 +1389,8 @@ class CalculatorsMixin: matched_atom, graph, empty_deps = empty_deps, deep_deps = deep_deps, relaxed_deps = relaxed_deps, build_deps = build_deps, elements_cache = elements_cache, - unsatisfied_deps_cache = unsat_deps_cache + unsatisfied_deps_cache = unsat_deps_cache, + recursive = recursive ) except DependenciesNotFound as err: error_generated = -2 @@ -1884,14 +1890,15 @@ class CalculatorsMixin: return queue def get_install_queue(self, matched_atoms, empty_deps, deep_deps, - relaxed_deps = False, build_deps = False, quiet = False): + relaxed_deps = False, build_deps = False, quiet = False, + recursive = True): install = [] removal = [] treepackages, result = self.get_required_packages(matched_atoms, empty_deps = empty_deps, deep_deps = deep_deps, relaxed_deps = relaxed_deps, build_deps = build_deps, - quiet = quiet) + quiet = quiet, recursive = recursive) if result == -2: return treepackages, removal, result