finnally got it ;)

This commit is contained in:
guinux 2013-03-15 17:15:34 +01:00
parent 76714eedb8
commit 73e1e8d6c0
5 changed files with 172 additions and 99 deletions

View File

@ -10,7 +10,6 @@
<property name="window_position">center-on-parent</property> <property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property> <property name="type_hint">dialog</property>
<property name="skip_taskbar_hint">True</property> <property name="skip_taskbar_hint">True</property>
<property name="urgency_hint">True</property>
<property name="has_resize_grip">False</property> <property name="has_resize_grip">False</property>
<property name="message_type">error</property> <property name="message_type">error</property>
<property name="buttons">ok</property> <property name="buttons">ok</property>
@ -36,6 +35,41 @@
</object> </object>
</child> </child>
</object> </object>
<object class="GtkMessageDialog" id="InfoDialog">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property>
<property name="skip_taskbar_hint">True</property>
<property name="buttons">ok</property>
<child internal-child="vbox">
<object class="GtkBox" id="messagedialog-vbox9">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="messagedialog-action_area9">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkMessageDialog" id="QuestionDialog"> <object class="GtkMessageDialog" id="QuestionDialog">
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="border_width">5</property> <property name="border_width">5</property>

View File

@ -9,7 +9,6 @@
<property name="window_position">center-on-parent</property> <property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property> <property name="type_hint">dialog</property>
<property name="skip_taskbar_hint">True</property> <property name="skip_taskbar_hint">True</property>
<property name="urgency_hint">True</property>
<property name="deletable">False</property> <property name="deletable">False</property>
<property name="transient_for">ManagerWindow</property> <property name="transient_for">ManagerWindow</property>
<child internal-child="vbox"> <child internal-child="vbox">
@ -121,7 +120,6 @@
<property name="icon">/usr/share/pamac/icons/22x22/status/package-info.png</property> <property name="icon">/usr/share/pamac/icons/22x22/status/package-info.png</property>
<property name="type_hint">dialog</property> <property name="type_hint">dialog</property>
<property name="skip_taskbar_hint">True</property> <property name="skip_taskbar_hint">True</property>
<property name="urgency_hint">True</property>
<property name="deletable">False</property> <property name="deletable">False</property>
<property name="transient_for">ManagerWindow</property> <property name="transient_for">ManagerWindow</property>
<child> <child>
@ -265,6 +263,7 @@
<property name="height_request">500</property> <property name="height_request">500</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="title" translatable="yes">Pamac</property> <property name="title" translatable="yes">Pamac</property>
<property name="window_position">center</property>
<property name="default_width">800</property> <property name="default_width">800</property>
<property name="default_height">500</property> <property name="default_height">500</property>
<property name="icon">/usr/share/pamac/icons/22x22/status/package-sources.png</property> <property name="icon">/usr/share/pamac/icons/22x22/status/package-sources.png</property>

View File

