@@ -10,7 +10,6 @@ PackageManager& PackageManager::instance() {
1010
1111PackageManager::PackageManager ()
1212 : QObject(nullptr )
13- , m_helper(Helper::Pacman)
1413 , m_process(std::make_unique<QProcess>()) {
1514
1615 detectHelper ();
@@ -41,13 +40,13 @@ void PackageManager::detectHelper() {
4140 return ;
4241 }
4342
44- // Check for paru
45- QString paruPath = QStandardPaths::findExecutable (" paru" );
46- if (!paruPath.isEmpty ()) {
47- m_helper = Helper::Paru;
48- Logger::info (" Using paru as package helper" );
49- return ;
50- }
43+ // Check for paru - deprecate because paru doesn't allow running with pkexec
44+ // QString paruPath = QStandardPaths::findExecutable("paru");
45+ // if (!paruPath.isEmpty()) {
46+ // m_helper = Helper::Paru;
47+ // Logger::info("Using paru as package helper");
48+ // return;
49+ // }
5150
5251 // Default to pacman
5352 m_helper = Helper::Pacman;
@@ -57,7 +56,6 @@ void PackageManager::detectHelper() {
5756QString PackageManager::getHelperName () const {
5857 switch (m_helper) {
5958 case Helper::Yay: return " yay" ;
60- case Helper::Paru: return " paru" ;
6159 case Helper::Pacman: return " pacman" ;
6260 default : return " pacman" ;
6361 }
@@ -75,9 +73,10 @@ void PackageManager::installPackage(const QString& packageName, const QString& r
7573 QString helper = getHelperName ();
7674
7775 QString command;
78- if (isAUR && (m_helper == Helper::Yay || m_helper == Helper::Paru)) {
79- // AUR packages - run helper as regular user (no pkexec)
80- command = QString (" %1 -S %2 --noconfirm" ).arg (helper, packageName);
76+ if (isAUR && (m_helper == Helper::Yay)) {
77+ // AUR packages - use pkexec to get userpassword before hand
78+ // Paru has a problem here, so default to yay
79+ command = QString (" pkexec %1 -S %2 --noconfirm" ).arg (helper, packageName);
8180 } else {
8281 // Official repos and chaotic-aur need root access and use pacman
8382 command = QString (" pkexec pacman -S %1 --noconfirm" ).arg (packageName);
@@ -110,7 +109,7 @@ void PackageManager::updatePackage(const QString& packageName, const QString& re
110109 QString helper = getHelperName ();
111110
112111 QString command;
113- if (isAUR && (m_helper == Helper::Yay || m_helper == Helper::Paru )) {
112+ if (isAUR && (m_helper == Helper::Yay)) {
114113 // AUR packages - run helper as regular user (no pkexec)
115114 command = QString (" %1 -S %2 --noconfirm" ).arg (helper, packageName);
116115 } else {
@@ -187,3 +186,41 @@ void PackageManager::onProcessOutput() {
187186 emit operationOutput (output);
188187 }
189188}
189+
190+ void PackageManager::cancelRunningOperation () {
191+ if (m_process && m_process->state () != QProcess::NotRunning) {
192+ Logger::warning (" Cancelling running operation..." );
193+ emit operationOutput (" \n >>> Operation cancelled by user <<<\n " );
194+
195+ // When using pkexec, we need to kill the actual pacman/yay/paru process
196+ // not just the pkexec wrapper. Use pkill to terminate all package manager processes.
197+ QProcess killProcess;
198+ killProcess.start (" pkexec" , QStringList () << " bash" << " -c"
199+ << " pkill -TERM pacman; pkill -TERM yay; pkill -TERM paru" );
200+ killProcess.waitForFinished (2000 );
201+
202+ // Also terminate the QProcess wrapper
203+ m_process->terminate ();
204+
205+ // Wait up to 3 seconds for graceful termination
206+ if (!m_process->waitForFinished (3000 )) {
207+ // Force kill if still running
208+ Logger::warning (" Process did not terminate gracefully, forcing kill..." );
209+ killProcess.start (" pkexec" , QStringList () << " bash" << " -c"
210+ << " pkill -KILL pacman; pkill -KILL yay; pkill -KILL paru" );
211+ killProcess.waitForFinished (2000 );
212+
213+ m_process->kill ();
214+ m_process->waitForFinished (1000 );
215+ }
216+
217+ emit operationCompleted (false , " Operation cancelled by user" );
218+ Logger::info (" Operation cancelled successfully" );
219+ } else {
220+ Logger::warning (" No operation is currently running" );
221+ }
222+ }
223+
224+ bool PackageManager::isOperationRunning () const {
225+ return m_process && m_process->state () != QProcess::NotRunning;
226+ }
0 commit comments