commit:     a16d0d4fbfb4614832c4b682b41284a9050af29f
Author:     Siddhanth Rathod <xsiddhanthrathod <AT> gmail <DOT> com>
AuthorDate: Thu Mar 23 12:14:36 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Aug 21 05:16:18 2023 +0000
URL:        https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=a16d0d4f

eclean-pkg: deal with invalid binpkgs

Changes required in portage -> https://github.com/gentoo/portage/pull/1016

Bug: https://bugs.gentoo.org/900224
Signed-off-by: Siddhanth Rathod <xsiddhanthrathod <AT> gmail.com>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 pym/gentoolkit/eclean/cli.py    | 47 +++++++++++++++++++++++++++++++++++++----
 pym/gentoolkit/eclean/output.py | 14 ++++++++++++
 pym/gentoolkit/eclean/search.py |  9 ++++++--
 3 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/pym/gentoolkit/eclean/cli.py b/pym/gentoolkit/eclean/cli.py
index fa94a55..40fc4f9 100644
--- a/pym/gentoolkit/eclean/cli.py
+++ b/pym/gentoolkit/eclean/cli.py
@@ -13,7 +13,6 @@ __version__ = "git"
 __productname__ = "eclean"
 __description__ = "A cleaning tool for Gentoo distfiles and binaries."
 
-
 import os
 import sys
 import re
@@ -21,7 +20,7 @@ import time
 import getopt
 
 import portage
-from portage.output import white, yellow, turquoise, green
+from portage.output import white, yellow, turquoise, green, red
 
 import gentoolkit.pprinter as pp
 from gentoolkit.eclean.search import (
@@ -47,7 +46,7 @@ def printVersion():
     print("Distributed under the terms of the GNU General Public License v2")
 
 
-def printUsage(_error=None, help=None):
+def printUsage(_error=None, help=None, unresolved_invalids=None):
     """Print help message. May also print partial help to stderr if an
     error from {'options','actions'} is specified."""
 
@@ -63,10 +62,25 @@ def printUsage(_error=None, help=None):
         "merged-distfiles-options",
         "time",
         "size",
+        "invalid_paths",
     ):
         _error = None
     if not _error and not help:
         help = "all"
+    if _error == "invalid_paths":
+        print(
+            pp.error(
+                "eclean was not able to remove invalid binpkgs due to missing 
features in the currently installed portage"
+            ),
+            file=out,
+        )
+        print(
+            pp.error("Please remove the following binpkgs manually:"),
+            file=out,
+        )
+        for invalid in unresolved_invalids:
+            print(pp.error(invalid), file=out)
+        return
     if _error == "time":
         print(pp.error("Wrong time specification"), file=out)
         print(
@@ -399,6 +413,8 @@ def parseArgs(options={}):
                 options["ignore-failure"] = True
             elif o in ("-u", "--unique-use"):
                 options["unique-use"] = True
+            elif o in ("-N", "--skip-invalids"):
+                options["clean-invalids"] = False
             else:
                 return_code = False
         # sanity check of --deep only options:
@@ -458,6 +474,7 @@ def parseArgs(options={}):
     options["changed-deps"] = False
     options["ignore-failure"] = False
     options["unique-use"] = False
+    options["clean-invalids"] = True
     # if called by a well-named symlink, set the action accordingly:
     action = None
     # temp print line to ensure it is the svn/branch code running, etc..
@@ -527,7 +544,7 @@ def doAction(action, options, exclude={}, output=None):
     if not options["quiet"]:
         output.einfo("Building file list for " + action + " cleaning...")
     if action == "packages":
-        clean_me = findPackages(
+        clean_me, invalids = findPackages(
             options,
             exclude=exclude,
             destructive=options["destructive"],
@@ -602,6 +619,28 @@ def doAction(action, options, exclude={}, output=None):
         )
         output.set_colors("deprecated")
         output.list_pkgs(deprecated)
+    if invalids and options["clean-invalids"]:
+        if type(invalids) == list:
+            printUsage(_error="invalid_paths", unresolved_invalids=invalids)
+            sys.exit(1)
+        verb = "were"
+        if options["pretend"]:
+            verb = "would be"
+        if not options["quiet"]:
+            print()
+            print(
+                (
+                    pp.emph("   The following ")
+                    + red("invalid")
+                    + pp.emph(" binpkgs were found")
+                )
+            )
+            output.set_colors("invalid")
+            output.list_pkgs(invalids)
+            clean_size = cleaner.clean_pkgs(invalids, pkgdir)
+            output.total("invalid", clean_size, len(invalids), verb, action)
+        else:
+            cleaner.clean_pkgs(invalids, pkgdir)
 
 
 def main():

diff --git a/pym/gentoolkit/eclean/output.py b/pym/gentoolkit/eclean/output.py
index 62777b7..ebba499 100644
--- a/pym/gentoolkit/eclean/output.py
+++ b/pym/gentoolkit/eclean/output.py
@@ -39,6 +39,9 @@ class OutputControl:
             self.pkg_color = cpv  # green
             self.numbers = number  # turquoise
             self.brace = blue
+        if mode == "invalid":
+            self.pkg_color = red
+            self.numbers = teal
         elif mode == "deprecated":
             self.pkg_color = yellow
             self.numbers = teal  # darkgreen
@@ -169,6 +172,17 @@ class OutputControl:
             )
             print(" ===========")
             print(self.prettySize(size, True, red), message)
+        elif mode == "invalid":
+            message = (
+                red(str(num_files))
+                + " invalid binpkgs "
+                + verb
+                + " removed from the "
+                + action
+                + " directory"
+            )
+            print(" ===========")
+            print(self.prettySize(size, True, red), message)
         elif mode == "deprecated":
             message = (
                 "Total space from "

diff --git a/pym/gentoolkit/eclean/search.py b/pym/gentoolkit/eclean/search.py
index eb26ac8..a2ac0ce 100644
--- a/pym/gentoolkit/eclean/search.py
+++ b/pym/gentoolkit/eclean/search.py
@@ -517,9 +517,10 @@ def findPackages(
     pkgdir: str = None,
     port_dbapi=portage.db[portage.root]["porttree"].dbapi,
     var_dbapi=portage.db[portage.root]["vartree"].dbapi,
-) -> dict[str, list[str]]:
+) -> tuple[dict[str, list[str]], dict[str, list[str]]]:
     """Find obsolete binary packages.
 
+    @param invalid_paths:
     @param options: dict of options determined at runtime
     @type  options: dict
     @param exclude: exclusion dict (as defined in the exclude.parseExcludeFile 
class)
@@ -638,8 +639,12 @@ def findPackages(
 
         binpkg_path = bin_dbapi.bintree.getname(cpv)
         dead_binpkgs.setdefault(cpv, []).append(binpkg_path)
+    try:
+        invalid_paths = bin_dbapi.bintree.invalid_paths
+    except AttributeError:
+        invalid_paths = bin_dbapi.bintree.invalids
 
-    return dead_binpkgs
+    return dead_binpkgs, invalid_paths
 
 
 # vim: set ts=4 sw=4 tw=79:

Reply via email to