From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 6981E1396D0 for ; Mon, 11 Sep 2017 21:44:03 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 74EC31FC0F7; Mon, 11 Sep 2017 21:43:57 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 3DF751FC0EB for ; Mon, 11 Sep 2017 21:43:57 +0000 (UTC) Received: from oystercatcher.gentoo.org (unknown [IPv6:2a01:4f8:202:4333:225:90ff:fed9:fc84]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 478013417E8 for ; Mon, 11 Sep 2017 21:43:56 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 86D0F908E for ; Mon, 11 Sep 2017 21:43:52 +0000 (UTC) From: "Brian Dolbec" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Brian Dolbec" Message-ID: <1505146397.4cdcaf7ffc9a03e5113f76e7f7860275615166c5.dolsen@gentoo> Subject: [gentoo-commits] proj/portage:repoman commit in: pym/portage/ X-VCS-Repository: proj/portage X-VCS-Files: pym/portage/module.py X-VCS-Directories: pym/portage/ X-VCS-Committer: dolsen X-VCS-Committer-Name: Brian Dolbec X-VCS-Revision: 4cdcaf7ffc9a03e5113f76e7f7860275615166c5 X-VCS-Branch: repoman Date: Mon, 11 Sep 2017 21:43:52 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: b0f105a7-5ad9-4c58-b3a5-b0f31af632be X-Archives-Hash: 815ce66e3ab2568107c7cb1d3082b164 commit: 4cdcaf7ffc9a03e5113f76e7f7860275615166c5 Author: Brian Dolbec gentoo org> AuthorDate: Thu Aug 17 01:50:21 2017 +0000 Commit: Brian Dolbec gentoo org> CommitDate: Mon Sep 11 16:13:17 2017 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=4cdcaf7f module.py: Extend the module loader for API version checking If provided with an iterable of compatibility versions, The controller will check the plugin modules module_spec 'version' variable is compatible with the base application. pym/portage/module.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/pym/portage/module.py b/pym/portage/module.py index 00f322387..f5116b6f5 100644 --- a/pym/portage/module.py +++ b/pym/portage/module.py @@ -15,6 +15,10 @@ class InvalidModuleName(PortageException): """An invalid or unknown module name.""" +class ModuleVersionError(PortageException): + '''An incompatible module version''' + + class Module(object): """Class to define and hold our plug-in module @@ -87,16 +91,17 @@ class Modules(object): @param namepath: Python import path to the "modules" directory """ - def __init__(self, path, namepath): + def __init__(self, path, namepath, compat_versions=None): self._module_path = path self._namepath = namepath + self.compat_versions = compat_versions self.parents = [] self._modules = self._get_all_modules() self.modules = ProtectedDict(self._modules) self.module_names = sorted(self._modules) def _get_all_modules(self): - """scans the emaint modules dir for loadable modules + """scans the _module_path dir for loadable modules @rtype: dictionary of module_plugins """ @@ -117,6 +122,7 @@ class Modules(object): kids = {} for entry in importables: new_module = Module(entry, self._namepath) + self._check_compat(new_module) for module_name in new_module.kids: kid = new_module.kids[module_name] kid['parent'] = new_module @@ -211,6 +217,8 @@ class Modules(object): @type modname: string @param modname: the module class name + @type var: string + @param var: the base level variable to return @type dictionary @return: the modules class exported options descriptions """ @@ -220,3 +228,13 @@ class Modules(object): raise InvalidModuleName( "Module name '%s' was invalid or not found" % modname) return value + + def _check_compat(self, module): + if self.compat_versions: + if not module.module_spec['version'] in self.compat_versions: + raise ModuleVersionError( + "Error loading '%s' plugin module: %s, version: %s\n" + "Module is not compatible with the current application version\n" + "Compatible module API versions are: %s" + % (self._namepath, module.module_spec['name'], + module.module_spec['version'], self.compat_versions))