diff --git a/pisi/db/installdb.py b/pisi/db/installdb.py index 308fd13c..244fc035 100644 --- a/pisi/db/installdb.py +++ b/pisi/db/installdb.py @@ -110,10 +110,7 @@ class InstallDB(lazydb.LazyDB): found.append(name) return found - def get_version(self, package): - metadata_xml = os.path.join(self.package_path(package), ctx.const.metadata_xml) - - meta_doc = piksemel.parse(metadata_xml) + def __get_version(self, meta_doc): history = meta_doc.getTag("Package").getTag("History") build = meta_doc.getTag("Package").getTagData("Build") version = history.getTag("Update").getTagData("Version") @@ -121,6 +118,22 @@ class InstallDB(lazydb.LazyDB): return version, release, build and int(build) + def __get_distro_release(self, meta_doc): + distro = meta_doc.getTag("Package").getTagData("Distribution") + release = meta_doc.getTag("Package").getTagData("DistributionRelease") + + return distro, release + + def get_version_and_distro_release(self, package): + metadata_xml = os.path.join(self.package_path(package), ctx.const.metadata_xml) + meta_doc = piksemel.parse(metadata_xml) + return self.__get_version(meta_doc) + self.__get_distro_release(meta_doc) + + def get_version(self, package): + metadata_xml = os.path.join(self.package_path(package), ctx.const.metadata_xml) + meta_doc = piksemel.parse(metadata_xml) + return self.__get_version(meta_doc) + def get_files(self, package): files = pisi.files.Files() files_xml = os.path.join(self.package_path(package), ctx.const.files_xml) diff --git a/pisi/db/packagedb.py b/pisi/db/packagedb.py index 298a657d..a3662d9e 100644 --- a/pisi/db/packagedb.py +++ b/pisi/db/packagedb.py @@ -97,17 +97,33 @@ class PackageDB(lazydb.LazyDB): found.append(name) return found + def __get_version(self, meta_doc): + history = meta_doc.getTag("History") + build = meta_doc.getTagData("Build") + version = history.getTag("Update").getTagData("Version") + release = history.getTag("Update").getAttribute("release") + + return version, release, build and int(build) + + def __get_distro_release(self, meta_doc): + distro = meta_doc.getTagData("Distribution") + release = meta_doc.getTagData("DistributionRelease") + + return distro, release + + def get_version_and_distro_release(self, name, repo): + if not self.has_package(name, repo): + raise Exception(_('Package %s not found.') % name) + + pkg_doc = piksemel.parseString(self.pdb.get_item(name, repo)) + return self.__get_version(pkg_doc) + self.__get_distro_release(pkg_doc) + def get_version(self, name, repo): if not self.has_package(name, repo): raise Exception(_('Package %s not found.') % name) pkg_doc = piksemel.parseString(self.pdb.get_item(name, repo)) - history = pkg_doc.getTag("History") - build = pkg_doc.getTagData("Build") - version = history.getTag("Update").getTagData("Version") - release = history.getTag("Update").getAttribute("release") - - return version, release, build and int(build) + return self.__get_version(pkg_doc) def get_package_repo(self, name, repo=None): pkg, repo = self.pdb.get_item_repo(name, repo) diff --git a/pisi/operations/upgrade.py b/pisi/operations/upgrade.py index df2d2960..65db608e 100644 --- a/pisi/operations/upgrade.py +++ b/pisi/operations/upgrade.py @@ -262,16 +262,18 @@ def is_upgradable(name, ignore_build = False): if not installdb.has_package(name): return False - (i_version, i_release, i_build) = installdb.get_version(name) + (i_version, i_release, i_build, i_distro, i_distro_release) = installdb.get_version_and_distro_release(name) try: - version, release, build = packagedb.get_version(name, packagedb.which_repo(name)) + version, release, build, distro, distro_release = packagedb.get_version_and_distro_release(name, packagedb.which_repo(name)) except KeyboardInterrupt: raise except Exception: #FIXME: what exception could we catch here, replace with that. return False - if ignore_build or (not i_build) or (not build): + if distro == i_distro and pisi.version.Version(distro_release) > pisi.version.Version(i_distro_release): + return True + elif ignore_build or (not i_build) or (not build): return pisi.version.Version(i_release) < pisi.version.Version(release) else: return i_build < build