Handle requirements for package defined in platform manifest

This commit is contained in:
Ivan Kravets
2017-01-25 02:08:20 +02:00
parent d64f4778df
commit 162caf61a2
2 changed files with 53 additions and 24 deletions

View File

@ -435,15 +435,13 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
continue continue
elif not pkg_id and manifest['name'] != name: elif not pkg_id and manifest['name'] != name:
continue continue
elif not reqspec and requirements: elif not reqspec and (requirements or url):
conds = [ conds = [
requirements == manifest['version'], requirements == manifest['version'], url and
"://" in requirements and url in manifest.get("url", "")
requirements in manifest.get("url", "")
] ]
if any(conds): if not best or any(conds):
best = manifest best = manifest
break
continue continue
try: try:
if reqspec and not reqspec.match( if reqspec and not reqspec.match(
@ -458,13 +456,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
except ValueError: except ValueError:
pass pass
if best: return best
# check that URL is the same in installed package (VCS)
if url and best.get("url") != url:
return None
return best
return None
def get_package_dir(self, name, requirements=None, url=None): def get_package_dir(self, name, requirements=None, url=None):
package = self.get_package(name, requirements, url) package = self.get_package(name, requirements, url)

View File

@ -207,45 +207,82 @@ class PlatformPackagesMixin(object):
raise exception.UnknownPackage(", ".join(upkgs - ppkgs)) raise exception.UnknownPackage(", ".join(upkgs - ppkgs))
for name, opts in self.packages.items(): for name, opts in self.packages.items():
version = opts.get("version", "")
if name in without_packages: if name in without_packages:
continue continue
elif (name in with_packages or elif (name in with_packages or
not (skip_default_package or opts.get("optional", False))): not (skip_default_package or opts.get("optional", False))):
if any([s in opts.get("version", "") for s in ("\\", "/")]): if self.validate_version_requirements(version):
self.pm.install( self.pm.install(name, version, silent=silent)
"%s=%s" % (name, opts['version']), silent=silent)
else: else:
self.pm.install(name, opts.get("version"), silent=silent) requirements = None
if "@" in version:
version, requirements = version.rsplit("@", 1)
self.pm.install(
"%s=%s" % (name, version), requirements, silent=silent)
return True return True
def get_installed_packages(self): def get_installed_packages(self):
items = {} items = {}
for name, opts in self.packages.items(): for name, opts in self.packages.items():
package = self.pm.get_package(name, opts['version']) version = opts.get("version", "")
if self.validate_version_requirements(version):
package = self.pm.get_package(name, version)
else:
package = self.pm.get_package(*self._parse_pkg_name(name,
version))
if package: if package:
items[name] = package items[name] = package
return items return items
def update_packages(self, only_check=False): def update_packages(self, only_check=False):
for name in self.get_installed_packages(): for name in self.get_installed_packages():
self.pm.update(name, self.packages[name]['version'], only_check) version = self.packages[name].get("version", "")
if self.validate_version_requirements(version):
self.pm.update(name, version, only_check)
else:
requirements = None
if "@" in version:
version, requirements = version.rsplit("@", 1)
self.pm.update("%s=%s" % (name, version), requirements,
only_check)
def are_outdated_packages(self): def are_outdated_packages(self):
for name, opts in self.get_installed_packages().items(): for name, opts in self.get_installed_packages().items():
if (opts['version'] != self.pm.get_latest_repo_version( version = self.packages[name].get("version", "")
name, self.packages[name].get("version"))): if not self.validate_version_requirements(version):
continue
if self.pm.is_outdated(name, version):
return True return True
return False return False
def get_package_dir(self, name): def get_package_dir(self, name):
return self.pm.get_package_dir(name, version = self.packages[name].get("version", "")
self.packages[name].get("version")) if self.validate_version_requirements(version):
return self.pm.get_package_dir(name, version)
else:
return self.pm.get_package_dir(*self._parse_pkg_name(name,
version))
def get_package_version(self, name): def get_package_version(self, name):
package = self.pm.get_package(name, self.packages[name].get("version")) version = self.packages[name].get("version", "")
if self.validate_version_requirements(version):
package = self.pm.get_package(name, version)
else:
package = self.pm.get_package(*self._parse_pkg_name(name, version))
return package['version'] if package else None return package['version'] if package else None
@staticmethod
def validate_version_requirements(requirements):
return requirements and "://" not in requirements
def _parse_pkg_name(self, name, version):
requirements = None
if "@" in version:
version, requirements = version.rsplit("@", 1)
return self.pm.parse_pkg_name("%s=%s" % (name, version), requirements)
class PlatformRunMixin(object): class PlatformRunMixin(object):