From f76ce71d83845b7d69ff5ccab644529eef3be032 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Tue, 23 Nov 2010 21:13:41 +0100 Subject: [PATCH] [entropy.db] implement conditional dependencies support, break API on EntropyRepositoryBase --- client/text_query.py | 6 ++-- libraries/entropy/db/__init__.py | 35 ++++++++++++------- libraries/entropy/db/skel.py | 37 +++++++++++++++++---- libraries/entropy/server/interfaces/db.py | 6 ++-- libraries/entropy/server/interfaces/main.py | 3 +- server/server_reagent.py | 3 +- 6 files changed, 66 insertions(+), 24 deletions(-) diff --git a/client/text_query.py b/client/text_query.py index 110702a6c..433d50737 100644 --- a/client/text_query.py +++ b/client/text_query.py @@ -433,7 +433,8 @@ def _graph_package(match, package, entropy_intf, show_complete = False): # deps repodb = entropy_intf.open_repository(repo_id) - deps = repodb.retrieveDependencies(pkg_id, extended = True) + deps = repodb.retrieveDependencies(pkg_id, extended = True, + resolve_conditional_deps = False) graph_deps = [] for dep, x_dep_type in sorted(deps, key = depsorter): @@ -1628,7 +1629,8 @@ def print_package_info(idpackage, dbconn, clientSearch = False, pkgsize = entropy.tools.bytes_into_human(pkgsize) pkgbin = dbconn.retrieveDownloadURL(idpackage) pkgdigest = dbconn.retrieveDigest(idpackage) - pkgdeps = dbconn.retrieveDependencies(idpackage, extended = True) + pkgdeps = dbconn.retrieveDependencies(idpackage, extended = True, + resolve_conditional_deps = False) pkgconflicts = dbconn.retrieveConflicts(idpackage) depsorter = lambda x: entropy.dep.dep_getcpv(x[0]) diff --git a/libraries/entropy/db/__init__.py b/libraries/entropy/db/__init__.py index e07a355ca..8234b2841 100644 --- a/libraries/entropy/db/__init__.py +++ b/libraries/entropy/db/__init__.py @@ -836,7 +836,8 @@ class EntropyRepository(EntropyRepositoryBase): mypackage_id_string = 'NULL' if isinstance(package_id, int): - manual_deps = self.retrieveManualDependencies(package_id) + manual_deps = self.retrieveManualDependencies(package_id, + resolve_conditional_deps = False) # does it exist? self.removePackage(package_id, do_cleanup = False, @@ -2916,7 +2917,8 @@ class EntropyRepository(EntropyRepositoryBase): return frozenset(cur) return self._cur2frozenset(cur) - def retrieveDependenciesList(self, package_id, exclude_deptypes = None): + def retrieveDependenciesList(self, package_id, exclude_deptypes = None, + resolve_conditional_deps = True): """ Reimplemented from EntropyRepositoryBase. """ @@ -2934,31 +2936,40 @@ class EntropyRepository(EntropyRepositoryBase): UNION SELECT "!" || conflict FROM conflicts WHERE idpackage = (?)""" % (excluded_deptypes_query,), (package_id, package_id,)) - return self._cur2frozenset(cur) + if resolve_conditional_deps: + return frozenset(entropy.dep.expand_dependencies(cur, self)) + else: + return self._cur2frozenset(cur) - def retrieveBuildDependencies(self, package_id, extended = False): + def retrieveBuildDependencies(self, package_id, extended = False, + resolve_conditional_deps = True): """ Reimplemented from EntropyRepositoryBase. """ return self.retrieveDependencies(package_id, extended = extended, - deptype = etpConst['dependency_type_ids']['bdepend_id']) + deptype = etpConst['dependency_type_ids']['bdepend_id'], + resolve_conditional_deps = resolve_conditional_deps) - def retrievePostDependencies(self, package_id, extended = False): + def retrievePostDependencies(self, package_id, extended = False, + resolve_conditional_deps = True): """ Reimplemented from EntropyRepositoryBase. """ return self.retrieveDependencies(package_id, extended = extended, - deptype = etpConst['dependency_type_ids']['pdepend_id']) + deptype = etpConst['dependency_type_ids']['pdepend_id'], + resolve_conditional_deps = resolve_conditional_deps) - def retrieveManualDependencies(self, package_id, extended = False): + def retrieveManualDependencies(self, package_id, extended = False, + resolve_conditional_deps = True): """ Reimplemented from EntropyRepositoryBase. """ return self.retrieveDependencies(package_id, extended = extended, - deptype = etpConst['dependency_type_ids']['mdepend_id']) + deptype = etpConst['dependency_type_ids']['mdepend_id'], + resolve_conditional_deps = resolve_conditional_deps) def retrieveDependencies(self, package_id, extended = False, deptype = None, - exclude_deptypes = None): + exclude_deptypes = None, resolve_conditional_deps = True): """ Reimplemented from EntropyRepositoryBase. """ @@ -2983,7 +2994,7 @@ class EntropyRepository(EntropyRepositoryBase): dependencies.iddependency = dependenciesreference.iddependency %s %s""" % ( depstring, excluded_deptypes_query,), searchdata) - return tuple(cur) + return tuple(entropy.dep.expand_dependencies(cur, self)) else: cur = self._cursor().execute(""" SELECT dependenciesreference.dependency @@ -2992,7 +3003,7 @@ class EntropyRepository(EntropyRepositoryBase): dependencies.iddependency = dependenciesreference.iddependency %s %s""" % ( depstring, excluded_deptypes_query,), searchdata) - return self._cur2frozenset(cur) + return frozenset(entropy.dep.expand_dependencies(cur, self)) def retrieveKeywords(self, package_id): """ diff --git a/libraries/entropy/db/skel.py b/libraries/entropy/db/skel.py index 556eb6ce2..b12f26a3e 100644 --- a/libraries/entropy/db/skel.py +++ b/libraries/entropy/db/skel.py @@ -1418,7 +1418,8 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore, object) 'content': content, 'content_safety': self.retrieveContentSafety(package_id), 'dependencies': dict((x, y,) for x, y in \ - self.retrieveDependencies(package_id, extended = True)), + self.retrieveDependencies(package_id, extended = True, + resolve_conditional_deps = False)), 'mirrorlinks': [[x, self.retrieveMirrorData(x)] for x in mirrornames], 'signatures': signatures, 'spm_phases': self.retrieveSpmPhases(package_id), @@ -2273,7 +2274,8 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore, object) """ raise NotImplementedError() - def retrieveDependenciesList(self, package_id, exclude_deptypes = None): + def retrieveDependenciesList(self, package_id, exclude_deptypes = None, + resolve_conditional_deps = True): """ Return list of dependencies, including conflicts for given package identifier. @@ -2284,13 +2286,18 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore, object) data. Please see etpConst['dependency_type_ids'] for valid values. Anything != int will raise AttributeError @type exclude_deptypes: list + @keyword resolve_conditional_deps: resolve conditional dependencies + automatically by default, stuff like + ( app-foo/foo | app-foo/bar ) & bar-baz/foo + @type resolve_conditional_deps: bool @return: list (frozenset) of dependencies of package @rtype: frozenset @raise AttributeError: if exclude_deptypes contains illegal values """ raise NotImplementedError() - def retrieveBuildDependencies(self, package_id, extended = False): + def retrieveBuildDependencies(self, package_id, extended = False, + resolve_conditional_deps = True): """ Return list of build time package dependencies for given package identifier. @@ -2301,12 +2308,17 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore, object) @type package_id: int @keyword extended: return in extended format @type extended: bool + @keyword resolve_conditional_deps: resolve conditional dependencies + automatically by default, stuff like + ( app-foo/foo | app-foo/bar ) & bar-baz/foo + @type resolve_conditional_deps: bool @return: list (frozenset) of build dependencies of package @rtype: frozenset """ raise NotImplementedError() - def retrievePostDependencies(self, package_id, extended = False): + def retrievePostDependencies(self, package_id, extended = False, + resolve_conditional_deps = True): """ Return list of post-merge package dependencies for given package identifier. @@ -2317,12 +2329,17 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore, object) @type package_id: int @keyword extended: return in extended format @type extended: bool + @keyword resolve_conditional_deps: resolve conditional dependencies + automatically by default, stuff like + ( app-foo/foo | app-foo/bar ) & bar-baz/foo + @type resolve_conditional_deps: bool @return: list (frozenset) of post dependencies of package @rtype: frozenset """ raise NotImplementedError() - def retrieveManualDependencies(self, package_id, extended = False): + def retrieveManualDependencies(self, package_id, extended = False, + resolve_conditional_deps = True): """ Return manually added dependencies for given package identifier. Note: this function is just a wrapper of retrieveDependencies() @@ -2332,13 +2349,17 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore, object) @type package_id: int @keyword extended: return in extended format @type extended: bool + @keyword resolve_conditional_deps: resolve conditional dependencies + automatically by default, stuff like + ( app-foo/foo | app-foo/bar ) & bar-baz/foo + @type resolve_conditional_deps: bool @return: list (frozenset) of manual dependencies of package @rtype: frozenset """ raise NotImplementedError() def retrieveDependencies(self, package_id, extended = False, deptype = None, - exclude_deptypes = None): + exclude_deptypes = None, resolve_conditional_deps = True): """ Return dependencies for given package identifier. @@ -2355,6 +2376,10 @@ class EntropyRepositoryBase(TextInterface, EntropyRepositoryPluginStore, object) data. Please see etpConst['dependency_type_ids'] for valid values. Anything != int will raise AttributeError @type exclude_deptypes: list + @keyword resolve_conditional_deps: resolve conditional dependencies + automatically by default, stuff like + ( app-foo/foo | app-foo/bar ) & bar-baz/foo + @type resolve_conditional_deps: bool @return: dependencies of given package @rtype: tuple or frozenset @raise AttributeError: if exclude_deptypes contains illegal values diff --git a/libraries/entropy/server/interfaces/db.py b/libraries/entropy/server/interfaces/db.py index eaca094fd..de0abd578 100644 --- a/libraries/entropy/server/interfaces/db.py +++ b/libraries/entropy/server/interfaces/db.py @@ -212,7 +212,8 @@ class ServerPackagesRepository(EntropyRepository): current_rev = myrev # - manual_deps |= self.retrieveManualDependencies(package_id) + manual_deps |= self.retrieveManualDependencies(package_id, + resolve_conditional_deps = False) # injected packages wouldn't be removed by addPackage self.removePackage(package_id, do_cleanup = False, do_commit = False) @@ -227,7 +228,8 @@ class ServerPackagesRepository(EntropyRepository): ) for r_package_id in removelist: - manual_deps |= self.retrieveManualDependencies(r_package_id) + manual_deps |= self.retrieveManualDependencies(r_package_id, + resolve_conditional_deps = False) self.removePackage(r_package_id, do_cleanup = False, do_commit = False) diff --git a/libraries/entropy/server/interfaces/main.py b/libraries/entropy/server/interfaces/main.py index 939dd7383..0c886a70b 100644 --- a/libraries/entropy/server/interfaces/main.py +++ b/libraries/entropy/server/interfaces/main.py @@ -4260,7 +4260,8 @@ class ServerRepositoryMixin: header = red(" @@ ") ) - manual_deps = sorted(dbconn.retrieveManualDependencies(idpackage)) + manual_deps = sorted(dbconn.retrieveManualDependencies(idpackage, + resolve_conditional_deps = False)) if manual_deps: self.output( "[repo:%s] %s: %s" % ( diff --git a/server/server_reagent.py b/server/server_reagent.py index 30e4b9066..83916e03a 100644 --- a/server/server_reagent.py +++ b/server/server_reagent.py @@ -213,7 +213,8 @@ def _package_dep(entropy_server, args): for idpackage in idpackages: atom = dbconn.retrieveAtom(idpackage) - orig_deps = dbconn.retrieveDependencies(idpackage, extended = True) + orig_deps = dbconn.retrieveDependencies(idpackage, extended = True, + resolve_conditional_deps = False) dep_type_map = dict(orig_deps) def dep_check_cb(s):