diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-11-12 21:47:24 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-11-12 21:47:24 +0000 |
commit | 40d74003ec5b6e3ed2974e9dcdc588769fd3ef15 (patch) | |
tree | 42023536c8a07e39c20b49c55fc40c75f4b41b7c | |
parent | 6e28eedeb65ea166e8dcca3f0570817703fc53ed (diff) | |
download | portage-40d74003ec5b6e3ed2974e9dcdc588769fd3ef15.tar.gz portage-40d74003ec5b6e3ed2974e9dcdc588769fd3ef15.tar.bz2 portage-40d74003ec5b6e3ed2974e9dcdc588769fd3ef15.zip |
* Add NewsItem.isValid() and DisplayRestriction.isValid() methods and use
use them to check validity inside NewsManager.updateItems().
* Make DisplayInstalledRestriction.isValid() check validity of the atom.
svn path=/main/trunk/; revision=11866
-rw-r--r-- | pym/portage/news.py | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/pym/portage/news.py b/pym/portage/news.py index 0363b7197..d590ae46d 100644 --- a/pym/portage/news.py +++ b/pym/portage/news.py @@ -8,11 +8,13 @@ __all__ = ["NewsManager", "NewsItem", "DisplayRestriction", "DisplayInstalledRestriction"] import errno +import logging import os import re from portage.util import apply_permissions, ensure_dirs, grabfile, \ - grablines, normalize_path, write_atomic + grablines, normalize_path, write_atomic, writemsg_level from portage.data import portage_gid +from portage.dep import isvalidatom from portage.locks import lockfile, unlockfile from portage.exception import OperationNotPermitted @@ -87,6 +89,8 @@ class NewsManager(object): if not os.path.isfile(filename): continue item = NewsItem(filename, itemid) + if not item.isValid(): + continue if item.isRelevant(profile=self._profile_path, config=self.config, vardb=self.vdb): updates.append(item) @@ -173,6 +177,7 @@ class NewsItem(object): self.path = path self.name = name self._parsed = False + self._valid = True def isRelevant(self, vardb, config, profile): """ @@ -197,10 +202,16 @@ class NewsItem(object): return False # No restrictions were met; thus we aren't relevant :( + def isValid(self): + if not self._parsed: + self.parse() + return self._valid + def parse(self): lines = open(self.path).readlines() self.restrictions = [] - for line in lines: + invalids = [] + for i, line in enumerate(lines): #Optimization to ignore regex matchines on lines that #will never match if not line.startswith('D'): @@ -212,7 +223,18 @@ class NewsItem(object): match = regex.match(line) if match: self.restrictions.append(restriction(match.groups()[0].strip())) + if not self.restrictions[-1].isValid(): + invalids.append((i + 1, line.rstrip("\n"))) continue + if invalids: + self._valid = False + msg = [] + msg.append("Invalid news item: %s" % (self.path,)) + for lineno, line in invalids: + msg.append(" line %d: %s" % (lineno, line)) + writemsg_level("".join("!!! %s\n" % x for x in msg), + level=logging.ERROR, noiselevel=-1) + self._parsed = True def __getattr__(self, attr): @@ -229,6 +251,9 @@ class DisplayRestriction(object): are met, then it is displayed """ + def isValid(self): + return True + def checkRestriction(self, **kwargs): raise NotImplementedError('Derived class should over-ride this method') @@ -266,11 +291,14 @@ class DisplayInstalledRestriction(DisplayRestriction): if the user has that item installed. """ - def __init__(self, cpv): - self.cpv = cpv + def __init__(self, atom): + self.atom = atom + + def isValid(self): + return isvalidatom(self.atom) def checkRestriction(self, **kwargs): vdb = kwargs['vardb'] - if vdb.match(self.cpv): + if vdb.match(self.atom): return True return False |