From 857a6c037dc808985c37786288f93033d8f5325b Mon Sep 17 00:00:00 2001 From: Faik Uygur Date: Mon, 20 Apr 2009 09:37:37 +0000 Subject: [PATCH] Objectify dependency operations into Dependency class for implementing AnyDependency --- pisi/api.py | 2 +- pisi/dependency.py | 47 +++++++------------------------------- pisi/operations/build.py | 4 ++-- pisi/operations/emerge.py | 4 ++-- pisi/operations/install.py | 9 ++++---- pisi/operations/remove.py | 2 +- pisi/operations/upgrade.py | 8 +++---- pisi/specfile.py | 11 ++++++--- 8 files changed, 30 insertions(+), 57 deletions(-) diff --git a/pisi/api.py b/pisi/api.py index 3a685744..2925fa88 100644 --- a/pisi/api.py +++ b/pisi/api.py @@ -497,7 +497,7 @@ def package_graph(A, packagedb, ignore_installed = False): #print pkg for dep in pkg.runtimeDependencies(): if ignore_installed: - if dependency.installed_satisfies_dep(dep): + if dep.satisfied_by_installed(): continue if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) diff --git a/pisi/dependency.py b/pisi/dependency.py index cee00ad9..b31b589d 100644 --- a/pisi/dependency.py +++ b/pisi/dependency.py @@ -46,44 +46,13 @@ class Dependency(pisi.relation.Relation): (version, release) = (pkg.version, pkg.release) return self.satisfies_relation(version, release) -def installed_satisfies_dep(depinfo): - """determine if a package in *repository* satisfies given -dependency spec""" - return pisi.relation.installed_package_satisfies(depinfo) + def satisfied_by_installed(self): + return pisi.relation.installed_package_satisfies(self) -def repo_satisfies_dep(depinfo): - """determine if a package in *repository* satisfies given -dependency spec""" - packagedb = pisi.db.packagedb.PackageDB() - pkg_name = depinfo.package - if not packagedb.has_package(pkg_name): - return False - else: - pkg = packagedb.get_package(pkg_name) - (version, release) = (pkg.version, pkg.release) - return depinfo.satisfies_relation(version, release) - -def satisfies_dependencies(pkg, deps, sat = installed_satisfies_dep): - for dep in deps: - if not sat(dep): - ctx.ui.error(_('%s dependency of package %s is not satisfied') % - (dep, pkg)) + def satisfied_by_repo(self): + packagedb = pisi.db.packagedb.PackageDB() + if not packagedb.has_package(self.package): return False - return True - -def satisfies_runtime_deps(pkg): - packagedb = pisi.db.packagedb.PackageDB() - deps = packagedb.get_package(pkg).runtimeDependencies() - return satisfies_dependencies(pkg, deps) - -def installable(pkg): - """calculate if pkg name is installable currently - which means it has to satisfy both install and runtime dependencies""" - packagedb = pisi.db.packagedb.PackageDB() - if not packagedb.has_package(pkg): - ctx.ui.info(_("Package %s is not present in the package database") % pkg); - return False - elif satisfies_runtime_deps(pkg): - return True - else: - return False + else: + pkg = packagedb.get_package(self.package) + return self.satisfies_relation(pkg.version, pkg.release) diff --git a/pisi/operations/build.py b/pisi/operations/build.py index b09c8423..61316345 100644 --- a/pisi/operations/build.py +++ b/pisi/operations/build.py @@ -554,7 +554,7 @@ class Builder: # find out the build dependencies that are not satisfied... dep_unsatis = [] for dep in build_deps: - if not dependency.installed_satisfies_dep(dep): + if not dep.satisfied_by_installed(): dep_unsatis.append(dep) if dep_unsatis: @@ -566,7 +566,7 @@ class Builder: if not ctx.config.get_option('ignore_dependency'): for dep in dep_unsatis: - if not dependency.repo_satisfies_dep(dep): + if not dep.satisfied_by_repo(): raise Error(_('Build dependency %s cannot be satisfied') % str(dep)) if ctx.ui.confirm( _('Do you want to install the unsatisfied build dependencies')): diff --git a/pisi/operations/emerge.py b/pisi/operations/emerge.py index cfda2d6f..c08df2cc 100644 --- a/pisi/operations/emerge.py +++ b/pisi/operations/emerge.py @@ -117,8 +117,8 @@ def plan_emerge(A): # add dependencies def process_dep(dep): - if not dependency.installed_satisfies_dep(dep): - if dependency.repo_satisfies_dep(dep): + if not dep.satisfied_by_installed(): + if dep.satisfied_by_repo(): install_list.add(dep.package) return srcdep = pkgtosrc(dep.package) diff --git a/pisi/operations/install.py b/pisi/operations/install.py index 665fa24d..7fa035ce 100644 --- a/pisi/operations/install.py +++ b/pisi/operations/install.py @@ -129,8 +129,7 @@ def install_pkg_files(package_URIs, reinstall = False): def satisfiesDep(dep): # is dependency satisfied among available packages # or packages to be installed? - return dependency.installed_satisfies_dep(dep) \ - or dep.satisfied_by_dict_repo(d_t) + return dep.satisfied_by_installed() or dep.satisfied_by_dict_repo(d_t) # for this case, we have to determine the dependencies # that aren't already satisfied and try to install them @@ -146,7 +145,7 @@ def install_pkg_files(package_URIs, reinstall = False): # now determine if these unsatisfied dependencies could # be satisfied by installing packages from the repo for dep in dep_unsatis: - if not dependency.repo_satisfies_dep(dep): + if not dep.satisfied_by_repo(): raise Exception(_('External dependencies not satisfied: %s') % dep) # if so, then invoke install_pkg_names @@ -232,8 +231,8 @@ def plan_install_pkg_names(A, ignore_package_conflicts = False): for dep in pkg.runtimeDependencies(): ctx.ui.debug('checking %s' % str(dep)) # we don't deal with already *satisfied* dependencies - if not dependency.installed_satisfies_dep(dep): - if not dependency.repo_satisfies_dep(dep): + if not dep.satisfied_by_installed(): + if not dep.satisfied_by_repo(): raise Exception(_('%s dependency of package %s is not satisfied') % (dep, pkg.name)) if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) diff --git a/pisi/operations/remove.py b/pisi/operations/remove.py index fc8b1d3d..1aa9a8dc 100644 --- a/pisi/operations/remove.py +++ b/pisi/operations/remove.py @@ -104,7 +104,7 @@ def plan_remove(A): for (rev_dep, depinfo) in rev_deps: # we don't deal with uninstalled rev deps # and unsatisfied dependencies (this is important, too) - if installdb.has_package(rev_dep) and dependency.installed_satisfies_dep(depinfo): + if installdb.has_package(rev_dep) and depinfo.satisfied_by_installed(): if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) diff --git a/pisi/operations/upgrade.py b/pisi/operations/upgrade.py index 23bf1a1a..4f329507 100644 --- a/pisi/operations/upgrade.py +++ b/pisi/operations/upgrade.py @@ -194,10 +194,10 @@ def plan_upgrade(A): pkg = packagedb.get_package(x) for dep in pkg.runtimeDependencies(): # add packages that can be upgraded - if installdb.has_package(dep.package) and dependency.installed_satisfies_dep(dep): + if installdb.has_package(dep.package) and dep.satisfied_by_installed(): continue - if dependency.repo_satisfies_dep(dep): + if dep.satisfied_by_repo(): if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) G_f.add_dep(x, dep) @@ -217,8 +217,8 @@ def plan_upgrade(A): for (rev_dep, depinfo) in rev_deps: # add only installed but unsatisfied reverse dependencies if (installdb.has_package(rev_dep) and - not dependency.installed_satisfies_dep(depinfo) and is_upgradable(rev_dep)): - if not dependency.repo_satisfies_dep(depinfo): + not depinfo.satisfied_by_installed() and is_upgradable(rev_dep)): + if not depinfo.satisfied_by_repo(): raise Exception(_('Reverse dependency %s of %s cannot be satisfied') % (rev_dep, x)) if not rev_dep in G_f.vertices(): Bp.add(rev_dep) diff --git a/pisi/specfile.py b/pisi/specfile.py index a920e1b7..2496b7f3 100644 --- a/pisi/specfile.py +++ b/pisi/specfile.py @@ -157,7 +157,6 @@ class Archive: s = _('URI: %s, type: %s, sha1sum: %s') % (self.uri, self.type, self.sha1sum) return s - class Source: t_Name = [autoxml.String, autoxml.mandatory] @@ -214,10 +213,16 @@ class Package: return util.join_path(ctx.config.packages_dir(), packageDir) + def satisfies_runtime_dependencies(self): + for dep in self.runtimeDependencies(): + if not dep.satisfied_by_installed(): + ctx.ui.error(_('%s dependency of package %s is not satisfied') % (dep, self.name)) + return False + return True + def installable(self): """calculate if pkg is installable currently""" - deps = self.runtimeDependencies() - return pisi.dependency.satisfies_dependencies(self.name, deps) + return self.satisfies_runtime_dependencies() def __str__(self): if self.build: