# -*- coding: utf-8 -*- ############################################################################# # File : Filter.py # Package : rpmlint # Author : Frederic Lepied # Created on : Sat Oct 23 15:52:27 1999 # Purpose : filter the output of rpmlint to allow exceptions. ############################################################################# from __future__ import print_function import locale import sys import textwrap import Config try: import Testing except ImportError: Testing = None _rawout = None _diagnostic = list() _badness_score = 0 printed_messages = {"I": 0, "W": 0, "E": 0} if sys.stdout.isatty(): def __print(s): print(s) else: __stdout = sys.stdout if not __stdout.encoding: # Python < 3 only? import codecs if hasattr(__stdout, "buffer"): __stdout = __stdout.buffer __stdout = codecs.getwriter( locale.getpreferredencoding())(__stdout, "replace") def __print(s): print(s, file=__stdout) def printInfo(pkg, reason, *details): _print("I", pkg, reason, details) def printWarning(pkg, reason, *details): _print("W", pkg, reason, details) def printError(pkg, reason, *details): _print("E", pkg, reason, details) def _print(msgtype, pkg, reason, details): global _badness_score threshold = badnessThreshold() badness = 0 if threshold >= 0: badness = Config.badness(reason) # anything with badness is an error if badness: msgtype = 'E' # errors without badness become warnings elif msgtype == 'E': msgtype = 'W' ln = "" if pkg.current_linenum is not None: ln = "%s:" % pkg.current_linenum arch = "" if pkg.arch is not None: arch = ".%s" % pkg.arch s = "%s%s:%s %s: %s" % (pkg.name, arch, ln, msgtype, reason) if badness: s = s + " (Badness: %d)" % badness for d in details: s = s + " %s" % d if Testing and Testing.isTest(): Testing.addOutput(s) else: if _rawout: print(s.encode(locale.getpreferredencoding(), "replace"), file=_rawout) if not Config.isFiltered(s): printed_messages[msgtype] += 1 _badness_score += badness if threshold >= 0: _diagnostic.append(s + "\n") else: __print(s) if Config.info: printDescriptions(reason) return True return False def printDescriptions(reason): try: d = _details[reason] if d and d != '' and d != "\n": __print(textwrap.fill(d, 78)) __print("") except KeyError: pass def _diag_sortkey(x): xs = x.split() return (xs[2], xs[1]) def printAllReasons(): threshold = badnessThreshold() if threshold < 0: return False global _diagnostic _diagnostic.sort(key=_diag_sortkey, reverse=True) last_reason = '' for diag in _diagnostic: if Config.info: reason = diag.split()[2] if reason != last_reason: if len(last_reason): printDescriptions(last_reason) last_reason = reason __print(diag) if Config.info and len(last_reason): printDescriptions(last_reason) _diagnostic = list() return _badness_score > threshold _details = {} def addDetails(*details): for idx in range(int(len(details)/2)): if not details[idx*2] in _details: _details[details[idx*2]] = details[idx*2+1] def badnessScore(): return _badness_score def badnessThreshold(): return Config.getOption("BadnessThreshold", -1) def setRawOut(file): global _rawout if _rawout: _rawout.close() _rawout = open(file, "w") # Filter.py ends here # Local variables: # indent-tabs-mode: nil # py-indent-offset: 4 # End: # ex: ts=4 sw=4 et