from distutils.version import LooseVersion
# portage stuff
-from portage.versions import pkgcmp, pkgsplit, catpkgsplit
+from portage.versions import pkgcmp, pkgsplit, catpkgsplit, vercmp
from portage.dep import get_operator, dep_getcpv, dep_getslot, isvalidatom
from portage.dep import isjustname
if os.path.isfile(full_file):
files2check.append(full_file)
+ patter_exclude = r'(:\.swp|\.swp|\.bak)$'
+ re_exclude = re.compile(patter_exclude, re.IGNORECASE)
for fname in sorted(files2check, key=str.lower):
+
+ if re_exclude.search(fname):
+ continue
+
self.perform_file(fname)
# -------------------------------------------------------------------------
def perform_file(self, filename):
+ print('')
+ print('---------------------------------------------------')
log.info("Performing %r ...", filename)
with open(filename, 'rt') as fh:
filename, line_nr)
continue
mypkg = match.group(1)
+ if self.verbose:
+ print('')
if not isvalidatom(mypkg):
log.error(
'Invalid atom %r in %r (%d) found.', mypkg,
splitted[0], my_slot, splitted[1],
splitted[2], my_operator)
if valid:
- log.info("Atom %r in %r (%d) seems to be valid.", mypkg,
+ log.debug("Atom %r in %r (%d) seems to be valid.", mypkg,
filename, line_nr)
else:
log.warning("Atom %r in %r (%d) seems to be invalid.", mypkg,
log.info("Package %r seems not to be installed.", package)
return False
- return True
+ found = False
+ for pkg_dir in pkg_dirs:
+ cat = os.path.basename(os.path.dirname(pkg_dir))
+ installed_cpv = os.path.join(cat, os.path.basename(pkg_dir))
+ if self.verbose > 1:
+ log.debug("Checking against installed package %r ...", installed_cpv)
+ splitted_pkg = pkgsplit(installed_cpv)
+ if not splitted_pkg:
+ log.error("Could not split installed CPV %r.", installed_cpv)
+ continue
+ inst_pkg = splitted_pkg[0]
+ inst_ver = splitted_pkg[1]
+ inst_rev = splitted_pkg[2]
+
+ if slot:
+ inst_slot = self.get_slot(pkg_dir)
+ if inst_slot is not None and inst_slot != slot:
+ log.debug(
+ "Slot %r of installed package %r does not match slot %r.",
+ inst_slot, installed_cpv, slot)
+ continue
+
+ if version:
+
+ if operator and operator == '~':
+ inst_version = inst_ver + '-' + 'r0'
+ search_version = version + '-' + 'r0'
+ if self.verbose > 2:
+ log.debug("Comparing versions %r and %r ...", inst_version, search_version)
+ s_pv = package + '-' + version
+ if vercmp(inst_version, search_version) == 0:
+ log.debug(
+ "Package ~%s is matching installed package %r.",
+ s_pv, installed_cpv)
+ found = True
+ break
+ else:
+ log.info(
+ "Package ~%s does not match installed package %r.",
+ s_pv, installed_cpv)
+ found = False
+ continue
+
+ inst_version = inst_ver + '-' + inst_rev
+ search_version = version + '-' + release
+ if self.verbose > 2:
+ log.debug("Comparing versions %r and %r ...", inst_version, search_version)
+ s_pv = package + '-' + version
+
+ if operator and operator == '=':
+ if vercmp(inst_version, search_version) == 0:
+ log.debug(
+ "Package %s is equal installed package %r.",
+ search_version, installed_cpv)
+ found = True
+ break
+ else:
+ log.info(
+ "Package %s is not equal installed package %r.",
+ search_version, installed_cpv)
+ found = False
+ continue
+
+ if operator and operator == '=*':
+ pattern_version = r'^' + re.escape(version)
+ if self.verbose > 2:
+ log.debug("Checking version with pattern %r ...", pattern_version)
+ regex_version = re.compile(pattern_version, re.UNICODE)
+ r_pv = package + '-' + version + '*'
+ if regex_version.search(inst_ver):
+ log.debug(
+ "Package %s is matching installed package %r.",
+ r_pv, installed_cpv)
+ found = True
+ break
+ else:
+ log.info(
+ "Package %s does not match installed package %r.",
+ r_pv, installed_cpv)
+ found = False
+ continue
+
+ if operator and operator == '>':
+ if vercmp(inst_version, search_version) > 0:
+ log.debug(
+ "Package %s is greater than installed package %r.",
+ search_version, installed_cpv)
+ found = True
+ break
+ else:
+ log.info(
+ "Package %s is less than or equal to installed package %r.",
+ search_version, installed_cpv)
+ found = False
+ continue
+
+ if operator and operator == '>=':
+ if vercmp(inst_version, search_version) >= 0:
+ log.debug(
+ "Package %s is greater than or equal to installed package %r.",
+ search_version, installed_cpv)
+ found = True
+ break
+ else:
+ log.info(
+ "Package %s is less than installed package %r.",
+ search_version, installed_cpv)
+ found = False
+ continue
+
+ if operator and operator == '<':
+ if vercmp(inst_version, search_version) < 0:
+ log.debug(
+ "Package %s is less than installed package %r.",
+ search_version, installed_cpv)
+ found = True
+ break
+ else:
+ log.info(
+ "Package %s is greater than or equal to installed package %r.",
+ search_version, installed_cpv)
+ found = False
+ continue
+
+ if operator and operator == '<=':
+ if vercmp(inst_version, search_version) <= 0:
+ log.debug(
+ "Package %s is less than or equal to installed package %r.",
+ search_version, installed_cpv)
+ found = True
+ break
+ else:
+ log.info(
+ "Package %s is greater than installed package %r.",
+ search_version, installed_cpv)
+ found = False
+ continue
+
+ log.error("Unknown operator %r, should be disabled.", operator)
+ found = False
+ break
+
+ found = True
+ break
+
+ return found
+
+ # -------------------------------------------------------------------------
+ def get_slot(self, pkg_dir):
+ if not os.path.isdir(pkg_dir):
+ log.error("Package dir %r not found.", pkg_dir)
+ return None
+ slot_file = os.path.join(pkg_dir, 'SLOT')
+ if not os.path.isfile(slot_file):
+ log.error("File %r not found.", slot_file)
+ return None
+ slot = None
+ content = None
+ if sys.version_info[0] > 2:
+ with open(slot_file, 'r', encoding = 'utf-8') as fh:
+ content = fh.read()
+ else:
+ with open(slot_file, 'r') as fh:
+ content = fh.read()
+ if content:
+ if content.strip() != '':
+ slot = content.strip()
+ return slot
# =============================================================================