11import shutil
22import subprocess
3+ from collections .abc import Generator
34
45from bleach .core .cleaner import Cleaner , CleanupResult
56
@@ -20,21 +21,30 @@ def scan(self) -> CleanupResult:
2021 # Checking /var/cache/apt/archives size could be a scan method
2122 return CleanupResult (success = True , message = "APT detected." )
2223
23- def clean (self ) -> CleanupResult :
24+ def clean (self ) -> Generator [ str , None , CleanupResult ] :
2425 try :
25- # sudo apt-get clean && sudo apt-get autoremove -y
26+ # apt-get clean && apt-get autoremove -y
2627 steps = [
27- [ "sudo" , " apt-get" , "clean" ],
28- [ "sudo" , " apt-get" , "autoremove" , "-y" ],
28+ ([ " apt-get" , "clean" ], "Cleaning APT cache..." ) ,
29+ ([ " apt-get" , "autoremove" , "-y" ], "Removing unused packages..." ) ,
2930 ]
30- for cmd in steps :
31- subprocess .run (
32- cmd , check = True , capture_output = True
31+
32+ for cmd , desc in steps :
33+ yield f"[bold]{ desc } [/]"
34+ process = subprocess .Popen (
35+ cmd , stdout = subprocess .PIPE , stderr = subprocess .STDOUT , text = True
3336 )
37+ if process .stdout :
38+ for line in process .stdout :
39+ yield f" { line .strip ()} "
40+ process .wait ()
41+
42+ if process .returncode != 0 :
43+ raise subprocess .CalledProcessError (process .returncode , cmd )
3444
3545 return CleanupResult (
3646 success = True ,
37- message = "APT cache cleaned and unused packages removed ."
47+ message = "APT cleanup completed ."
3848 )
3949 except subprocess .CalledProcessError as e :
4050 return CleanupResult (
@@ -56,13 +66,21 @@ def is_available(self) -> bool:
5666 def scan (self ) -> CleanupResult :
5767 return CleanupResult (success = True , message = "DNF detected." )
5868
59- def clean (self ) -> CleanupResult :
69+ def clean (self ) -> Generator [ str , None , CleanupResult ] :
6070 try :
61- subprocess . run (
62- [ "sudo" , "dnf" , "clean" , "all" ],
63- check = True ,
64- capture_output = True ,
71+ cmd = [ "dnf" , "clean" , "all" ]
72+ yield f"[bold]Running { cmd } [/]"
73+ process = subprocess . Popen (
74+ cmd , stdout = subprocess . PIPE , stderr = subprocess . STDOUT , text = True
6575 )
76+ if process .stdout :
77+ for line in process .stdout :
78+ yield f" { line .strip ()} "
79+ process .wait ()
80+
81+ if process .returncode != 0 :
82+ raise subprocess .CalledProcessError (process .returncode , cmd )
83+
6684 return CleanupResult (success = True , message = "DNF cache cleaned." )
6785 except subprocess .CalledProcessError as e :
6886 return CleanupResult (
@@ -84,15 +102,21 @@ def is_available(self) -> bool:
84102 def scan (self ) -> CleanupResult :
85103 return CleanupResult (success = True , message = "Pacman detected." )
86104
87- def clean (self ) -> CleanupResult :
105+ def clean (self ) -> Generator [ str , None , CleanupResult ] :
88106 try :
89- # pacman -Sc (Clean cache), usually requires interactive confirmation
90- # or --noconfirm logic
91- subprocess .run (
92- ["sudo" , "pacman" , "-Sc" , "--noconfirm" ],
93- check = True ,
94- capture_output = True ,
107+ cmd = ["pacman" , "-Sc" , "--noconfirm" ]
108+ yield f"[bold]Running { cmd } [/]"
109+ process = subprocess .Popen (
110+ cmd , stdout = subprocess .PIPE , stderr = subprocess .STDOUT , text = True
95111 )
112+ if process .stdout :
113+ for line in process .stdout :
114+ yield f" { line .strip ()} "
115+ process .wait ()
116+
117+ if process .returncode != 0 :
118+ raise subprocess .CalledProcessError (process .returncode , cmd )
119+
96120 return CleanupResult (success = True , message = "Pacman cache cleaned." )
97121 except subprocess .CalledProcessError as e :
98122 return CleanupResult (
0 commit comments