diff --git a/libraries/entropy/client/interfaces/client.py b/libraries/entropy/client/interfaces/client.py index 0f9c94364..d35f7ba25 100644 --- a/libraries/entropy/client/interfaces/client.py +++ b/libraries/entropy/client/interfaces/client.py @@ -692,6 +692,11 @@ class Client(Singleton, TextInterface, LoadersMixin, CacheMixin, CalculatorsMixi def destroy(self): + """ + Destroy this Singleton instance, closing repositories, removing + SystemSettings plugins added during instance initialization. + This method should be always called when instance is not used anymore. + """ self.__instance_destroyed = True if hasattr(self, '_installed_repository'): if self._installed_repository != None: diff --git a/libraries/entropy/client/interfaces/dep.py b/libraries/entropy/client/interfaces/dep.py index d4f4c6142..24be0baca 100644 --- a/libraries/entropy/client/interfaces/dep.py +++ b/libraries/entropy/client/interfaces/dep.py @@ -594,8 +594,16 @@ class CalculatorsMixin: return unsatisfied - # expands package sets, and in future something more perhaps def packages_expand(self, packages): + """ + Given a list of user requested packages, expands it resolving for + instance, items such as package sets. + + @param packages: list of user requested packages + @type packages: list + @return: expanded list + @rtype: list + """ new_packages = [] sets = self.Sets() @@ -613,101 +621,6 @@ class CalculatorsMixin: return new_packages - def get_masked_packages_tree(self, match, atoms = False, flat = False, - matchfilter = None): - - if not isinstance(matchfilter, set): - matchfilter = set() - - maskedtree = {} - mybuffer = Lifo() - depcache = set() - treelevel = -1 - - match_id, match_repo = match - - mydbconn = self.open_repository(match_repo) - myatom = mydbconn.retrieveAtom(match_id) - idpackage, idreason = mydbconn.idpackageValidator(match_id) - if idpackage == -1: - treelevel += 1 - if atoms: - mydict = {myatom: idreason,} - else: - mydict = {match: idreason,} - if flat: - maskedtree.update(mydict) - else: - maskedtree[treelevel] = mydict - - excluded_deps = [etpConst['dependency_type_ids']['bdepend_id']] - mydeps = mydbconn.retrieveDependencies(match_id, - exclude_deptypes = excluded_deps) - for mydep in mydeps: - mybuffer.push(mydep) - - try: - mydep = mybuffer.pop() - except ValueError: - mydep = None # stack empty - - open_db = self.open_repository - am = self.atom_match - while mydep: - - if mydep in depcache: - try: - mydep = mybuffer.pop() - except ValueError: - break # stack empty - continue - depcache.add(mydep) - - idpackage, repoid = am(mydep) - if (idpackage, repoid) in matchfilter: - try: - mydep = mybuffer.pop() - except ValueError: - break # stack empty - continue - - if idpackage != -1: - # doing even here because atomMatch with packagesFilter = False can pull - # something different - matchfilter.add((idpackage, repoid)) - - # collect masked - if idpackage == -1: - idpackage, repoid = am(mydep, packagesFilter = False) - if idpackage != -1: - treelevel += 1 - if treelevel not in maskedtree and not flat: - maskedtree[treelevel] = {} - dbconn = open_db(repoid) - vidpackage, idreason = dbconn.idpackageValidator(idpackage) - if atoms: - mydict = {dbconn.retrieveAtom(idpackage): idreason} - else: - mydict = {(idpackage, repoid): idreason} - if flat: maskedtree.update(mydict) - else: maskedtree[treelevel].update(mydict) - - # push its dep into the buffer - if idpackage != -1: - matchfilter.add((idpackage, repoid)) - dbconn = open_db(repoid) - owndeps = dbconn.retrieveDependencies(idpackage, - exclude_deptypes = excluded_deps) - for owndep in owndeps: - mybuffer.push(owndep) - - try: - mydep = mybuffer.pop() - except ValueError: - break # stack empty - - return maskedtree - def __generate_dependency_tree_inst_hooks(self, installed_match, pkg_match, stack): @@ -1739,6 +1652,102 @@ class CalculatorsMixin: return update, remove, fine, spm_fine + def get_masked_packages_tree(self, match, atoms = False, flat = False, + matchfilter = None): + + if not isinstance(matchfilter, set): + matchfilter = set() + + maskedtree = {} + mybuffer = Lifo() + depcache = set() + treelevel = -1 + + match_id, match_repo = match + + mydbconn = self.open_repository(match_repo) + myatom = mydbconn.retrieveAtom(match_id) + idpackage, idreason = mydbconn.idpackageValidator(match_id) + if idpackage == -1: + treelevel += 1 + if atoms: + mydict = {myatom: idreason,} + else: + mydict = {match: idreason,} + if flat: + maskedtree.update(mydict) + else: + maskedtree[treelevel] = mydict + + excluded_deps = [etpConst['dependency_type_ids']['bdepend_id']] + mydeps = mydbconn.retrieveDependencies(match_id, + exclude_deptypes = excluded_deps) + for mydep in mydeps: + mybuffer.push(mydep) + + try: + mydep = mybuffer.pop() + except ValueError: + mydep = None # stack empty + + open_db = self.open_repository + am = self.atom_match + while mydep: + + if mydep in depcache: + try: + mydep = mybuffer.pop() + except ValueError: + break # stack empty + continue + depcache.add(mydep) + + idpackage, repoid = am(mydep) + if (idpackage, repoid) in matchfilter: + try: + mydep = mybuffer.pop() + except ValueError: + break # stack empty + continue + + if idpackage != -1: + # doing even here because atomMatch with + # packagesFilter = False can pull something different + matchfilter.add((idpackage, repoid)) + + # collect masked + if idpackage == -1: + idpackage, repoid = am(mydep, packagesFilter = False) + if idpackage != -1: + treelevel += 1 + if treelevel not in maskedtree and not flat: + maskedtree[treelevel] = {} + dbconn = open_db(repoid) + vidpackage, idreason = dbconn.idpackageValidator( + idpackage) + if atoms: + mydict = {dbconn.retrieveAtom(idpackage): idreason} + else: + mydict = {(idpackage, repoid): idreason} + if flat: maskedtree.update(mydict) + else: maskedtree[treelevel].update(mydict) + + # push its dep into the buffer + if idpackage != -1: + matchfilter.add((idpackage, repoid)) + dbconn = open_db(repoid) + owndeps = dbconn.retrieveDependencies(idpackage, + exclude_deptypes = excluded_deps) + for owndep in owndeps: + mybuffer.push(owndep) + + try: + mydep = mybuffer.pop() + except ValueError: + break # stack empty + + return maskedtree + def check_package_update(self, atom, deep = False): c_hash = "%s%s" % (EntropyCacher.CACHE_IDS['check_package_update'],