# Standard modules
import sys
import os
+import re
import logging
from distutils.version import LooseVersion
+# portage stuff
+from portage.versions import pkgcmp, pkgsplit, catpkgsplit
+from portage.dep import get_operator, dep_getcpv, dep_getslot, isvalidatom
+from portage.dep import isjustname
+
# own modules:
from pb_base.app import PbApplicationError
from pb_base.app import PbApplication
Application class for the 'cleanup-pkg-keywords' application.
"""
+ re_empty_line = re.compile(r'^\s*$')
+ re_comment = re.compile(r'^\s*#')
+ re_line_keywords = re.compile(r'^\s*(\S+)(:?\s+.*)?$')
+
# -------------------------------------------------------------------------
def __init__(
self, verbose=0, version=__version__, *arg, **kwargs):
# -------------------------------------------------------------------------
def perform_file(self, filename):
- log.info("Performing %r ...", filename)
+ log.info("Performing %r ...", filename)
+
+ with open(filename, 'rt') as fh:
+
+ line_nr = 0
+ for line in fh.readlines():
+ line_nr += 1
+ if self.re_empty_line.search(line) or self.re_comment.search(line):
+ continue
+ match = self.re_line_keywords.search(line)
+ if not match:
+ log.error(
+ 'Invalid line %r in %r (%d) found.', line.rstrip(),
+ filename, line_nr)
+ continue
+ mypkg = match.group(1)
+ if not isvalidatom(mypkg):
+ log.error(
+ 'Invalid atom %r in %r (%d) found.', mypkg,
+ filename, line_nr)
+ continue
+ log.debug("Checking atom %r in %r (%d) ...", mypkg,
+ filename, line_nr)
+ my_operator = get_operator(mypkg)
+ my_cpv = dep_getcpv(mypkg)
+ my_slot = dep_getslot(mypkg)
+ if self.verbose > 2:
+ log.debug("Operator: %r, CPV: %r, slot: %r",
+ my_operator, my_cpv, my_slot)
+ if not my_cpv:
+ log.error(
+ 'Invalid Package name %r in %r (%d) found.', mypkg,
+ filename, line_nr)
+ continue
+ if isjustname(my_cpv):
+ self.check_package(my_cpv, my_slot, None, None, my_operator)
+ else:
+ splitted = pkgsplit(my_cpv)
+ if self.verbose > 2:
+ log.debug("Splitted CPV: %r", splitted)
+ self.check_package(
+ splitted[0], my_slot, splitted[1],
+ splitted[2], my_operator)
+
+ # -------------------------------------------------------------------------
+ def check_package(self, package, slot, version, release, operator):
+ log.debug(
+ "Checking package %r, slot %r, version %r, release: %r, operator %r ...",
+ package, slot, version, release, operator)
# =============================================================================