@ -8,7 +8,7 @@ from gi.repository import GObject
import pyalpm import pyalpm
#import traceback #import traceback
#import threading from multiprocessing import Process
from pamac import config, common from pamac import config, common
class PamacDBusService(dbus.service.Object): class PamacDBusService(dbus.service.Object):
@ -17,6 +17,7 @@ class PamacDBusService(dbus.service.Object):
bus_name = dbus.service.BusName('org.manjaro.pamac', bus) bus_name = dbus.service.BusName('org.manjaro.pamac', bus)
dbus.service.Object.__init__(self, bus_name, '/org/manjaro/pamac') dbus.service.Object.__init__(self, bus_name, '/org/manjaro/pamac')
self.t = None self.t = None
self.task = None
self.error = '' self.error = ''
self.warning = '' self.warning = ''
self.action = 'Preparing...' self.action = 'Preparing...'
@ -109,14 +110,13 @@ class PamacDBusService(dbus.service.Object):
print("conversation", args) print("conversation", args)
def cb_log(self, level, line): def cb_log(self, level, line):
#global t
_logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING _logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
if not (level & _logmask): if not (level & _logmask):
return return
if level & pyalpm.LOG_ERROR: if level & pyalpm.LOG_ERROR:
self.error += "ERROR: "+line self.error += "ERROR: "+line
print(self.error) print(self.error)
#t.release() #self.t.release()
elif level & pyalpm.LOG_WARNING: elif level & pyalpm.LOG_WARNING:
self.warning += "WARNING: "+line self.warning += "WARNING: "+line
elif level & pyalpm.LOG_DEBUG: elif level & pyalpm.LOG_DEBUG:
@ -133,25 +133,28 @@ class PamacDBusService(dbus.service.Object):
if self.total_size > 0: if self.total_size > 0:
fraction = (_transferred+self.already_transferred)/self.total_size fraction = (_transferred+self.already_transferred)/self.total_size
size = 0 size = 0
if (t.to_remove or t.to_add): try:
for pkg in t.to_remove+t.to_add: if (self.t.to_remove or self.t.to_add):
if pkg.name+'-'+pkg.version in _target: for pkg in self.t.to_remove+self.t.to_add:
size = pkg.size if pkg.name+'-'+pkg.version in _target:
if _transferred == size: size = pkg.size
self.already_transferred += size if _transferred == size:
self.action = 'Downloading '+common.format_size(self.total_size) self.already_transferred += size
self.target = _target self.action = 'Downloading '+common.format_size(self.total_size)
self.percent = fraction self.target = _target
self.icon = '/usr/share/pamac/icons/24x24/status/package-download.png' self.percent = fraction
else: self.icon = '/usr/share/pamac/icons/24x24/status/package-download.png'
self.action = 'Refreshing...' else:
self.target = _target self.action = 'Refreshing...'
self.percent = 2 self.target = _target
self.icon = '/usr/share/pamac/icons/24x24/status/refresh-cache.png' self.percent = 2
self.EmitAction(self.action) self.icon = '/usr/share/pamac/icons/24x24/status/refresh-cache.png'
self.EmitIcon(self.icon) self.EmitAction(self.action)
self.EmitTarget(self.target) self.EmitIcon(self.icon)
self.EmitPercent(str(self.percent)) self.EmitTarget(self.target)
self.EmitPercent(str(self.percent))
except pyalpm.error:
pass
def cb_progress(self, _target, _percent, n, i): def cb_progress(self, _target, _percent, n, i):
self.target = _target+' ('+str(i)+'/'+str(n)+')' self.target = _target+' ('+str(i)+'/'+str(n)+')'
@ -159,7 +162,7 @@ class PamacDBusService(dbus.service.Object):
self.EmitTarget(self.target) self.EmitTarget(self.target)
self.EmitPercent(str(self.percent)) self.EmitPercent(str(self.percent))
def policykit_test(self, sender,connexion, action): def policykit_test(self, sender, connexion, action):
bus = dbus.SystemBus() bus = dbus.SystemBus()
proxy_dbus = connexion.get_object('org.freedesktop.DBus','/org/freedesktop/DBus/Bus', False) proxy_dbus = connexion.get_object('org.freedesktop.DBus','/org/freedesktop/DBus/Bus', False)
dbus_info = dbus.Interface(proxy_dbus,'org.freedesktop.DBus') dbus_info = dbus.Interface(proxy_dbus,'org.freedesktop.DBus')
@ -184,30 +187,35 @@ class PamacDBusService(dbus.service.Object):
updates = True updates = True
self.EmitAvailableUpdates(updates) self.EmitAvailableUpdates(updates)
@dbus.service.method('org.manjaro.pamac', '', 's') @dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
def Refresh(self): def Refresh(self, success, nosuccess):
global t def refresh():
self.error = '' self.target = ''
for db in config.handle.get_syncdbs(): self.percent = 0
try: self.error = ''
t = config.handle.init_transaction() for db in config.handle.get_syncdbs():
db.update(force=False) try:
t.release() self.t = config.handle.init_transaction()
except pyalpm.error as e: db.update(force=False)
self.error += ' --> '+str(e)+'\n' except pyalpm.error as e:
t.release() self.error += ' --> '+str(e)+'\n'
#break #break
self.CheckUpdates() finally:
return self.error self.t.release()
self.CheckUpdates()
if self.error:
self.EmitTransactionError(self.error)
self.task = Process(target=refresh)
self.task.start()
success('')
@dbus.service.method('org.manjaro.pamac', 'a{sb}', 's', sender_keyword='sender', connection_keyword='connexion') @dbus.service.method('org.manjaro.pamac', 'a{sb}', 's', sender_keyword='sender', connection_keyword='connexion')
def Init(self, options, sender=None, connexion=None): def Init(self, options, sender=None, connexion=None):
global t
self.error = '' self.error = ''
if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'): if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
try: try:
t = config.handle.init_transaction(**options) self.t = config.handle.init_transaction(**options)
print('Init:',t.flags) print('Init:',self.t.flags)
except pyalpm.error as e: except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n' self.error += ' --> '+str(e)+'\n'
finally: finally:
@ -217,11 +225,10 @@ class PamacDBusService(dbus.service.Object):
@dbus.service.method('org.manjaro.pamac', '', 's') @dbus.service.method('org.manjaro.pamac', '', 's')
def Sysupgrade(self): def Sysupgrade(self):
global t
self.error = '' self.error = ''
try: try:
t.sysupgrade(downgrade=False) self.t.sysupgrade(downgrade=False)
print('to_upgrade:',t.to_add) print('to_upgrade:',self.t.to_add)
except pyalpm.error as e: except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n' self.error += ' --> '+str(e)+'\n'
finally: finally:
@ -229,12 +236,11 @@ class PamacDBusService(dbus.service.Object):
@dbus.service.method('org.manjaro.pamac', 's', 's') @dbus.service.method('org.manjaro.pamac', 's', 's')
def Remove(self, pkgname): def Remove(self, pkgname):
global t
self.error = '' self.error = ''
try: try:
pkg = config.handle.get_localdb().get_pkg(pkgname) pkg = config.handle.get_localdb().get_pkg(pkgname)
if pkg is not None: if pkg is not None:
t.remove_pkg(pkg) self.t.remove_pkg(pkg)
except pyalpm.error as e: except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n' self.error += ' --> '+str(e)+'\n'
finally: finally:
@ -242,13 +248,12 @@ class PamacDBusService(dbus.service.Object):
@dbus.service.method('org.manjaro.pamac', 's', 's') @dbus.service.method('org.manjaro.pamac', 's', 's')
def Add(self, pkgname): def Add(self, pkgname):
global t
self.error = '' self.error = ''
try: try:
for repo in config.handle.get_syncdbs(): for repo in config.handle.get_syncdbs():
pkg = repo.get_pkg(pkgname) pkg = repo.get_pkg(pkgname)
if pkg: if pkg:
t.add_pkg(pkg) self.t.add_pkg(pkg)
break break
except pyalpm.error as e: except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n' self.error += ' --> '+str(e)+'\n'
@ -257,12 +262,11 @@ class PamacDBusService(dbus.service.Object):
@dbus.service.method('org.manjaro.pamac', '', 's') @dbus.service.method('org.manjaro.pamac', '', 's')
def Prepare(self): def Prepare(self):
global t
self.error = '' self.error = ''
try: try:
t.prepare() self.t.prepare()
print('to_add:',t.to_add) print('to_add:',self.t.to_add)
print('to_remove:',t.to_remove) print('to_remove:',self.t.to_remove)
except pyalpm.error as e: except pyalpm.error as e:
print(e) print(e)
self.error += ' --> '+str(e)+'\n' self.error += ' --> '+str(e)+'\n'
@ -271,48 +275,79 @@ class PamacDBusService(dbus.service.Object):
@dbus.service.method('org.manjaro.pamac', '', 'as') @dbus.service.method('org.manjaro.pamac', '', 'as')
def To_Remove(self): def To_Remove(self):
global t
liste = [] liste = []
for pkg in t.to_remove: for pkg in self.t.to_remove:
liste.append(pkg.name) liste.append(pkg.name)
return liste return liste
@dbus.service.method('org.manjaro.pamac', '', 'as') @dbus.service.method('org.manjaro.pamac', '', 'as')
def To_Add(self): def To_Add(self):
global t
liste = [] liste = []
for pkg in t.to_add: for pkg in self.t.to_add:
liste.append(pkg.name) liste.append(pkg.name)
return liste return liste
@dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion')#, async_callbacks=('success', 'nosuccess')) @dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
def Commit(self, sender=None, connexion=None):#success, nosuccess, sender=None, connexion=None): def Interrupt(self, success, nosuccess):
global t def interrupt():
self.error = '' self.error = ''
if self.policykit_test(sender,connexion,'org.manjaro.pamac.commit'): #try:
# self.t.interrupt()
#except pyalpm.error as e:
# self.error += ' --> '+str(e)+'\n'
try: try:
t.commit() self.t.release()
#success('') #except pyalpm.error as e:
#self.error += ' --> '+str(e)+'\n'
except:
pass
finally:
self.CheckUpdates()
#if self.error:
#self.EmitTransactionError(self.error)
self.task.terminate()
interrupt()
success('')
@dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion', async_callbacks=('success', 'nosuccess'))
def Commit(self, success, nosuccess, sender=None, connexion=None):
def commit():
self.error = ''
try:
self.t.commit()
except pyalpm.error as e: except pyalpm.error as e:
#error = traceback.format_exc() #error = traceback.format_exc()
self.error += ' --> '+str(e)+'\n' self.error += ' --> '+str(e)+'\n'
#nosuccess(self.error)
#except dbus.exceptions.DBusException: #except dbus.exceptions.DBusException:
#pass #pass
finally: finally:
self.CheckUpdates() self.CheckUpdates()
return self.error if self.error:
self.EmitTransactionError(self.error)
else:
self.EmitTransactionDone('Transaction successfully finished')
if self.policykit_test(sender,connexion,'org.manjaro.pamac.commit'):
self.task = Process(target=commit)
self.task.start()
else : else :
return 'You are not authorized' self.t.release()
#nosuccess('You are not authorized') self.EmitTransactionError('You are not authorized')
success('')
@dbus.service.signal('org.manjaro.pamac')
def EmitTransactionDone(self, message):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitTransactionError(self, message):
pass
@dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion') @dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion')
def Release(self, sender=None, connexion=None): def Release(self, sender=None, connexion=None):
global t
self.error = '' self.error = ''
if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'): if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
try: try:
t.release() self.t.release()
except pyalpm.error as e: except pyalpm.error as e:
self.error += ' --> '+str(e)+'\n' self.error += ' --> '+str(e)+'\n'
finally: finally:
@ -322,13 +357,13 @@ class PamacDBusService(dbus.service.Object):
@dbus.service.method('org.manjaro.pamac') @dbus.service.method('org.manjaro.pamac')
def StopDaemon(self): def StopDaemon(self):
global t
try: try:
t.release() self.t.release()
except: except:
pass pass
mainloop.quit() mainloop.quit()
GObject.threads_init()
DBusGMainLoop(set_as_default=True) DBusGMainLoop(set_as_default=True)
myservice = PamacDBusService() myservice = PamacDBusService()
mainloop = GObject.MainLoop() mainloop = GObject.MainLoop()

