From bef1519e597f49ca79d046b686d808b83e75b92f Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Thu, 19 Dec 2024 23:15:44 +0000 Subject: bugfix : https://bugs.redcorelinux.org/show_bug.cgi?id=165 --- src/backend/pkgremove.py | 17 ++++++-- src/backend/solverevdeps.py | 94 ++++++++++++++++++---------------------- src/backend/sysclean.py | 52 ++++++++++++++-------- src/frontend/cli/sisyphus-cli.py | 2 +- src/frontend/gui/sisyphus-qt5.py | 2 +- src/frontend/gui/sisyphus-qt6.py | 2 +- 6 files changed, 91 insertions(+), 78 deletions(-) diff --git a/src/backend/pkgremove.py b/src/backend/pkgremove.py index 552d802..effc74a 100644 --- a/src/backend/pkgremove.py +++ b/src/backend/pkgremove.py @@ -63,8 +63,8 @@ def start(pkgname, depclean=False, gfx_ui=False, unmerge=False): sisyphus.solverevdeps.start( pkgname, depclean=True, unmerge=False) - is_installed, is_needed, is_vague = pickle.load(open(os.path.join( - sisyphus.getfs.p_mtd_dir, "sisyphus_pkgrevdeps.pickle"), "rb")) + is_installed, is_needed, is_vague, rm_list = pickle.load( + open(os.path.join(sisyphus.getfs.p_mtd_dir, "sisyphus_pkgrevdeps.pickle"), "rb")) if is_vague != 0: # catch ambiguous packages if unmerge: @@ -162,7 +162,11 @@ def start(pkgname, depclean=False, gfx_ui=False, unmerge=False): sys.exit() else: if unmerge: - print(f"\n{sisyphus.getclr.bright_white}Selected packages are slated for{sisyphus.getclr.reset} {sisyphus.getclr.green}'forced'{sisyphus.getclr.reset} {sisyphus.getclr.bright_white}removal.{sisyphus.getclr.reset}\n") + print(f"\n{sisyphus.getclr.green}These are the selected packages that would be{sisyphus.getclr.reset} 'forcefully' {sisyphus.getclr.green}unmerged, in order:{sisyphus.getclr.reset}\n") + print( + f"\n{sisyphus.getclr.magenta}{', '.join(rm_list)}{sisyphus.getclr.reset}\n") + print( + f"\n{sisyphus.getclr.bright_white}Total: {len(rm_list)} package(s){sisyphus.getclr.reset}\n") while True: user_input = input( f"{sisyphus.getclr.bright_white}Would you like to proceed?{sisyphus.getclr.reset} [{sisyphus.getclr.bright_green}Yes{sisyphus.getclr.reset}/{sisyphus.getclr.bright_red}No{sisyphus.getclr.reset}] ") @@ -227,7 +231,12 @@ def start(pkgname, depclean=False, gfx_ui=False, unmerge=False): p_exe.wait() sisyphus.syncdb.lcl_tbl() else: - print(f"\n{sisyphus.getclr.bright_white}Selected packages are slated for{sisyphus.getclr.reset} {sisyphus.getclr.green}'safe'{sisyphus.getclr.reset} {sisyphus.getclr.bright_white}removal.{sisyphus.getclr.reset}\n") + print(f"\n{sisyphus.getclr.green}These are the selected packages that would be{sisyphus.getclr.reset} 'safely' {sisyphus.getclr.green}unmerged, in order:{sisyphus.getclr.reset}\n") + print( + f"\n{sisyphus.getclr.magenta}{', '.join(rm_list)}{sisyphus.getclr.reset}\n") + print( + f"\n{sisyphus.getclr.bright_white}Total: {len(rm_list)} package(s){sisyphus.getclr.reset}\n") + while True: user_input = input( f"{sisyphus.getclr.bright_white}Would you like to proceed?{sisyphus.getclr.reset} [{sisyphus.getclr.bright_green}Yes{sisyphus.getclr.reset}/{sisyphus.getclr.bright_red}No{sisyphus.getclr.reset}] ") diff --git a/src/backend/solverevdeps.py b/src/backend/solverevdeps.py index 12b4eb4..bba3932 100644 --- a/src/backend/solverevdeps.py +++ b/src/backend/solverevdeps.py @@ -3,6 +3,7 @@ import animation import os import pickle +import re import signal import subprocess import sys @@ -18,61 +19,48 @@ signal.signal(signal.SIGINT, sigint_handler) @animation.wait('resolving reverse dependencies') def start(pkgname=None, depclean=False, unmerge=False): + pattern = r'(\b[a-zA-Z0-9-_]+/[a-zA-Z0-9-_]+):\s+([0-9]+(\.[0-9]+){0,4})' + rm_list = [] + + args = ['--quiet', '--pretend', '--verbose'] + args += ['--unmerge'] if unmerge else ['--depclean'] + if pkgname: + args += list(pkgname) + is_installed = int(1) is_needed = int(0) is_vague = int(0) - if unmerge: - is_needed = int(0) - try: - p_exe = subprocess.Popen(['emerge', '--unmerge', '--quiet', '--pretend', '--verbose'] + list( - pkgname), stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - stdout, stderr = p_exe.communicate() - - for p_out in stderr.decode('utf-8').splitlines(): - if any(key in p_out for key in ["Couldn't find", - "to depclean."]): - is_installed = int(0) - - if any(key in p_out for key in ["short ebuild name", - "is ambiguous"]): - is_vague = int(1) - except KeyboardInterrupt: - p_exe.terminate() - try: - p_exe.wait(1) - except subprocess.TimeoutExpired: - p_exe.kill() - sys.exit() - else: + try: + p_exe = subprocess.Popen( + ['emerge'] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + + stdout, stderr = p_exe.communicate() + + for p_out in stdout.decode('utf-8').splitlines(): + match = re.search(pattern, p_out) + if match: + to_remove = f"{match.group(1)}-{match.group(2)}" + rm_list.append(to_remove) + + if any(key in p_out for key in ["pulled in by:", "required"]): + is_needed = int(1) + + for p_out in stderr.decode('utf-8').splitlines(): + if any(key in p_out for key in ["Couldn't find", "to depclean."]): + is_installed = int(0) + + if any(key in p_out for key in ["short ebuild name", "is ambiguous"]): + is_vague = int(1) + + except KeyboardInterrupt: + p_exe.terminate() try: - p_exe = subprocess.Popen(['emerge', '--depclean', '--quiet', '--pretend', - '--verbose'] + list(pkgname), stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - stdout, stderr = p_exe.communicate() - - for p_out in stdout.decode('utf-8').splitlines(): - if any(key in p_out for key in ["pulled in by:", - "required"]): - is_needed = int(1) - - for p_out in stderr.decode('utf-8').splitlines(): - if any(key in p_out for key in ["Couldn't find", - "to depclean."]): - is_installed = int(0) - - if any(key in p_out for key in ["short ebuild name", - "is ambiguous"]): - is_vague = int(1) - - except KeyboardInterrupt: - p_exe.terminate() - try: - p_exe.wait(1) - except subprocess.TimeoutExpired: - p_exe.kill() - sys.exit() - - pickle.dump([is_installed, is_needed, is_vague], open(os.path.join( - sisyphus.getfs.p_mtd_dir, "sisyphus_pkgrevdeps.pickle"), "wb")) + p_exe.wait(1) + except subprocess.TimeoutExpired: + p_exe.kill() + sys.exit() + + pickle.dump([is_installed, is_needed, is_vague, rm_list], open( + os.path.join(sisyphus.getfs.p_mtd_dir, "sisyphus_pkgrevdeps.pickle"), "wb")) diff --git a/src/backend/sysclean.py b/src/backend/sysclean.py index 937c8ec..2df6a0f 100644 --- a/src/backend/sysclean.py +++ b/src/backend/sysclean.py @@ -4,6 +4,7 @@ import atexit import fcntl import io import os +import pickle import signal import selectors import subprocess @@ -11,6 +12,7 @@ import sys import sisyphus.checkenv import sisyphus.getclr import sisyphus.killemerge +import sisyphus.solverevdeps import sisyphus.syncdb @@ -41,11 +43,40 @@ def sigint_handler(signal, frame): signal.signal(signal.SIGINT, sigint_handler) -def start(gfx_ui=False): +def start(depclean=False, gfx_ui=False): args = ['--quiet', '--depclean'] - if sisyphus.checkenv.root() and not gfx_ui: - print(f"\n{sisyphus.getclr.bright_white}Orphaned and no longer needed packages are slated for{sisyphus.getclr.reset} {sisyphus.getclr.green}'safe'{sisyphus.getclr.reset} {sisyphus.getclr.bright_white}removal.{sisyphus.getclr.reset}\n") + if not sisyphus.checkenv.root() and depclean: + print(f"{sisyphus.getclr.bright_red}\nRoot permissions are required to perform this action.\n{sisyphus.getclr.reset}") + sys.exit() + else: + if gfx_ui: + sisyphus.solverevdeps.start.__wrapped__(depclean=True) + else: + sisyphus.solverevdeps.start(depclean=True) + + is_installed, is_needed, is_vague, rm_list = pickle.load( + open(os.path.join(sisyphus.getfs.p_mtd_dir, "sisyphus_pkgrevdeps.pickle"), "rb")) + + if gfx_ui: + p_exe = subprocess.Popen( + ['emerge'] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # kill portage if the program dies or it's terminated by the user + atexit.register(sisyphus.killemerge.start, p_exe) + + for p_out in io.TextIOWrapper(p_exe.stdout, encoding="utf-8"): + print(p_out.rstrip()) + + p_exe.wait() + sisyphus.syncdb.lcl_tbl() + + else: + print(f"\n{sisyphus.getclr.green}These are the orphaned packages that would be{sisyphus.getclr.reset} 'safely' {sisyphus.getclr.green}unmerged, in order:{sisyphus.getclr.reset}\n") + print( + f"\n{sisyphus.getclr.magenta}{', '.join(rm_list)}{sisyphus.getclr.reset}\n") + print( + f"\n{sisyphus.getclr.bright_white}Total: {len(rm_list)} package(s){sisyphus.getclr.reset}\n") + while True: user_input = input( f"{sisyphus.getclr.bright_white}Would you like to proceed?{sisyphus.getclr.reset} [{sisyphus.getclr.bright_green}Yes{sisyphus.getclr.reset}/{sisyphus.getclr.bright_red}No{sisyphus.getclr.reset}] ") @@ -83,18 +114,3 @@ def start(gfx_ui=False): else: print( f"\nApologies, the response '{user_input}' was not recognized.\n") - continue - elif gfx_ui: - p_exe = subprocess.Popen( - ['emerge'] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # kill portage if the program dies or it's terminated by the user - atexit.register(sisyphus.killemerge.start, p_exe) - - for p_out in io.TextIOWrapper(p_exe.stdout, encoding="utf-8"): - print(p_out.rstrip()) - - p_exe.wait() - sisyphus.syncdb.lcl_tbl() - else: - print(f"{sisyphus.getclr.bright_red}\nRoot permissions are required for this operation.\n{sisyphus.getclr.reset}") - sys.exit() diff --git a/src/frontend/cli/sisyphus-cli.py b/src/frontend/cli/sisyphus-cli.py index 1aa8aa8..3b1af10 100755 --- a/src/frontend/cli/sisyphus-cli.py +++ b/src/frontend/cli/sisyphus-cli.py @@ -188,7 +188,7 @@ def autoremove(): * Examples:\n sisyphus autoremove\n """ - sisyphus.sysclean.start(gfx_ui=False) + sisyphus.sysclean.start(depclean=True, gfx_ui=False) @app.command("autoclean") diff --git a/src/frontend/gui/sisyphus-qt5.py b/src/frontend/gui/sisyphus-qt5.py index 2b4e1e6..e5becbb 100644 --- a/src/frontend/gui/sisyphus-qt5.py +++ b/src/frontend/gui/sisyphus-qt5.py @@ -496,7 +496,7 @@ class MainWorker(QtCore.QObject): @QtCore.pyqtSlot() def startAutoremove(self): self.started.emit() - sisyphus.sysclean.start(gfx_ui=True) + sisyphus.sysclean.start(depclean=True, gfx_ui=True) self.finished.emit() @QtCore.pyqtSlot() diff --git a/src/frontend/gui/sisyphus-qt6.py b/src/frontend/gui/sisyphus-qt6.py index 4693c5c..c6e8bb5 100644 --- a/src/frontend/gui/sisyphus-qt6.py +++ b/src/frontend/gui/sisyphus-qt6.py @@ -496,7 +496,7 @@ class MainWorker(QtCore.QObject): @QtCore.pyqtSlot() def startAutoremove(self): self.started.emit() - sisyphus.sysclean.start(gfx_ui=True) + sisyphus.sysclean.start(depclean=True, gfx_ui=True) self.finished.emit() @QtCore.pyqtSlot() -- cgit v1.2.3