From 8a5abb4b4728915a16d5e2a5eafe6d57fb5c3a7e Mon Sep 17 00:00:00 2001 From: guinux Date: Mon, 18 Mar 2013 11:07:58 +0100 Subject: [PATCH] many fixes --- data/networkmanager/99_update_pamac_tray | 2 +- pamac-check-updates | 16 --- pamac-daemon | 6 +- pamac-install | 74 +++++++++++++ pamac-refresh | 30 ++++++ pamac-tray | 30 ++++-- pamac/config.py | 4 +- pamac/main.py | 126 ++++++++++++----------- 8 files changed, 200 insertions(+), 88 deletions(-) delete mode 100755 pamac-check-updates create mode 100755 pamac-install create mode 100755 pamac-refresh diff --git a/data/networkmanager/99_update_pamac_tray b/data/networkmanager/99_update_pamac_tray index 3d3fde6..7042895 100755 --- a/data/networkmanager/99_update_pamac_tray +++ b/data/networkmanager/99_update_pamac_tray @@ -5,6 +5,6 @@ STATUS=$2 # The new state of the interface case "$STATUS" in 'up') # $INTERFACE is up - /usr/bin/pamac-check-updates + /usr/bin/pamac-refresh ;; esac diff --git a/pamac-check-updates b/pamac-check-updates deleted file mode 100755 index 2028bbb..0000000 --- a/pamac-check-updates +++ /dev/null @@ -1,16 +0,0 @@ -#! /usr/bin/python -# -*-coding:utf-8-*- - -from pamac import common, transaction - -if not common.pid_file_exists(): - print('checking updates') - common.write_pid_file() - try: - transaction.Refresh() - transaction.StopDaemon() - except: - pass - finally: - common.rm_pid_file() - print('check updates done') diff --git a/pamac-daemon b/pamac-daemon index ce0d298..a2b70bd 100755 --- a/pamac-daemon +++ b/pamac-daemon @@ -180,11 +180,11 @@ class PamacDBusService(dbus.service.Object): pass def CheckUpdates(self): - updates = False + updates = 0 for pkg in config.handle.get_localdb().pkgcache: candidate = pyalpm.sync_newversion(pkg, config.handle.get_syncdbs()) if candidate: - updates = True + updates += 1 self.EmitAvailableUpdates(updates) @dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess')) @@ -205,6 +205,8 @@ class PamacDBusService(dbus.service.Object): self.CheckUpdates() if self.error: self.EmitTransactionError(self.error) + else: + self.EmitTransactionDone('') self.task = Process(target=refresh) self.task.start() success('') diff --git a/pamac-install b/pamac-install new file mode 100755 index 0000000..dd1ac83 --- /dev/null +++ b/pamac-install @@ -0,0 +1,74 @@ +#! /usr/bin/python +# -*-coding:utf-8 -*- + +from gi.repository import GObject +from sys import argv +import dbus +from pamac import common, transaction, main + +def error(error): + transaction.StopDaemon() + common.rm_pid_file() + print('exiting') + loop.quit() + +def reply(reply): + transaction.StopDaemon() + common.rm_pid_file() + print('exiting') + loop.quit() + +def install(pkgnames): + transaction.to_add = [] + transaction.to_remove = [] + pkg_to_install = [] + for pkgname in pkgnames: + if not pkgname in transaction.localpkgs.keys(): + transaction.to_add.append(pkgname) + pkg_to_install.append(transaction.syncpkgs[pkgname]) + main.check_conflicts(pkg_to_install) + if transaction.to_add: + if transaction.init_transaction(noconflicts = True, needed =True): + for pkgname in transaction.to_add: + transaction.Add(pkgname) + for pkgname in transaction.to_remove: + transaction.Remove(pkgname) + _error = transaction.Prepare() + if _error: + main.handle_error(_error) + error(_error) + else: + main.finalize() + loop.run() + else: + transaction.WarningDialog.format_secondary_text('Nothing to do') + response = transaction.WarningDialog.run() + if response: + transaction.WarningDialog.hide() + reply('') + +bus = dbus.SystemBus() +bus.add_signal_receiver(reply, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone") +bus.add_signal_receiver(error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError") + +loop = GObject.MainLoop() + +transaction.update_db() +do_syncfirst, updates = transaction.get_updates() + +if common.pid_file_exists(): + transaction.ErrorDialog.format_secondary_text('Another instance of Pamac is running') + response = transaction.ErrorDialog.run() + if response: + transaction.ErrorDialog.hide() + transaction.StopDaemon() +elif updates: + transaction.ErrorDialog.format_secondary_text('Some updates are available.\nPlease update your system first') + response = transaction.ErrorDialog.run() + if response: + transaction.ErrorDialog.hide() + transaction.StopDaemon() +else: + common.write_pid_file() + pkgname_to_install = argv[1:] + install(pkgname_to_install) diff --git a/pamac-refresh b/pamac-refresh new file mode 100755 index 0000000..033930c --- /dev/null +++ b/pamac-refresh @@ -0,0 +1,30 @@ +#! /usr/bin/python +# -*-coding:utf-8-*- + +from gi.repository import GObject +from pamac import common, transaction +import dbus + +def reply(reply): + transaction.StopDaemon() + common.rm_pid_file() + print('check updates done') + loop.quit() + +def error(error): + transaction.StopDaemon() + common.rm_pid_file() + print('check updates failed') + loop.quit() + +bus = dbus.SystemBus() +bus.add_signal_receiver(reply, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone") +bus.add_signal_receiver(error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError") + +loop = GObject.MainLoop() + +if not common.pid_file_exists(): + print('checking updates') + common.write_pid_file() + transaction.Refresh() + loop.run() diff --git a/pamac-tray b/pamac-tray index e9c8fff..29c8bcb 100755 --- a/pamac-tray +++ b/pamac-tray @@ -3,13 +3,20 @@ from gi.repository import Gtk, GObject from subprocess import call -from pamac import transaction +from pamac import common, transaction import dbus import threading GObject.threads_init() bus = dbus.SystemBus() +icon = '' +info = '' +update_icon = '/usr/share/pamac/icons/scalable/status/update-normal.svg' +update_info = '{} Updates Available' +noupdate_icon = '/usr/share/pamac/icons/scalable/status/update-enhancement.svg' +noupdate_info = ' No Update Available' + class Tray: def __init__(self): self.statusIcon = Gtk.StatusIcon() @@ -27,6 +34,7 @@ class Tray: self.menu.append(self.menuItem) self.statusIcon.connect('popup-menu', self.popup_menu_cb, self.menu) + self.statusIcon.connect('activate', self.activate_cb, self.menu) def execute_update(self, widget, event, data = None): call(['/usr/bin/pamac-updater']) @@ -44,6 +52,9 @@ class Tray: data.show_all() data.popup(None, None, Gtk.StatusIcon.position_menu, self.statusIcon, 3, time) + def activate_cb(self, widget, data = None): + call(['notify-send', '-i', icon, '-u', 'normal', 'Pamac', info]) + def update_icon(self, icon, info): self.statusIcon.set_from_file(icon) self.statusIcon.set_tooltip_markup(info) @@ -72,18 +83,19 @@ class PeriodicTask(threading.Thread): self._finished.wait(self._interval) def task(self): - call(['/usr/bin/pamac-check-updates']) + call(['/usr/bin/pamac-refresh']) def set_icon(updates): - print('set-icon') - #transaction.get_handle() - #do_syncfirst, updates = transaction.get_updates() + global icon + global info if updates: - icon = '/usr/share/pamac/icons/24x24/status/update-normal.png' - info = 'Updates available' + icon = update_icon + info = update_info.format(updates) + if not common.pid_file_exists(): + call(['notify-send', '-i', icon, '-u', 'normal', 'Pamac', info]) else: - icon = '/usr/share/pamac/icons/24x24/status/update-enhancement.png' - info = ' No update available' + icon = noupdate_icon + info = noupdate_info print(info) tray.update_icon(icon, info) diff --git a/pamac/config.py b/pamac/config.py index 3e9572e..0484fe2 100644 --- a/pamac/config.py +++ b/pamac/config.py @@ -186,8 +186,8 @@ class PacmanConfig(object): pacman_conf = PacmanConfig(conf = "/etc/pacman.conf") handle = pacman_conf.initialize_alpm() -holpkg = None -syncfirst = None +holdpkg = [] +syncfirst = [] if 'HoldPkg' in pacman_conf.options: holdpkg = pacman_conf.options['HoldPkg'] if 'SyncFirst' in pacman_conf.options: diff --git a/pamac/main.py b/pamac/main.py index 4702698..c19ada9 100644 --- a/pamac/main.py +++ b/pamac/main.py @@ -275,6 +275,8 @@ def handle_error(error): global transaction_type global transaction_dict ProgressWindow.hide() + #while Gtk.events_pending(): + # Gtk.main_iteration() if error: if not 'DBus.Error.NoReply' in str(error): print('error:', error) @@ -299,6 +301,8 @@ def handle_reply(reply): global transaction_type global transaction_dict ProgressWindow.hide() + #while Gtk.events_pending(): + # Gtk.main_iteration() if reply: transaction.InfoDialog.format_secondary_text(reply) response = transaction.InfoDialog.run() @@ -332,10 +336,12 @@ def do_refresh(): transaction.t_lock = True progress_label.set_text('Refreshing...') action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/refresh-cache.png') + progress_bar.set_text('') + progress_bar.set_fraction(0) ProgressWindow.show_all() while Gtk.events_pending(): Gtk.main_iteration() - transaction.Refresh(reply_handler = handle_reply, error_handler = handle_error)#, timeout = 2000*1000) + transaction.Refresh()#reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000) def have_updates(): do_syncfirst, updates = transaction.get_updates() @@ -361,8 +367,8 @@ def do_sysupgrade(): if updates: transaction.to_add = [] transaction.to_remove = [] - check_conflicts(updates) if do_syncfirst: + check_conflicts('normal', updates) for pkg in updates: transaction.to_add.append(pkg.name) if transaction.init_transaction(recurse = True, needed = True): @@ -385,6 +391,7 @@ def do_sysupgrade(): if mode == 'manager': ConfDialog.show_all() else: + check_conflicts('updating', updates) if transaction.init_transaction(noconflicts = True): error = transaction.Sysupgrade() if error: @@ -413,12 +420,13 @@ def finalize(): progress_label.set_text('Preparing...') action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/setup.png') progress_bar.set_text('') + progress_bar.set_fraction(0) ProgressWindow.show_all() while Gtk.events_pending(): Gtk.main_iteration() transaction.Commit()#reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000) -def check_conflicts(pkg_list): +def check_conflicts(mode, pkg_list): depends = [pkg_list] warning = '' error = '' @@ -495,24 +503,35 @@ def check_conflicts(pkg_list): transaction.to_add.append(_pkg.name) else: depends[i+1].append(provide) - for replace in pkg.replaces: - provide = pyalpm.find_satisfier(transaction.localpkgs.values(), replace) - if provide: - if provide.name != pkg.name: - if not provide.name in transaction.to_remove: - transaction.to_remove.append(provide.name) - if warning: - warning = warning+'\n' - warning = warning+provide.name+' will be replaced by '+pkg.name + if mode == 'updating': + for replace in pkg.replaces: + provide = pyalpm.find_satisfier(transaction.localpkgs.values(), replace) + if provide: + if provide.name != pkg.name: + if not provide.name in transaction.to_remove: + transaction.to_remove.append(provide.name) + if warning: + warning += '\n' + warning += provide.name+' will be replaced by '+pkg.name for conflict in pkg.conflicts: provide = pyalpm.find_satisfier(transaction.localpkgs.values(), conflict) if provide: if provide.name != pkg.name: - if not provide.name in transaction.to_remove: + required = pkg.compute_requiredby() + if required: + str_required = '' + for i in required: + if str_required: + str_required += ', ' + str_required += i + if error: + error += '\n' + error += '{} conflicts with {} but cannot be removed because it is needed by {}'.format(provide.name, pkg.name, str_required) + elif not provide.name in transaction.to_remove: transaction.to_remove.append(provide.name) if warning: - warning = warning+'\n' - warning = warning+pkg.name+' conflicts with '+provide.name + warning += '\n' + warning += pkg.name+' conflicts with '+provide.name provide = pyalpm.find_satisfier(depends[0], conflict) if provide: if not common.format_pkg_name(conflict) == pkg.name: @@ -521,60 +540,51 @@ def check_conflicts(pkg_list): transaction.to_add.remove(common.format_pkg_name(conflict)) transaction.to_add.remove(pkg.name) if warning: - warning = warning+'\n' - warning = warning+pkg.name+' conflicts with '+common.format_pkg_name(conflict)+'\nNone of them will be installed' + warning += '\n' + warning += pkg.name+' conflicts with '+common.format_pkg_name(conflict)+'\nNone of them will be installed' i += 1 for pkg in transaction.localpkgs.values(): for conflict in pkg.conflicts: provide = pyalpm.find_satisfier(depends[0], conflict) if provide: if provide.name != pkg.name: - if not provide.name in transaction.to_remove: + required = pkg.compute_requiredby() + if required: + str_required = '' + for i in required: + if str_required: + str_required += ', ' + str_required += i + if error: + error += '\n' + error += '{} conflicts with {} but cannot be removed because it is needed by {}'.format(provide.name, pkg.name, str_required) + elif not provide.name in transaction.to_remove: transaction.to_remove.append(pkg.name) if warning: - warning = warning+'\n' - warning = warning+provide.name+' conflicts with '+pkg.name - for pkg in transaction.syncpkgs.values(): - for replace in pkg.replaces: - provide = pyalpm.find_satisfier(transaction.localpkgs.values(), replace) - if provide: - if not common.format_pkg_name(replace) in transaction.syncpkgs.keys(): - if provide.name != pkg.name: - if not pkg.name in transaction.localpkgs.keys(): - if common.format_pkg_name(replace) in transaction.localpkgs.keys(): - if not provide.name in transaction.to_remove: - transaction.to_remove.append(provide.name) - if warning: - warning = warning+'\n' - warning = warning+provide.name+' will be replaced by '+pkg.name - if not pkg.name in transaction.to_add: - transaction.to_add.append(pkg.name) - print(transaction.to_add,transaction.to_remove) + warning += '\n' + warning += provide.name+' conflicts with '+pkg.name + if mode == 'updating': + for pkg in transaction.syncpkgs.values(): + for replace in pkg.replaces: + provide = pyalpm.find_satisfier(transaction.localpkgs.values(), replace) + if provide: + if not common.format_pkg_name(replace) in transaction.syncpkgs.keys(): + if provide.name != pkg.name: + if not pkg.name in transaction.localpkgs.keys(): + if common.format_pkg_name(replace) in transaction.localpkgs.keys(): + if not provide.name in transaction.to_remove: + transaction.to_remove.append(provide.name) + if warning: + warning += '\n' + warning += provide.name+' will be replaced by '+pkg.name + if not pkg.name in transaction.to_add: + transaction.to_add.append(pkg.name) + print('check result:', 'to add:', transaction.to_add, 'to remove:', transaction.to_remove) if warning: transaction.WarningDialog.format_secondary_text(warning) response = transaction.WarningDialog.run() if response: transaction.WarningDialog.hide() - pkg_list = {} - for pkgname in transaction.to_remove: - pkg_list[pkgname] = transaction.localpkgs[pkgname] - for pkgname in transaction.to_add: - pkg = transaction.syncpkgs[pkgname] - for replace in pkg.replaces: - provide = pyalpm.find_satisfier(pkg_list.values(), replace) - if provide: - pkg_list.pop(provide.name) - for pkg in pkg_list.values(): - required = pkg.compute_requiredby() - if required: - str_required = '' - for i in required: - if str_required: - str_required += ', ' - str_required += i - if error: - error = error+'\n' - error += 'Cannot remove {} because it is needed by {}'.format(pkgname, str_required) if error: handle_error(error) @@ -638,7 +648,7 @@ class Handler: for pkgname in transaction_dict.keys(): transaction.to_add.append(pkgname) transaction.to_remove = [] - check_conflicts(transaction_dict.values()) + check_conflicts('normal', transaction_dict.values()) if transaction.to_add: if transaction.init_transaction(noconflicts = True): for pkgname in transaction.to_add: @@ -781,7 +791,7 @@ class Handler: transaction.to_provide.remove(choose_list[line][1]) line += 1 -#Updater Handlers + #Updater Handlers def on_UpdaterWindow_delete_event(self, *arg): transaction.StopDaemon() common.rm_pid_file()