From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1RJGPQ-0003J7-Ih for garchives@archives.gentoo.org; Thu, 27 Oct 2011 03:13:36 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 06C8A21C0B4; Thu, 27 Oct 2011 03:13:28 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 305C921C0B4 for ; Thu, 27 Oct 2011 03:13:28 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 62EC31B4021 for ; Thu, 27 Oct 2011 03:13:27 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id 77CA780042 for ; Thu, 27 Oct 2011 03:13:26 +0000 (UTC) From: "Zac Medico" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Zac Medico" Message-ID: Subject: [gentoo-commits] proj/portage:master commit in: pym/portage/, pym/_emerge/ X-VCS-Repository: proj/portage X-VCS-Files: pym/_emerge/actions.py pym/portage/news.py X-VCS-Directories: pym/portage/ pym/_emerge/ X-VCS-Committer: zmedico X-VCS-Committer-Name: Zac Medico X-VCS-Revision: a7f9df6dac32d2efd31b1c84ce10981560913282 Date: Thu, 27 Oct 2011 03:13:26 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: X-Archives-Hash: 8eff4de9106a30a5984cf8409ef7bb19 commit: a7f9df6dac32d2efd31b1c84ce10981560913282 Author: Zac Medico gentoo org> AuthorDate: Thu Oct 27 03:13:12 2011 +0000 Commit: Zac Medico gentoo org> CommitDate: Thu Oct 27 03:13:12 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/portage.git;a= =3Dcommit;h=3Da7f9df6d Add public news functions for bug #388233. count_unread_news(portdb, vardb, repos=3DNone, update=3DTrue) display_news_notifications(news_counts) --- pym/_emerge/actions.py | 78 +++++++-----------------------------------= ------ pym/portage/news.py | 72 ++++++++++++++++++++++++++++++++++++++++++= +- 2 files changed, 82 insertions(+), 68 deletions(-) diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 5485d75..88f5958 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -21,16 +21,20 @@ import time from itertools import chain =20 import portage +portage.proxy.lazyimport.lazyimport(globals(), + 'portage.news:count_unread_news,display_news_notifications', +) + from portage import os from portage import subprocess_getstatusoutput from portage import _unicode_decode from portage.cache.cache_errors import CacheError -from portage.const import GLOBAL_CONFIG_PATH, NEWS_LIB_PATH +from portage.const import GLOBAL_CONFIG_PATH from portage.const import _ENABLE_DYN_LINK_MAP, _ENABLE_SET_CONFIG from portage.dbapi.dep_expand import dep_expand from portage.dbapi._expand_new_virt import expand_new_virt from portage.dep import Atom, extended_cp_match -from portage.exception import InvalidAtom, PermissionDenied +from portage.exception import InvalidAtom from portage.output import blue, bold, colorize, create_color_func, dark= green, \ red, yellow good =3D create_color_func("GOOD") @@ -3021,46 +3025,12 @@ def chk_updated_cfg_files(eroot, config_protect): print(" "+yellow("*")+" man page to learn how to update config files."= ) =20 def display_news_notification(root_config, myopts): - target_root =3D root_config.settings['EROOT'] - trees =3D root_config.trees - settings =3D trees["vartree"].settings - portdb =3D trees["porttree"].dbapi - vardb =3D trees["vartree"].dbapi - NEWS_PATH =3D os.path.join("metadata", "news") - UNREAD_PATH =3D os.path.join(target_root, NEWS_LIB_PATH, "news") - newsReaderDisplay =3D False - if "news" not in settings.features: + if "news" not in root_config.settings.features: return - - permission_msgs =3D set() - for repo in portdb.getRepositories(): - try: - unreadItems =3D checkUpdatedNewsItems( - portdb, vardb, NEWS_PATH, UNREAD_PATH, repo, update=3DTrue) - except PermissionDenied as e: - # NOTE: The NewsManager typically handles permission errors by - # returning silently, so PermissionDenied won't necessarily be - # raised even if we do trigger a permission error above. - msg =3D _unicode_decode("Permission denied: '%s'\n") % (e,) - if msg in permission_msgs: - pass - else: - permission_msgs.add(msg) - writemsg_level(msg, level=3Dlogging.ERROR, noiselevel=3D-1) - unreadItems =3D None - - if unreadItems: - if not newsReaderDisplay: - newsReaderDisplay =3D True - print() - print(colorize("WARN", " * IMPORTANT:"), end=3D' ') - print("%s news items need reading for repository '%s'." % (unreadItem= s, repo)) - - - if newsReaderDisplay: - print(colorize("WARN", " *"), end=3D' ') - print("Use " + colorize("GOOD", "eselect news") + " to read news items= .") - print() + portdb =3D root_config.trees["porttree"].dbapi + vardb =3D root_config.trees["vartree"].dbapi + news_counts =3D count_unread_news(portdb, vardb) + display_news_notifications(news_counts) =20 def getgccversion(chost): """ @@ -3092,29 +3062,3 @@ def getgccversion(chost): =20 portage.writemsg(gcc_not_found_error, noiselevel=3D-1) return "[unavailable]" - -def checkUpdatedNewsItems(portdb, vardb, NEWS_PATH, UNREAD_PATH, repo_id= , - update=3DFalse): - """ - Examines news items in repodir + '/' + NEWS_PATH and attempts to find u= nread items - Returns the number of unread (yet relevent) items. - - @param portdb: a portage tree database - @type portdb: pordbapi - @param vardb: an installed package database - @type vardb: vardbapi - @param NEWS_PATH: - @type NEWS_PATH: - @param UNREAD_PATH: - @type UNREAD_PATH: - @param repo_id: - @type repo_id: - @rtype: Integer - @returns: - 1. The number of unread but relevant news items. - - """ - from portage.news import NewsManager - manager =3D NewsManager(portdb, vardb, NEWS_PATH, UNREAD_PATH) - return manager.getUnreadItems( repo_id, update=3Dupdate ) - diff --git a/pym/portage/news.py b/pym/portage/news.py index 13d6832..24b5107 100644 --- a/pym/portage/news.py +++ b/pym/portage/news.py @@ -2,24 +2,30 @@ # Copyright 2006-2011 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 =20 +from __future__ import print_function + __all__ =3D ["NewsManager", "NewsItem", "DisplayRestriction", "DisplayProfileRestriction", "DisplayKeywordRestriction", - "DisplayInstalledRestriction"] + "DisplayInstalledRestriction", + "count_unread_news", "display_news_notifications"] =20 import io import logging import os as _os import re +from portage import OrderedDict from portage import os from portage import _encodings from portage import _unicode_decode from portage import _unicode_encode +from portage.const import NEWS_LIB_PATH from portage.util import apply_secpass_permissions, ensure_dirs, \ grabfile, normalize_path, write_atomic, writemsg_level from portage.data import portage_gid from portage.dep import isvalidatom from portage.localization import _ from portage.locks import lockfile, unlockfile +from portage.output import colorize from portage.exception import InvalidLocation, OperationNotPermitted, \ PermissionDenied =20 @@ -349,3 +355,67 @@ class DisplayInstalledRestriction(DisplayRestriction= ): if vdb.match(self.atom): return True return False + +def count_unread_news(portdb, vardb, repos=3DNone, update=3DTrue): + """ + Returns a dictionary mapping repos to integer counts of unread news ite= ms. + By default, this will scan all repos and check for new items that have + appeared since the last scan. + + @param portdb: a portage tree database + @type portdb: pordbapi + @param vardb: an installed package database + @type vardb: vardbapi + @param repos: names of repos to scan (None means to scan all available = repos) + @type repos: list or None + @param update: check for new items (default is True) + @type update: boolean + @rtype: dict + @returns: dictionary mapping repos to integer counts of unread news ite= ms + """ + + NEWS_PATH =3D os.path.join("metadata", "news") + UNREAD_PATH =3D os.path.join(vardb.settings['EROOT'], NEWS_LIB_PATH, "n= ews") + news_counts =3D OrderedDict() + if repos is None: + repos =3D portdb.getRepositories() + + permission_msgs =3D set() + for repo in repos: + try: + manager =3D NewsManager(portdb, vardb, NEWS_PATH, UNREAD_PATH) + count =3D manager.getUnreadItems(repo, update=3DTrue) + except PermissionDenied as e: + # NOTE: The NewsManager typically handles permission errors by + # returning silently, so PermissionDenied won't necessarily be + # raised even if we do trigger a permission error above. + msg =3D _unicode_decode("Permission denied: '%s'\n") % (e,) + if msg in permission_msgs: + pass + else: + permission_msgs.add(msg) + writemsg_level(msg, level=3Dlogging.ERROR, noiselevel=3D-1) + news_counts[repo] =3D 0 + else: + news_counts[repo] =3D count + + return news_counts + +def display_news_notifications(news_counts): + """ + Display a notification for unread news items, using a dictionary mappin= g + repos to integer counts, like that returned from count_unread_news(). + """ + newsReaderDisplay =3D False + for repo, count in news_counts.items(): + if count > 0: + if not newsReaderDisplay: + newsReaderDisplay =3D True + print() + print(colorize("WARN", " * IMPORTANT:"), end=3D' ') + print("%s news items need reading for repository '%s'." % (count, rep= o)) + + if newsReaderDisplay: + print(colorize("WARN", " *"), end=3D' ') + print("Use " + colorize("GOOD", "eselect news") + " to read news items= .") + print()