summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/pkgremove.py17
-rw-r--r--src/backend/solverevdeps.py94
-rw-r--r--src/backend/sysclean.py52
-rwxr-xr-xsrc/frontend/cli/sisyphus-cli.py2
-rw-r--r--src/frontend/gui/sisyphus-qt5.py2
-rw-r--r--src/frontend/gui/sisyphus-qt6.py2
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()