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 C89E2138E20 for ; Wed, 19 Feb 2014 20:32:09 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 2B904E0BDA; Wed, 19 Feb 2014 20:32:04 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id E2BA9E0BDA for ; Wed, 19 Feb 2014 20:32:02 +0000 (UTC) Received: from localhost.localdomain (c-67-170-82-28.hsd1.wa.comcast.net [67.170.82.28]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: nullishzero@gentoo.org) by smtp.gentoo.org (Postfix) with ESMTPSA id CE7B833FADB; Wed, 19 Feb 2014 20:32:01 +0000 (UTC) From: Pavel Kazakov To: gentoo-portage-dev@lists.gentoo.org Cc: Pavel Kazakov Subject: [gentoo-portage-dev] [PATCH] Add an emaint module that can scan for failed merges and that can fix failed merges. Date: Wed, 19 Feb 2014 12:31:44 -0800 Message-Id: <1392841904-12088-1-git-send-email-nullishzero@gentoo.org> X-Mailer: git-send-email 1.8.3.2 Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-portage-dev@lists.gentoo.org Reply-to: gentoo-portage-dev@lists.gentoo.org X-Archives-Salt: d95e6b08-9d81-4ad8-ac72-80f723c1b67c X-Archives-Hash: 84d69ea8d409f3676ae6813f9ee1ebd8 --- pym/portage/emaint/modules/merges/__init__.py | 20 ++++++++ pym/portage/emaint/modules/merges/merges.py | 70 +++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 pym/portage/emaint/modules/merges/__init__.py create mode 100644 pym/portage/emaint/modules/merges/merges.py diff --git a/pym/portage/emaint/modules/merges/__init__.py b/pym/portage/emaint/modules/merges/__init__.py new file mode 100644 index 0000000..2cd79af --- /dev/null +++ b/pym/portage/emaint/modules/merges/__init__.py @@ -0,0 +1,20 @@ +# Copyright 2005-2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +"""Scan for failed merges and fix them. +""" + + +module_spec = { + 'name': 'merges', + 'description': __doc__, + 'provides':{ + 'module1': { + 'name': "merges", + 'class': "MergesHandler", + 'description': __doc__, + 'functions': ['check', 'fix',], + 'func_desc': {} + } + } + } diff --git a/pym/portage/emaint/modules/merges/merges.py b/pym/portage/emaint/modules/merges/merges.py new file mode 100644 index 0000000..b243082 --- /dev/null +++ b/pym/portage/emaint/modules/merges/merges.py @@ -0,0 +1,70 @@ +# Copyright 2005-2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +import portage +from portage import os +from portage.const import PRIVATE_PATH, VDB_PATH +from portage.util import writemsg + +import shutil +import sys + +if sys.hexversion >= 0x3000000: + # pylint: disable=W0622 + long = int + +class MergesHandler(object): + + short_desc = "Remove failed merges" + + def name(): + return "merges" + name = staticmethod(name) + + def __init__(self): + self._eroot = portage.settings['EROOT'] + self._vardb = portage.db[self._eroot]["vartree"].dbapi + self._vardb_path = os.path.join(self._eroot, VDB_PATH) + os.path.sep + + def can_progressbar(self, func): + return True + + def _failed_packages(self, onProgress): + for cat in os.listdir(self._vardb_path): + pkgs = os.listdir(self._vardb_path + cat) + maxval = len(pkgs) + for i, pkg in enumerate(pkgs): + if onProgress: + onProgress(maxval, i+1) + + if '-MERGING-' in pkg: + yield cat + os.path.sep + pkg + + def check(self, **kwargs): + onProgress = kwargs.get('onProgress', None) + failed_pkgs = [] + for pkg in self._failed_packages(onProgress): + failed_pkgs.append(pkg) + + errors = ["'%s' failed to merge." % x for x in failed_pkgs] + return errors + + def fix(self, **kwargs): + onProgress = kwargs.get('onProgress', None) + tracking_path = os.path.join(self._eroot, PRIVATE_PATH, 'failed-merges'); + try: + with open(tracking_path, 'w') as tracking_file: + for failed_pkg in self._failed_packages(onProgress): + tracking_file.write(failed_pkg + '\n') + pkg_path = self._vardb_path + failed_pkg + # Delete failed merge directory + # XXX: Would be a good idea to attempt try removing + # package contents to prevent orphaned files + shutil.rmtree(pkg_path) + # Re-emerge package + pkg_name = '=' + failed_pkg.replace('-MERGING-', '') + features='FEATURES="-collision-detect -protect-owned"' + emerge_cmd="emerge --verbose --oneshot --complete-graph=y" + os.system('%s %s %s' % (features, emerge_cmd, pkg_name)) + except Exception as ex: + writemsg('Unable to fix failed package: %s' % str(ex)) -- 1.8.3.2