View File

@ -12,10 +12,11 @@ from pamac import config, common, transaction
interface = Gtk.Builder() interface = Gtk.Builder()
interface.add_from_file('/usr/share/pamac/gui/dialogs.glade') #interface.add_from_file('/usr/share/pamac/gui/dialogs.glade')
ErrorDialog = interface.get_object('ErrorDialog') #ErrorDialog = interface.get_object('ErrorDialog')
WarningDialog = interface.get_object('WarningDialog') #WarningDialog = interface.get_object('WarningDialog')
QuestionDialog = interface.get_object('QuestionDialog') #InfoDialog = interface.get_object('InfoDialog')
#QuestionDialog = interface.get_object('QuestionDialog')
interface.add_from_file('/usr/share/pamac/gui/manager.glade') interface.add_from_file('/usr/share/pamac/gui/manager.glade')
ManagerWindow = interface.get_object("ManagerWindow") ManagerWindow = interface.get_object("ManagerWindow")
@ -49,12 +50,10 @@ update_label = interface.get_object('update_label')
def action_signal_handler(action): def action_signal_handler(action):
if action: if action:
progress_label.set_text(action) progress_label.set_text(action)
#if 'Downloading' in action: if ('Refreshing' in action) or ('Preparing' in action) or ('Downloading' in action) or ('Checking' in action) or ('Resolving' in action) or ('Loading' in action):
# print('cancel enabled') ProgressCancelButton.set_visible(True)
# ProgressCancelButton.set_visible(True) else:
#else: ProgressCancelButton.set_visible(False)
ProgressCancelButton.set_visible(False)
#print('cancel disabled')
def icon_signal_handler(icon): def icon_signal_handler(icon):
action_icon.set_from_file(icon) action_icon.set_from_file(icon)
@ -275,6 +274,7 @@ def set_transaction_sum():
def handle_error(error): def handle_error(error):
global transaction_type global transaction_type
global transaction_dict global transaction_dict
ProgressWindow.hide()
if error: if error:
if not 'DBus.Error.NoReply' in str(error): if not 'DBus.Error.NoReply' in str(error):
print('error:', error) print('error:', error)
@ -283,11 +283,7 @@ def handle_error(error):
if response: if response:
transaction.ErrorDialog.hide() transaction.ErrorDialog.hide()
transaction.t_lock = False transaction.t_lock = False
try: transaction.Release()
transaction.Release()
except:
pass
ProgressWindow.hide()
if mode == 'manager': if mode == 'manager':
transaction.to_add = [] transaction.to_add = []
transaction.to_remove = [] transaction.to_remove = []
@ -302,17 +298,17 @@ def handle_error(error):
def handle_reply(reply): def handle_reply(reply):
global transaction_type global transaction_type
global transaction_dict global transaction_dict
ProgressWindow.hide()
if reply: if reply:
transaction.ErrorDialog.format_secondary_text(reply) transaction.InfoDialog.format_secondary_text(reply)
response = transaction.ErrorDialog.run() response = transaction.InfoDialog.run()
if response: if response:
transaction.ErrorDialog.hide() transaction.InfoDialog.hide()
transaction.t_lock = False transaction.t_lock = False
try: try:
transaction.Release() transaction.Release()
except: except:
pass pass
ProgressWindow.hide()
transaction.to_add = [] transaction.to_add = []
transaction.to_remove = [] transaction.to_remove = []
transaction_dict.clear() transaction_dict.clear()
@ -327,6 +323,9 @@ def handle_reply(reply):
if mode == 'manager': if mode == 'manager':
do_sysupgrade() do_sysupgrade()
bus.add_signal_receiver(handle_reply, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone")
bus.add_signal_receiver(handle_error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError")
def do_refresh(): def do_refresh():
"""Sync databases like pacman -Sy""" """Sync databases like pacman -Sy"""
if transaction.t_lock is False: if transaction.t_lock is False:
@ -336,7 +335,7 @@ def do_refresh():
ProgressWindow.show_all() ProgressWindow.show_all()
while Gtk.events_pending(): while Gtk.events_pending():
Gtk.main_iteration() 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(): def have_updates():
do_syncfirst, updates = transaction.get_updates() do_syncfirst, updates = transaction.get_updates()
@ -417,7 +416,7 @@ def finalize():
ProgressWindow.show_all() ProgressWindow.show_all()
while Gtk.events_pending(): while Gtk.events_pending():
Gtk.main_iteration() Gtk.main_iteration()
transaction.Commit(reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000) transaction.Commit()#reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000)
def check_conflicts(pkg_list): def check_conflicts(pkg_list):
depends = [pkg_list] depends = [pkg_list]
@ -801,7 +800,11 @@ class Handler:
def on_ProgressCancelButton_clicked(self, *arg): def on_ProgressCancelButton_clicked(self, *arg):
print('cancelled') print('cancelled')
handle_reply('') error = transaction.Interrupt()
if error:
handle_error(error)
else:
handle_reply('')
def main(_mode): def main(_mode):
if common.pid_file_exists(): if common.pid_file_exists():

View File

@ -24,7 +24,8 @@ interface = Gtk.Builder()
interface.add_from_file('/usr/share/pamac/gui/dialogs.glade') interface.add_from_file('/usr/share/pamac/gui/dialogs.glade')
ErrorDialog = interface.get_object('ErrorDialog') ErrorDialog = interface.get_object('ErrorDialog')
WarningDialog = interface.get_object('WarningDialog') WarningDialog = interface.get_object('WarningDialog')
QuestionDialog = interface.get_object('QuestionDialog') #QuestionDialog = interface.get_object('QuestionDialog')
InfoDialog = interface.get_object('InfoDialog')
def get_handle(): def get_handle():
global handle global handle
@ -57,6 +58,7 @@ Prepare = proxy.get_dbus_method('Prepare','org.manjaro.pamac')
To_Remove = proxy.get_dbus_method('To_Remove','org.manjaro.pamac') To_Remove = proxy.get_dbus_method('To_Remove','org.manjaro.pamac')
To_Add = proxy.get_dbus_method('To_Add','org.manjaro.pamac') To_Add = proxy.get_dbus_method('To_Add','org.manjaro.pamac')
Commit = proxy.get_dbus_method('Commit','org.manjaro.pamac') Commit = proxy.get_dbus_method('Commit','org.manjaro.pamac')
Interrupt = proxy.get_dbus_method('Interrupt','org.manjaro.pamac')
Release = proxy.get_dbus_method('Release','org.manjaro.pamac') Release = proxy.get_dbus_method('Release','org.manjaro.pamac')
StopDaemon = proxy.get_dbus_method('StopDaemon','org.manjaro.pamac') StopDaemon = proxy.get_dbus_method('StopDaemon','org.manjaro.pamac')