From a769f4e397440526a5659b003474c1c78fa8ce73 Mon Sep 17 00:00:00 2001 From: guinux Date: Sat, 26 Jan 2013 14:42:01 +0100 Subject: [PATCH] improve updates and conflicts handling --- pamac/manager.py | 76 ++++++++++++++++++++++++++---- pamac/pamac-daemon.py | 1 - pamac/transaction.py | 62 ++++++++++++++++--------- pamac/updater.py | 104 +++++++++++++++++++++--------------------- 4 files changed, 162 insertions(+), 81 deletions(-) diff --git a/pamac/manager.py b/pamac/manager.py index f2fab2a..0736ff5 100755 --- a/pamac/manager.py +++ b/pamac/manager.py @@ -4,11 +4,7 @@ from gi.repository import Gtk import pyalpm -import math -import sys from time import strftime, localtime -from os import geteuid -import traceback from pamac import config, common, transaction @@ -227,6 +223,42 @@ def set_transaction_sum(): #bottom_label.set_markup('Total Download size: '+common.format_size(totaldlcb)) top_label.set_markup('Transaction Summary') +def do_sysupgrade(): + global transaction_type + """Upgrade a system like pacman -Su""" + if transaction.t_lock is False: + transaction_type = "update" + if transaction.do_syncfirst is True: + if transaction.init_transaction(recurse = True): + for pkg in transaction.list_first: + transaction.Add(pkg.name) + transaction.get_to_remove() + transaction.get_to_add() + transaction.check_conflicts() + transaction.Release() + set_transaction_sum() + ConfDialog.show_all() + else: + if transaction.init_transaction(): + error = transaction.Sysupgrade() + if error: + transaction.ErrorDialog.format_secondary_text(error) + response = transaction.ErrorDialog.run() + if response: + transaction.ErrorDialog.hide() + transaction.Release() + transaction.t_lock = False + transaction.get_to_remove() + transaction.get_to_add() + transaction.check_conflicts() + transaction.Release() + if len(transaction.to_add) + len(transaction.to_update) + len(transaction.to_remove) != 0: + set_transaction_sum() + ConfDialog.show_all() + else: + transaction.Release() + transaction.t_lock = False + def handle_error(error): global transaction_type global transaction_dict @@ -252,6 +284,9 @@ def handle_reply(reply): response = transaction.ErrorDialog.run() if response: transaction.ErrorDialog.hide() + if transaction.do_syncfirst is True: + transaction.do_syncfirst = False + transaction.list_first = [] transaction.t_lock = False transaction.Release() transaction.ProgressWindow.hide() @@ -318,8 +353,15 @@ class Handler: transaction.get_to_add() transaction.check_conflicts() transaction.Release() - set_transaction_sum() - ConfDialog.show_all() + if len(transaction.to_add) + len(transaction.to_update) + len(transaction.to_remove) != 0: + set_transaction_sum() + ConfDialog.show_all() + else: + transaction.WarningDialog.format_secondary_text('Nothing to do due to packages conflicts') + response = transaction.WarningDialog.run() + if response: + transaction.WarningDialog.hide() + transaction.t_lock = False def on_EraseButton_clicked(self, *arg): global transaction_type @@ -333,9 +375,13 @@ class Handler: refresh_packages_list() def on_TransCancelButton_clicked(self, *arg): + global transaction_type + transaction.ProgressWindow.hide() ConfDialog.hide() transaction.t_lock = False transaction.Release() + if transaction_type == "update": + transaction_type = None def on_TransValidButton_clicked(self, *arg): ConfDialog.hide() @@ -343,13 +389,15 @@ class Handler: transaction.action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/setup.png') while Gtk.events_pending(): Gtk.main_iteration() - if transaction_type is "remove": + if transaction_type == "remove": transaction.ProgressWindow.show_all() while Gtk.events_pending(): Gtk.main_iteration() transaction.Commit(reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000) - if transaction_type is "install": + if transaction_type == ("install" or "update"): if transaction.init_transaction(noconflicts = True, nodeps = True): + for pkgname in transaction.to_update: + transaction.Add(pkgname) for pkgname in transaction.to_add: transaction.Add(pkgname) for pkgname in transaction.to_remove: @@ -449,7 +497,19 @@ class Handler: def main(): interface.connect_signals(Handler()) + transaction.do_refresh() + do_sysupgrade() + #~ if transaction.get_updates(): + #~ transaction.QuestionDialog.format_secondary_text("Some updates are available.\nIt is higly recommended to update your system before installing/removing software.\nDo you want to update your system now ?") + #~ response = transaction.QuestionDialog.run() + #~ if response == Gtk.ResponseType.YES: + #~ transaction.QuestionDialog.hide() + #~ do_sysupgrade() + #~ else: + #~ transaction.QuestionDialog.hide() MainWindow.show_all() + while Gtk.events_pending(): + Gtk.main_iteration() if __name__ == "__main__": main() diff --git a/pamac/pamac-daemon.py b/pamac/pamac-daemon.py index 08d09c7..deff79b 100755 --- a/pamac/pamac-daemon.py +++ b/pamac/pamac-daemon.py @@ -165,7 +165,6 @@ class PamacDBusService(dbus.service.Object): try: t = config.handle.init_transaction() db.update(force=False) - print('refresh') t.release() except pyalpm.error: error = traceback.format_exc() diff --git a/pamac/transaction.py b/pamac/transaction.py index bc416bc..2a1a4e4 100755 --- a/pamac/transaction.py +++ b/pamac/transaction.py @@ -1,10 +1,9 @@ #! /usr/bin/python # -*-coding:utf-8-*- -from gi.repository import Gtk, GObject +from gi.repository import Gtk import pyalpm -import traceback import dbus from dbus.mainloop.glib import DBusGMainLoop @@ -15,6 +14,7 @@ interface.add_from_file('/usr/share/pamac/gui/dialogs.glade') ErrorDialog = interface.get_object('ErrorDialog') WarningDialog = interface.get_object('WarningDialog') +QuestionDialog = interface.get_object('QuestionDialog') ProgressWindow = interface.get_object('ProgressWindow') progress_bar = interface.get_object('progressbar2') progress_label = interface.get_object('progresslabel2') @@ -64,10 +64,10 @@ def target_signal_handler(target): progress_bar.set_text(target) def percent_signal_handler(percent): - if percent == '0': - progress_bar.pulse() - else: - progress_bar.set_fraction(float(percent)) + #~ if percent == '0': + #~ progress_bar.pulse() + #~ else: + progress_bar.set_fraction(float(percent)) bus.add_signal_receiver(action_signal_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitAction") bus.add_signal_receiver(icon_signal_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitIcon") @@ -82,7 +82,7 @@ def init_transaction(**options): t_lock = True return True else: - ErrorDialog.format_secondary_text(error) + ErrorDialog.format_secondary_text('Init Error:\n'+str(error)) response = ErrorDialog.run() if response: ErrorDialog.hide() @@ -111,16 +111,28 @@ def check_conflicts(): warning = warning+pkg.name+' will be replaced by '+target.name if target.conflicts: for name in target.conflicts: + if name in to_add: + to_add.remove(name) + to_add.remove(target.name) + if warning: + warning = warning+'\n' + warning = warning+name+' conflicts with '+target.name+'\nNone of them will be installed' pkg = handle.get_localdb().get_pkg(name) if pkg: if not pkg.name in to_remove: to_remove.append(pkg.name) + if warning: + warning = warning+'\n' + warning = warning+pkg.name+' conflicts with '+target.name for installed_pkg in handle.get_localdb().pkgcache: if installed_pkg.conflicts: for name in installed_pkg.conflicts: if name == target.name: if not name in to_remove: to_remove.append(installed_pkg.name) + if warning: + warning = warning+'\n' + warning = warning+installed_pkg.name+' conflicts with '+target.name for repo in handle.get_syncdbs(): for pkg in repo.pkgcache: if pkg.replaces: @@ -141,8 +153,6 @@ def check_conflicts(): if response: WarningDialog.hide() - - def get_to_remove(): global to_remove to_remove = To_Remove() @@ -154,21 +164,31 @@ def get_to_add(): def do_refresh(): """Sync databases like pacman -Sy""" global t_lock - ProgressWindow.show_all() - print('show') + get_handle() if t_lock is False: t_lock = True + progress_label.set_text('Refreshing...') + action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/refresh-cache.png') ProgressWindow.show_all() - error = Refresh(timeout = 2000*1000) - if error: - ErrorDialog.format_secondary_text(error) - response = ErrorDialog.run() - if response: - ErrorDialog.hide() - Release() - ProgressWindow.hide() - print('hide') - t_lock = False + while Gtk.events_pending(): + Gtk.main_iteration() + Refresh(reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000) + +def handle_error(error): + global t_lock + if not 'DBus.Error.NoReply' in str(error): + transaction.ErrorDialog.format_secondary_text('Refresh Error:\n'+str(error)) + response = transaction.ErrorDialog.run() + if response: + transaction.ErrorDialog.hide() + t_lock = False + Release() + ProgressWindow.hide() + +def handle_reply(reply): + global t_lock + t_lock = False + ProgressWindow.hide() def get_updates(): """Return a list of package objects in local db which can be updated""" diff --git a/pamac/updater.py b/pamac/updater.py index ee14112..03a3529 100755 --- a/pamac/updater.py +++ b/pamac/updater.py @@ -3,9 +3,6 @@ from gi.repository import Gtk -import pyalpm -from os import geteuid - from pamac import config, common, transaction interface = Gtk.Builder() @@ -65,13 +62,58 @@ def set_transaction_add(): #bottom_label.set_markup('Total Download size: '+format_size(totaldlcb)) top_label.set_markup('Additionnal Transaction(s)') +def do_sysupgrade(): + """Upgrade a system like pacman -Su""" + if transaction.t_lock is False: + if transaction.do_syncfirst is True: + if transaction.init_transaction(recurse = True): + for pkg in transaction.list_first: + transaction.Add(pkg.name) + transaction.get_to_remove() + transaction.get_to_add() + set_transaction_add() + if len(transaction.to_add) + len(transaction.to_remove) != 0: + ConfDialog.show_all() + else: + finalize() + else: + if transaction.init_transaction(): + error = transaction.Sysupgrade() + if error: + transaction.ErrorDialog.format_secondary_text(error) + response = transaction.ErrorDialog.run() + if response: + transaction.ErrorDialog.hide() + transaction.Release() + transaction.t_lock = False + transaction.get_to_remove() + transaction.get_to_add() + transaction.check_conflicts() + transaction.Release() + if len(transaction.to_update) == 0: + transaction.t_lock = False + print("Nothing to update") + else: + if transaction.init_transaction(noconflicts = True, nodeps = True): + for pkgname in transaction.to_update: + transaction.Add(pkgname) + for pkgname in transaction.to_add: + transaction.Add(pkgname) + for pkgname in transaction.to_remove: + transaction.Remove(pkgname) + set_transaction_add() + if len(transaction.to_add) + len(transaction.to_remove) != 0: + ConfDialog.show_all() + else: + finalize() + def finalize(): error = transaction.Prepare() if error: - ErrorDialog.format_secondary_text(error) - response = ErrorDialog.run() + transaction.ErrorDialog.format_secondary_text(error) + response = transaction.ErrorDialog.run() if response: - ErrorDialog.hide() + transaction.ErrorDialog.hide() transaction.Release() transaction.t_lock = False else: @@ -99,56 +141,14 @@ def handle_reply(reply): response = transaction.ErrorDialog.run() if response: transaction.ErrorDialog.hide() + if transaction.do_syncfirst is True: + transaction.do_syncfirst = False + transaction.list_first = [] transaction.t_lock = False transaction.Release() transaction.ProgressWindow.hide() have_updates() -def do_sysupgrade(): - """Upgrade a system like pacman -Su""" - if transaction.t_lock is False: - if transaction.do_syncfirst is True: - if transaction.init_transaction(recurse = True): - for pkg in transaction.list_first: - transaction.Add(pkg.name) - transaction.get_to_remove() - transaction.get_to_add() - set_transaction_add() - if len(transaction.to_add) != 0: - ConfDialog.show_all() - else: - finalize() - transaction.do_syncfirst = False - transaction.list_first = [] - else: - if transaction.init_transaction(): - error = transaction.Sysupgrade() - if error: - transaction.ErrorDialog.format_secondary_text(error) - response = transaction.ErrorDialog.run() - if response: - transaction.ErrorDialog.hide() - transaction.Release() - transaction.t_lock = False - transaction.get_to_remove() - transaction.get_to_add() - transaction.check_conflicts() - transaction.Release() - if len(transaction.to_add) + len(transaction.to_remove) == 0: - transaction.t_lock = False - print("Nothing to update") - else: - if transaction.init_transaction(noconflicts = True, nodeps = True): - for pkgname in transaction.to_add: - transaction.Add(pkgname) - for pkgname in transaction.to_remove: - transaction.Remove(pkgname) - set_transaction_add() - if len(transaction_add) != 0: - ConfDialog.show_all() - else: - finalize() - class Handler: def on_UpdateWindow_delete_event(self, *arg): transaction.StopDaemon() @@ -191,6 +191,8 @@ def main(): have_updates() interface.connect_signals(Handler()) UpdateWindow.show_all() + while Gtk.events_pending(): + Gtk.main_iteration() if __name__ == "__main__": main()