From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 33A2E1381F3 for ; Sun, 15 Sep 2013 17:46:13 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 36774E0C28; Sun, 15 Sep 2013 17:46:11 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 93DA8E0C23 for ; Sun, 15 Sep 2013 17:46:10 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 6F4EC33EA75 for ; Sun, 15 Sep 2013 17:46:09 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 205EAE530A for ; Sun, 15 Sep 2013 17:46:08 +0000 (UTC) From: "Jauhien Piatlicki" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Jauhien Piatlicki" Message-ID: <1379259404.345f07d064f1c8fe38bd4a1c793b877afd95d6c4.jauhien@gentoo> Subject: [gentoo-commits] proj/g-sorcery:master commit in: g_sorcery/ X-VCS-Repository: proj/g-sorcery X-VCS-Files: g_sorcery/backend.py X-VCS-Directories: g_sorcery/ X-VCS-Committer: jauhien X-VCS-Committer-Name: Jauhien Piatlicki X-VCS-Revision: 345f07d064f1c8fe38bd4a1c793b877afd95d6c4 X-VCS-Branch: master Date: Sun, 15 Sep 2013 17:46:08 +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: f98ff99b-f823-4091-a212-e8428ecadc60 X-Archives-Hash: a1128a049c1bf058455e95d4bf3d7542 commit: 345f07d064f1c8fe38bd4a1c793b877afd95d6c4 Author: Jauhien Piatlicki (jauhien) gmail com> AuthorDate: Sun Sep 15 15:36:44 2013 +0000 Commit: Jauhien Piatlicki gmail com> CommitDate: Sun Sep 15 15:36:44 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/g-sorcery.git;a=commit;h=345f07d0 add a list of ebuilds to be generated automatically --- g_sorcery/backend.py | 129 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 80 insertions(+), 49 deletions(-) diff --git a/g_sorcery/backend.py b/g_sorcery/backend.py index 686cda0..76c8cd2 100644 --- a/g_sorcery/backend.py +++ b/g_sorcery/backend.py @@ -23,7 +23,7 @@ else: from .g_collections import Package, elist from .fileutils import fast_manifest, FileJSON -from .exceptions import DependencyError, DigestError +from .exceptions import DependencyError, DigestError, InvalidKeyError from .logger import Logger from .mangler import package_managers from .package_db import PackageDB @@ -225,46 +225,8 @@ class Backend(object): pkgname = args.pkgname - parts = pkgname.split('/') - - category = None - - if len(parts) == 1: - name = parts[0] - elif len(parts) == 2: - category = parts[0] - name = parts[1] - else: - self.logger.error('bad package name: ' + pkgname + '\n') - return -1 - - if not category: - all_categories = pkg_db.list_categories() - categories = [] - for cat in all_categories: - if pkg_db.in_category(cat, name): - categories.append(cat) - - if not len(categories): - self.logger.error('no package with name ' \ - + pkgname + ' found\n') - return -1 - - if len(categories) > 1: - self.logger.error('ambiguous packagename: ' + pkgname + '\n') - self.logger.error('please select one of' \ - + 'the following packages:\n') - for cat in categories: - self.logger.error(' ' + cat + '/' + pkgname + '\n') - return -1 - - category = categories[0] - versions = pkg_db.list_package_versions(category, name) - dependencies = set() try: - for version in versions: - dependencies |= self.solve_dependencies(pkg_db, - Package(category, name, version))[0] + dependencies = self.get_dependencies(pkg_db, pkgname) except Exception as e: self.logger.error('dependency solving failed: ' + str(e) + '\n') return -1 @@ -349,6 +311,48 @@ class Backend(object): f.write('\n'.join(source)) + def get_dependencies(self, package_db, pkgname): + parts = pkgname.split('/') + category = None + if len(parts) == 1: + name = parts[0] + elif len(parts) == 2: + category = parts[0] + name = parts[1] + else: + error = 'bad package name: ' + pkgname + self.logger.error(error + '\n') + raise DependencyError(error) + + if not category: + all_categories = package_db.list_categories() + categories = [] + for cat in all_categories: + if package_db.in_category(cat, name): + categories.append(cat) + + if not len(categories): + error = 'no package with name ' \ + + pkgname + ' found' + self.logger.error(error + '\n') + raise DependencyError(error) + + if len(categories) > 1: + self.logger.error('ambiguous packagename: ' + pkgname + '\n') + self.logger.error('please select one of' \ + + 'the following packages:\n') + for cat in categories: + self.logger.error(' ' + cat + '/' + pkgname + '\n') + raise DependencyError("ambiguous packagename") + + category = categories[0] + versions = package_db.list_package_versions(category, name) + dependencies = set() + for version in versions: + dependencies |= self.solve_dependencies(package_db, + Package(category, name, version))[0] + return dependencies + def solve_dependencies(self, package_db, package, solved_deps=None, unsolved_deps=None): """ @@ -385,16 +389,24 @@ class Backend(object): if not found: error = "package " + package.category + '/' + \ package.name + '-' + package.version + " not found" - raise DependencyError(error) - + self.logger.error(error) + # at the moment ignore unsolved dependencies, as those deps can be in other repo + # or can be external: portage will catch it + unsolved_deps.remove(package) + return (solved_deps, unsolved_deps) + dependencies = desc["dependencies"] for pkg in dependencies: - versions = package_db.list_package_versions(pkg.category, + try: + versions = package_db.list_package_versions(pkg.category, pkg.package) - for version in versions: - solved_deps, unsolved_deps = self.solve_dependencies(package_db, + for version in versions: + solved_deps, unsolved_deps = self.solve_dependencies(package_db, Package(pkg.category, pkg.package, version), solved_deps, unsolved_deps) + except InvalidKeyError: + # ignore non existing packages + continue solved_deps.add(package) unsolved_deps.remove(package) @@ -441,6 +453,11 @@ class Backend(object): Returns: Exit status. """ + try: + packages = global_config.get(config["backend"], args.repository + "_packages").split(" ") + except Exception: + packages = [] + self.logger.info("tree generation") overlay = self._get_overlay(args, config, global_config) pkg_db = self._get_package_db(args, config, global_config) @@ -465,8 +482,22 @@ class Backend(object): else: ebuild_g = self.ebuild_g_without_digest_class(pkg_db) metadata_g = self.metadata_g_class(pkg_db) - - for package, ebuild_data in pkg_db: + + packages_iter = pkg_db + catpkg_names = pkg_db.list_catpkg_names() + if packages: + dependencies = set() + catpkg_names = set() + packages_dict = {} + for pkg in packages: + dependencies |= self.get_dependencies(pkg_db, pkg) + + for pkg in dependencies: + catpkg_names |= set([pkg.category + '/' + pkg.name]) + packages_dict[pkg] = pkg_db.get_package_description(pkg) + packages_iter = packages_dict.items() + + for package, ebuild_data in packages_iter: category = package.category name = package.name version = package.version @@ -498,7 +529,7 @@ class Backend(object): if args.digest: self.digest(overlay) else: - pkgnames = pkg_db.list_catpkg_names() + pkgnames = catpkg_names self.fast_digest(overlay, pkgnames) def install(self, args, config, global_config): @@ -516,7 +547,7 @@ class Backend(object): self.generate(args, config, global_config) try: package_manager = global_config.get("main", "package_manager") - except configparser.NoOptionError: + except configparser.NoOptionError: package_manager_class = package_managers["portage"] package_manager = None if package_manager: