]> Frank Brehm's Git Trees - scripts/root-bin.git/commitdiff
Continued cleanup-pkg-keywords
authorFrank Brehm <frank.brehm@profitbricks.com>
Thu, 5 Mar 2015 17:30:57 +0000 (18:30 +0100)
committerFrank Brehm <frank.brehm@profitbricks.com>
Thu, 5 Mar 2015 17:30:57 +0000 (18:30 +0100)
cleanup-pkg-keywords

index 0f994b37f695269a1eea3c089c3ab03b5f4a4a41..eb08618a73a37ddf6737f786ef10026b4a7139c8 100755 (executable)
@@ -19,7 +19,7 @@ import glob
 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
 
@@ -172,12 +172,20 @@ class CleanupPkgKeywordsApp(PbApplication):
                         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:
@@ -194,6 +202,8 @@ class CleanupPkgKeywordsApp(PbApplication):
                         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,
@@ -223,7 +233,7 @@ class CleanupPkgKeywordsApp(PbApplication):
                         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,
@@ -242,7 +252,174 @@ class CleanupPkgKeywordsApp(PbApplication):
             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
 
 # =============================================================================