diff --git a/data/applications/pamac-manager.desktop b/data/applications/pamac-manager.desktop
index 935ed7b..b64bb75 100644
--- a/data/applications/pamac-manager.desktop
+++ b/data/applications/pamac-manager.desktop
@@ -131,10 +131,10 @@ Comment[zh_CN]=添加或删除系统中安装的软件
Comment[zh_HK]=加入或移除系統上安裝的軟件
Comment[zh_TW]=加入或移除系統上安裝的軟體
Icon=system-software-install
-Exec=gksu pamac-manager
+Exec=pamac-manager
Terminal=false
Type=Application
Categories=GNOME;GTK;System;
-NotShowIn=KDE;
+#NotShowIn=KDE;
StartupNotify=true
diff --git a/data/applications/pamac-updater.desktop b/data/applications/pamac-updater.desktop
index 3059aff..2d7b82c 100644
--- a/data/applications/pamac-updater.desktop
+++ b/data/applications/pamac-updater.desktop
@@ -127,10 +127,10 @@ Comment[zh_CN]=更新本系统中安装的软件
Comment[zh_HK]=更新系統中已安裝的軟件
Comment[zh_TW]=更新系統中已安裝的軟體
Icon=system-software-update
-Exec=gksu pamac-updater
+Exec=pamac-updater
Terminal=false
Type=Application
Categories=GNOME;GTK;System;
-NotShowIn=KDE
+#NotShowIn=KDE
StartupNotify=true
diff --git a/data/dbus/org.manjaro.pamac.service b/data/dbus/org.manjaro.pamac.service
index a64390b..ee94d6c 100644
--- a/data/dbus/org.manjaro.pamac.service
+++ b/data/dbus/org.manjaro.pamac.service
@@ -1,5 +1,5 @@
[D-BUS Service]
Name=org.manjaro.pamac
-Exec=/usr/bin/start-pamac-daemon
+Exec=/usr/lib/python3.3/site-packages/pamac/pamac-daemon.py
User=root
SystemdService=pamac.service
diff --git a/data/systemd/pamac.service b/data/systemd/pamac.service
index 321a759..aad42e2 100644
--- a/data/systemd/pamac.service
+++ b/data/systemd/pamac.service
@@ -4,4 +4,4 @@ Description=Pamac
[Service]
Type=dbus
BusName=org.manjaro.pamac
-ExecStart=/usr/bin/start-pamac-daemon
+ExecStart=/usr/lib/python3.3/site-packages/pamac/pamac-daemon.py
diff --git a/pamac-manager b/pamac-manager
index 1a3537f..ed71d1b 100755
--- a/pamac-manager
+++ b/pamac-manager
@@ -1,3 +1,3 @@
#! /bin/sh
-exec /usr/lib/python3.3/site-packages/pamac/manager.py
+/usr/lib/python3.3/site-packages/pamac/manager.py
diff --git a/pamac-updater b/pamac-updater
old mode 100644
new mode 100755
index ca19274..8835e6f
--- a/pamac-updater
+++ b/pamac-updater
@@ -1,3 +1,3 @@
#! /bin/sh
-exec /usr/lib/python3.3/site-packages/pamac/updater.py
+/usr/lib/python3.3/site-packages/pamac/updater.py
diff --git a/pamac/common.py b/pamac/common.py
index 1dc57f7..1e2d1df 100644
--- a/pamac/common.py
+++ b/pamac/common.py
@@ -1,18 +1,6 @@
#! /usr/bin/python
# -*-coding:utf-8-*-
-from gi.repository import Gtk
-
-interface = Gtk.Builder()
-interface.add_from_file('/usr/share/pamac/gui/dialogs.glade')
-
-ErrorDialog = interface.get_object('ErrorDialog')
-WarningDialog = interface.get_object('WarningDialog')
-
-to_remove = []
-to_add = []
-to_update = []
-
def format_size(size):
KiB_size = size / 1024
if KiB_size < 1000:
diff --git a/pamac/manager.py b/pamac/manager.py
index 43eddf1..fb6ebaf 100644
--- a/pamac/manager.py
+++ b/pamac/manager.py
@@ -195,37 +195,66 @@ def set_desc(pkg, style):
def set_transaction_sum():
transaction_sum.clear()
- if common.to_remove:
- transaction_sum.append(['To remove:', common.to_remove[0]])
+ if transaction.to_remove:
+ transaction_sum.append(['To remove:', transaction.to_remove[0]])
i = 1
- while i < len(common.to_remove):
- transaction_sum.append([' ', common.to_remove[i]])
+ while i < len(transaction.to_remove):
+ transaction_sum.append([' ', transaction.to_remove[i]])
i += 1
bottom_label.set_markup('')
- if common.to_add:
+ if transaction.to_add:
installed = []
for pkg_object in config.pacman_conf.initialize_alpm().get_localdb().pkgcache:
installed.append(pkg_object.name)
- common.to_update = sorted(set(installed).intersection(common.to_add))
- to_remove_from_add = sorted(set(common.to_update).intersection(common.to_add))
+ transaction.to_update = sorted(set(installed).intersection(transaction.to_add))
+ to_remove_from_add = sorted(set(transaction.to_update).intersection(transaction.to_add))
for name in to_remove_from_add:
- common.to_add.remove(name)
- if common.to_add:
- transaction_sum.append(['To install:', common.to_add[0]])
+ transaction.to_add.remove(name)
+ if transaction.to_add:
+ transaction_sum.append(['To install:', transaction.to_add[0]])
i = 1
- while i < len(common.to_add):
- transaction_sum.append([' ', common.to_add[i]])
+ while i < len(transaction.to_add):
+ transaction_sum.append([' ', transaction.to_add[i]])
i += 1
- if common.to_update:
- transaction_sum.append(['To update:', common.to_update[0]])
+ if transaction.to_update:
+ transaction_sum.append(['To update:', transaction.to_update[0]])
i = 1
- while i < len(common.to_update):
- transaction_sum.append([' ', common.to_update[i]])
+ while i < len(transaction.to_update):
+ transaction_sum.append([' ', transaction.to_update[i]])
i += 1
bottom_label.set_markup('')
#bottom_label.set_markup('Total Download size: '+common.format_size(totaldlcb))
top_label.set_markup('Transaction Summary')
+def handle_error(error):
+ global transaction_type
+ global transaction_dict
+ if not 'DBus.Error.NoReply' in str(error):
+ transaction.ErrorDialog.format_secondary_text('Commit Error:\n'+str(error))
+ response = transaction.ErrorDialog.run()
+ if response:
+ transaction.ErrorDialog.hide()
+ transaction.t_lock = False
+ transaction.Release()
+ transaction.ProgressWindow.hide()
+ transaction.to_add = []
+ transaction.to_remove = []
+ transaction_dict.clear()
+ transaction_type = None
+ set_packages_list()
+
+def handle_reply(reply):
+ global transaction_type
+ global transaction_dict
+ transaction.t_lock = False
+ transaction.Release()
+ transaction.ProgressWindow.hide()
+ transaction.to_add = []
+ transaction.to_remove = []
+ transaction_dict.clear()
+ transaction_type = None
+ set_packages_list()
+
class Handler:
def on_MainWindow_delete_event(self, *arg):
if __name__ == "__main__":
@@ -240,9 +269,6 @@ class Handler:
MainWindow.hide()
def on_ValidButton_clicked(self, *arg):
- global t
- global transaction_type
- global transaction_dict
#if not geteuid() == 0:
#transaction.ErrorDialog.format_secondary_text("You need to be root to run packages transactions")
#response = transaction.ErrorDialog.run()
@@ -251,7 +277,7 @@ class Handler:
#el
if not transaction_dict:
transaction.ErrorDialog.format_secondary_text("No package is selected")
- response = transaction.ErrorDialog.run()
+ response = transaction.ErrorDialog.run()
if response:
transaction.ErrorDialog.hide()
else:
@@ -286,12 +312,12 @@ class Handler:
transaction.ErrorDialog.hide()
transaction.Release()
transaction.t_lock = False
- transaction.get_to_remove()
- transaction.get_to_add()
- transaction.check_conflicts()
- transaction.Release()
- set_transaction_sum()
- ConfDialog.show_all()
+ transaction.get_to_remove()
+ transaction.get_to_add()
+ transaction.check_conflicts()
+ transaction.Release()
+ set_transaction_sum()
+ ConfDialog.show_all()
def on_EraseButton_clicked(self, *arg):
global transaction_type
@@ -310,31 +336,33 @@ class Handler:
transaction.Release()
def on_TransValidButton_clicked(self, *arg):
- global transaction_type
ConfDialog.hide()
while Gtk.events_pending():
Gtk.main_iteration()
if transaction_type is "remove":
- error = transaction.Commit()
- if error:
- transaction.ErrorDialog.format_secondary_text(error)
- response = transaction.ErrorDialog.run()
- if response:
- transaction.ErrorDialog.hide()
- transaction.Release()
- common.to_add = []
- common.to_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.init_transaction(noconflicts = True, nodeps = True):
- for pkgname in common.to_add:
+ for pkgname in transaction.to_add:
transaction.Add(pkgname)
- for pkgname in common.to_remove:
+ for pkgname in transaction.to_remove:
transaction.Remove(pkgname)
- transaction.finalize()
- transaction_dict.clear()
- transaction_type = None
- set_packages_list()
- transaction.t_lock = False
+ error = transaction.Prepare()
+ if error:
+ transaction.ErrorDialog.format_secondary_text(error)
+ response = transaction.ErrorDialog.run()
+ if response:
+ transaction.ErrorDialog.hide()
+ transaction.Release()
+ transaction.t_lock = False
+ else:
+ transaction.ProgressWindow.show_all()
+ while Gtk.events_pending():
+ Gtk.main_iteration()
+ transaction.Commit(reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000)
def on_search_button_clicked(self, widget):
global list_dict
@@ -420,11 +448,6 @@ def main():
MainWindow.show_all()
if __name__ == "__main__":
- if geteuid() == 0:
- transaction.progress_label.set_text('Refreshing...')
- transaction.progress_bar.pulse()
- transaction.action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/refresh-cache.png')
- transaction.do_refresh()
main()
Gtk.main()
diff --git a/pamac/pamac-daemon.py b/pamac/pamac-daemon.py
index faa0242..81faa5e 100644
--- a/pamac/pamac-daemon.py
+++ b/pamac/pamac-daemon.py
@@ -4,135 +4,137 @@
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
-from gi.repository import GObject, Gtk
+from gi.repository import GObject
import pyalpm
import traceback
from pamac import config, common
-loop = GObject.MainLoop()
-
-t = None
-error = ''
-
-interface = Gtk.Builder()
-interface.add_from_file('/usr/share/pamac/gui/dialogs.glade')
-
-ProgressWindow = interface.get_object('ProgressWindow')
-progress_bar = interface.get_object('progressbar2')
-progress_label = interface.get_object('progresslabel2')
-action_icon = interface.get_object('action_icon')
-
-def cb_event(ID, event, tupel):
- while Gtk.events_pending():
- Gtk.main_iteration()
- if ID is 1:
- progress_label.set_text('Checking dependencies')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-search.png')
- elif ID is 3:
- progress_label.set_text('Checking file conflicts')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-search.png')
- elif ID is 5:
- progress_label.set_text('Resolving dependencies')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/setup.png')
- elif ID is 7:
- progress_label.set_text('Checking inter conflicts')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-search.png')
- elif ID is 9:
- progress_label.set_text('Installing packages')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-add.png')
- elif ID is 11:
- progress_label.set_text('Removing packages')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-delete.png')
- elif ID is 13:
- progress_label.set_text('Upgrading packages')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-update.png')
- elif ID is 15:
- progress_label.set_text('Checking integrity')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-search.png')
- elif ID is 17:
- progress_label.set_text('Checking signatures')
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-search.png')
- print('Checking signatures')
- elif ID is 27:
- print('Downloading a file')
- else :
- progress_label.set_text('')
- progress_bar.set_fraction(0.0)
- progress_bar.set_text('')
- print(ID,event)
-
-def cb_conv(*args):
- print("conversation", args)
-
-_logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
-
-def cb_log(level, line):
- #global t
- if not (level & _logmask):
- return
- if level & pyalpm.LOG_ERROR:
- common.ErrorDialog.format_secondary_text("ERROR: "+line)
- response = common.ErrorDialog.run()
- if response:
- common.ErrorDialog.hide()
- #t.release()
- elif level & pyalpm.LOG_WARNING:
- common.WarningDialog.format_secondary_text("WARNING: "+line)
- response = common.WarningDialog.run()
- if response:
- common.WarningDialog.hide()
- elif level & pyalpm.LOG_DEBUG:
- line = "DEBUG: " + line
- print(line)
- elif level & pyalpm.LOG_FUNCTION:
- line = "FUNC: " + line
- print(line)
-
-total_size = 0
-def totaldlcb(_total_size):
- global total_size
- total_size = _total_size
-
-already_transferred = 0
-def cb_dl(_target, _transferred, total):
- global already_transferred
- while Gtk.events_pending():
- Gtk.main_iteration()
- if total_size > 0:
- fraction = (_transferred+already_transferred)/total_size
- size = 0
- if (t.to_remove or t.to_add):
- for pkg in t.to_remove+t.to_add:
- if pkg.name+'-'+pkg.version in _target:
- size = pkg.size
- if _transferred == size:
- already_transferred += size
- progress_label.set_text('Downloading '+common.format_size(total_size))
- progress_bar.set_text(_target)
- progress_bar.set_fraction(fraction)
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-download.png')
- else:
- progress_label.set_text('Refreshing...')
- progress_bar.set_text(_target)
- progress_bar.pulse()
- action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/refresh-cache.png')
-
-def cb_progress(_target, _percent, n, i):
- while Gtk.events_pending():
- Gtk.main_iteration()
- target = _target+' ('+str(i)+'/'+str(n)+')'
- progress_bar.set_fraction(_percent/100)
- progress_bar.set_text(target)
-
-
class PamacDBusService(dbus.service.Object):
def __init__(self):
bus=dbus.SystemBus()
bus_name = dbus.service.BusName('org.manjaro.pamac', bus)
dbus.service.Object.__init__(self, bus_name, '/org/manjaro/pamac')
+ self.t = None
+ self.error = ''
+ self.warning = ''
+ self.action = ''
+ self.icon = ''
+ self.target = ''
+ self.percent = 0
+ self.total_size = 0
+ self.already_transferred = 0
- def policykit_test(self,sender,connexion,action):
+ @dbus.service.signal('org.manjaro.pamac')
+ def EmitAction(self, action):
+ pass
+
+ @dbus.service.signal('org.manjaro.pamac')
+ def EmitIcon(self, icon):
+ pass
+
+ @dbus.service.signal('org.manjaro.pamac')
+ def EmitTarget(self, target):
+ pass
+
+ @dbus.service.signal('org.manjaro.pamac')
+ def EmitPercent(self, percent):
+ pass
+
+ def cb_event(self, ID, event, tupel):
+ if ID is 1:
+ self.action = 'Checking dependencies'
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
+ elif ID is 3:
+ self.action = 'Checking file conflicts'
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
+ elif ID is 5:
+ self.action = 'Resolving dependencies'
+ self.icon = '/usr/share/pamac/icons/24x24/status/setup.png'
+ elif ID is 7:
+ self.action = 'Checking inter conflicts'
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
+ elif ID is 9:
+ self.action = 'Installing packages'
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
+ elif ID is 11:
+ self.action = 'Removing packages'
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-delete.png'
+ elif ID is 13:
+ self.action = 'Upgrading packages'
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-update.png'
+ elif ID is 15:
+ self.action = 'Checking integrity'
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
+ self.already_transferred = 0
+ elif ID is 17:
+ self.action = 'Checking signatures'
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
+ print('Checking signatures')
+ elif ID is 27:
+ print('Downloading a file')
+ else :
+ self.action = ''
+ self.EmitTarget('')
+ self.EmitPercent(str(0))
+ self.EmitAction(self.action)
+ self.EmitIcon(self.icon)
+ print(ID,event)
+
+ def cb_conv(self, *args):
+ print("conversation", args)
+
+ def cb_log(self, level, line):
+ #global t
+ _logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
+ if not (level & _logmask):
+ return
+ if level & pyalpm.LOG_ERROR:
+ self.error = "ERROR: "+line
+ #t.release()
+ elif level & pyalpm.LOG_WARNING:
+ self.warning = "WARNING: "+line
+ elif level & pyalpm.LOG_DEBUG:
+ line = "DEBUG: " + line
+ print(line)
+ elif level & pyalpm.LOG_FUNCTION:
+ line = "FUNC: " + line
+ print(line)
+
+ def totaldlcb(self, _total_size):
+ self.total_size = _total_size
+
+ def cb_dl(self, _target, _transferred, total):
+ if self.total_size > 0:
+ fraction = (_transferred+self.already_transferred)/self.total_size
+ size = 0
+ if (t.to_remove or t.to_add):
+ for pkg in t.to_remove+t.to_add:
+ if pkg.name+'-'+pkg.version in _target:
+ size = pkg.size
+ if _transferred == size:
+ self.already_transferred += size
+ self.action = 'Downloading '+common.format_size(self.total_size)
+ self.target = _target
+ self.percent = fraction
+ self.icon = '/usr/share/pamac/icons/24x24/status/package-download.png'
+ else:
+ self.action = 'Refreshing...'
+ self.target = _target
+ self.percent = 0
+ self.icon = '/usr/share/pamac/icons/24x24/status/refresh-cache.png'
+ self.EmitAction(self.action)
+ self.EmitIcon(self.icon)
+ self.EmitTarget(self.target)
+ self.EmitPercent(str(self.percent))
+
+ def cb_progress(self, _target, _percent, n, i):
+ self.target = _target+' ('+str(i)+'/'+str(n)+')'
+ self.percent = _percent/100
+ self.EmitTarget(self.target)
+ self.EmitPercent(str(self.percent))
+
+ def policykit_test(self, sender,connexion, action):
bus = dbus.SystemBus()
proxy_dbus = connexion.get_object('org.freedesktop.DBus','/org/freedesktop/DBus/Bus', False)
dbus_info = dbus.Interface(proxy_dbus,'org.freedesktop.DBus')
@@ -145,18 +147,40 @@ class PamacDBusService(dbus.service.Object):
(is_authorized,is_challenge,details) = policykit_authority.CheckAuthorization(Subject, action, {'': ''}, dbus.UInt32(1), '')
return is_authorized
+ @dbus.service.method('org.manjaro.pamac', '', 's')
+ def Refresh(self):
+ global t
+ global error
+ error = ''
+ config.handle.dlcb = self.cb_dl
+ config.handle.totaldlcb = self.totaldlcb
+ config.handle.eventcb = self.cb_event
+ config.handle.questioncb = self.cb_conv
+ config.handle.progresscb = self.cb_progress
+ config.handle.logcb = self.cb_log
+ for db in config.handle.get_syncdbs():
+ try:
+ t = config.handle.init_transaction()
+ db.update(force=True)
+ print('refresh')
+ t.release()
+ except pyalpm.error:
+ error = traceback.format_exc()
+ break
+ return error
+
@dbus.service.method('org.manjaro.pamac', 'a{sb}', 's', sender_keyword='sender', connection_keyword='connexion')
def Init(self, options, sender=None, connexion=None):
global t
global error
if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
error = ''
- config.handle.dlcb = cb_dl
- config.handle.totaldlcb = totaldlcb
- config.handle.eventcb = cb_event
- config.handle.questioncb = cb_conv
- config.handle.progresscb = cb_progress
- config.handle.logcb = cb_log
+ config.handle.dlcb = self.cb_dl
+ config.handle.totaldlcb = self.totaldlcb
+ config.handle.eventcb = self.cb_event
+ config.handle.questioncb = self.cb_conv
+ config.handle.progresscb = self.cb_progress
+ config.handle.logcb = self.cb_log
try:
t = config.handle.init_transaction(**options)
print('Init:',t.flags)
@@ -167,6 +191,18 @@ class PamacDBusService(dbus.service.Object):
else :
return 'You are not authorized'
+ @dbus.service.method('org.manjaro.pamac', '', 's')
+ def Sysupgrade(self):
+ global t
+ global error
+ error = ''
+ try:
+ t.sysupgrade(downgrade=False)
+ except pyalpm.error:
+ error = traceback.format_exc()
+ finally:
+ return error
+
@dbus.service.method('org.manjaro.pamac', 's', 's')
def Remove(self, pkgname):
global t
@@ -227,18 +263,20 @@ class PamacDBusService(dbus.service.Object):
liste.append(pkg.name)
return liste
- @dbus.service.method('org.manjaro.pamac', '', 's',sender_keyword='sender', connection_keyword='connexion')
- def Commit(self, sender=None, connexion=None):
+ @dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion')#, async_callbacks=('success', 'nosuccess'))
+ def Commit(self, sender=None, connexion=None):#success, nosuccess, sender=None, connexion=None):
global t
global error
+ error = ''
if self.policykit_test(sender,connexion,'org.manjaro.pamac.commit'):
- ProgressWindow.show_all()
- while Gtk.events_pending():
- Gtk.main_iteration()
try:
t.commit()
+ #success('')
except pyalpm.error:
- error = traceback.format_exc()
+ error = traceback.format_exc()
+ #nosuccess(error)
+ except dbus.exceptions.DBusException:
+ pass
finally:
return error
else :
@@ -250,7 +288,6 @@ class PamacDBusService(dbus.service.Object):
global error
if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
error = ''
- ProgressWindow.hide()
try:
t.release()
except pyalpm.error:
@@ -262,9 +299,9 @@ class PamacDBusService(dbus.service.Object):
@dbus.service.method('org.manjaro.pamac')
def StopDaemon(self):
- loop.quit()
-
+ mainloop.quit()
DBusGMainLoop(set_as_default=True)
myservice = PamacDBusService()
-loop.run()
+mainloop = GObject.MainLoop()
+mainloop.run()
diff --git a/pamac/transaction.py b/pamac/transaction.py
index a4247b4..edf2334 100644
--- a/pamac/transaction.py
+++ b/pamac/transaction.py
@@ -1,20 +1,38 @@
#! /usr/bin/python
# -*-coding:utf-8-*-
-from gi.repository import Gtk
+from gi.repository import Gtk, GObject
import pyalpm
import traceback
import dbus
+from dbus.mainloop.glib import DBusGMainLoop
-from pamac import config, common
+from pamac import config
+
+interface = Gtk.Builder()
+interface.add_from_file('/usr/share/pamac/gui/dialogs.glade')
+
+ErrorDialog = interface.get_object('ErrorDialog')
+WarningDialog = interface.get_object('WarningDialog')
+ProgressWindow = interface.get_object('ProgressWindow')
+progress_bar = interface.get_object('progressbar2')
+progress_label = interface.get_object('progresslabel2')
+action_icon = interface.get_object('action_icon')
t_lock = False
do_syncfirst = False
list_first = []
+to_remove = []
+to_add = []
+to_update = []
-proxy = dbus.SystemBus().get_object('org.manjaro.pamac','/org/manjaro/pamac')
+DBusGMainLoop(set_as_default=True)
+bus = dbus.SystemBus()
+proxy = bus.get_object('org.manjaro.pamac','/org/manjaro/pamac', introspect=False)
+Refresh = proxy.get_dbus_method('Refresh','org.manjaro.pamac')
Init = proxy.get_dbus_method('Init','org.manjaro.pamac')
+Sysupgrade = proxy.get_dbus_method('Sysupgrade','org.manjaro.pamac')
Remove = proxy.get_dbus_method('Remove','org.manjaro.pamac')
Add = proxy.get_dbus_method('Add','org.manjaro.pamac')
Prepare = proxy.get_dbus_method('Prepare','org.manjaro.pamac')
@@ -23,6 +41,23 @@ To_Add = proxy.get_dbus_method('To_Add','org.manjaro.pamac')
Commit = proxy.get_dbus_method('Commit','org.manjaro.pamac')
Release = proxy.get_dbus_method('Release','org.manjaro.pamac')
+def action_signal_handler(action):
+ progress_label.set_text(action)
+
+def icon_signal_handler(icon):
+ action_icon.set_from_file(icon)
+
+def target_signal_handler(target):
+ progress_bar.set_text(target)
+
+def percent_signal_handler(percent):
+ 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")
+bus.add_signal_receiver(target_signal_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTarget")
+bus.add_signal_receiver(percent_signal_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitPercent")
+
def init_transaction(**options):
"Transaction initialization"
global t_lock
@@ -31,16 +66,18 @@ def init_transaction(**options):
t_lock = True
return True
else:
- common.ErrorDialog.format_secondary_text(error)
- response = common.ErrorDialog.run()
+ ErrorDialog.format_secondary_text(error)
+ response = ErrorDialog.run()
if response:
- common.ErrorDialog.hide()
+ ErrorDialog.hide()
return False
def check_conflicts():
+ global to_add
+ global to_remove
to_check = []
warning = ''
- for pkgname in common.to_add:
+ for pkgname in to_add:
for repo in config.pacman_conf.initialize_alpm().get_syncdbs():
pkg = repo.get_pkg(pkgname)
if pkg:
@@ -51,8 +88,8 @@ def check_conflicts():
for name in target.replaces:
pkg = config.pacman_conf.initialize_alpm().get_localdb().get_pkg(name)
if pkg:
- if not pkg.name in common.to_remove:
- common.to_remove.append(pkg.name)
+ if not pkg.name in to_remove:
+ to_remove.append(pkg.name)
if warning:
warning = warning+'\n'
warning = warning+pkg.name+' will be replaced by '+target.name
@@ -60,66 +97,81 @@ def check_conflicts():
for name in target.conflicts:
pkg = config.pacman_conf.initialize_alpm().get_localdb().get_pkg(name)
if pkg:
- if not pkg.name in common.to_remove:
- common.to_remove.append(pkg.name)
+ if not pkg.name in to_remove:
+ to_remove.append(pkg.name)
for installed_pkg in config.pacman_conf.initialize_alpm().get_localdb().pkgcache:
if installed_pkg.conflicts:
for name in installed_pkg.conflicts:
if name == target.name:
- if not name in common.to_remove:
- common.to_remove.append(installed_pkg.name)
+ if not name in to_remove:
+ to_remove.append(installed_pkg.name)
if warning:
- common.WarningDialog.format_secondary_text(warning)
- response = common.WarningDialog.run()
+ WarningDialog.format_secondary_text(warning)
+ response = WarningDialog.run()
if response:
- common.WarningDialog.hide()
+ WarningDialog.hide()
def get_to_remove():
- common.to_remove = To_Remove()
+ global to_remove
+ to_remove = To_Remove()
def get_to_add():
- common.to_add = To_Add()
+ global to_add
+ to_add = To_Add()
def finalize():
global t_lock
- while Gtk.events_pending():
- Gtk.main_iteration()
error = Prepare()
if error:
- common.ErrorDialog.format_secondary_text(error)
- response = common.ErrorDialog.run()
+ ErrorDialog.format_secondary_text(error)
+ response = ErrorDialog.run()
if response:
- common.ErrorDialog.hide()
- error = Commit()
- if error:
- common.ErrorDialog.format_secondary_text(error)
- response = common.ErrorDialog.run()
+ ErrorDialog.hide()
+ Release()
+ t_lock = False
+ else:
+ ProgressWindow.show_all()
+ while Gtk.events_pending():
+ Gtk.main_iteration()
+ Commit(reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000)
+
+def handle_error(error):
+ global t_lock
+ global to_add
+ global to_remove
+ if not 'DBus.Error.NoReply' in str(error):
+ ErrorDialog.format_secondary_text('Commit Error:\n'+str(error))
+ response = ErrorDialog.run()
if response:
- common.ErrorDialog.hide()
+ ErrorDialog.hide()
t_lock = False
Release()
- common.to_add = []
- common.to_remove = []
+ ProgressWindow.hide()
+ to_add = []
+ to_remove = []
+
+def handle_reply(reply):
+ global t_lock
+ global to_add
+ global to_remove
+ print('reply',reply)
+ t_lock = False
+ Release()
+ ProgressWindow.hide()
+ to_add = []
+ to_remove = []
def do_refresh():
"""Sync databases like pacman -Sy"""
global t
global t_lock
- for db in config.pacman_conf.initialize_alpm().get_syncdbs():
- if t_lock is False:
- t = init_transaction()
- try:
- db.update(force=False)
- t.release()
- t_lock = False
- except pyalpm.error:
- common.ErrorDialog.format_secondary_text(traceback.format_exc())
- response = common.ErrorDialog.run()
- if response:
- common.ErrorDialog.hide()
- t_lock = False
- break
- t_lock = False
+ if t_lock is False:
+ progress_label.set_text('Refreshing...')
+ progress_bar.pulse()
+ action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/refresh-cache.png')
+ ProgressWindow.show_all()
+ t_lock = True
+ Refresh(reply_handler = handle_reply, error_handler = handle_error, timeout = 2000*1000)
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 d00423a..95048b0 100644
--- a/pamac/updater.py
+++ b/pamac/updater.py
@@ -6,7 +6,7 @@ from gi.repository import Gtk
import pyalpm
from os import geteuid
-from pamac import config, transaction
+from pamac import config, common, transaction
interface = Gtk.Builder()
interface.add_from_file('/usr/share/pamac/gui/updater.glade')
@@ -34,90 +34,81 @@ def have_updates():
pkgname = pkg.name
newversion = transaction.get_new_version_available(pkgname)
pkgname = pkg.name+" "+newversion
- update_listore.append([pkgname, transaction.format_size(pkg.size)])
+ update_listore.append([pkgname, common.format_size(pkg.size)])
update_label.set_markup("Available updates")
return True
def set_transaction_add():
transaction_add.clear()
if transaction.to_remove:
- transaction_add.append(['To remove:', transaction.to_remove[0].name])
+ transaction_add.append(['To remove:', transaction.to_remove[0]])
i = 1
while i < len(transaction.to_remove):
- transaction_add.append([' ', transaction.to_remove[i].name])
+ transaction_add.append([' ', transaction.to_remove[i]])
i += 1
bottom_label.set_markup('')
if transaction.to_add:
installed_name = []
for pkg_object in config.handle.get_localdb().pkgcache:
installed_name.append(pkg_object.name)
- to_add_name = []
- for pkg_object in transaction.to_add:
- to_add_name.append(pkg_object.name)
- transaction.to_update = sorted(set(installed_name).intersection(to_add_name))
- to_remove_from_add_name = sorted(set(transaction.to_update).intersection(to_add_name))
+ transaction.to_update = sorted(set(installed_name).intersection(transaction.to_add))
+ to_remove_from_add_name = sorted(set(transaction.to_update).intersection(transaction.to_add))
for name in to_remove_from_add_name:
- to_add_name.remove(name)
- if to_add_name:
- transaction_add.append(['To install:', to_add_name[0]])
+ transaction.to_add.remove(name)
+ if transaction.to_add:
+ transaction_add.append(['To install:', transaction.to_add[0]])
i = 1
- while i < len(to_add_name):
- transaction_add.append([' ', to_add_name[i]])
+ while i < len(transaction.to_add):
+ transaction_add.append([' ', transaction.to_add[i]])
i += 1
bottom_label.set_markup('')
#bottom_label.set_markup('Total Download size: '+format_size(totaldlcb))
- top_label.set_markup('Additionnal Transaction(s)')
+ 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:
- transaction.t = transaction.init_transaction(recurse = True)
- for pkg in transaction.list_first:
- transaction.t.add_pkg(pkg)
- transaction.to_remove = transaction.t.to_remove
- transaction.to_add = transaction.t.to_add
- set_transaction_add()
- if len(transaction_add) != 0:
- ConfDialog.show_all()
- else:
- transaction.t_finalize(transaction.t)
- transaction.do_syncfirst = False
- transaction.list_first = []
- else:
- try:
- transaction.t = transaction.init_transaction()
- transaction.t.sysupgrade(downgrade=False)
- except pyalpm.error:
- ErrorDialog.format_secondary_text(traceback.format_exc())
- response = ErrorDialog.run()
- if response:
- ErrorDialog.hide()
- transaction.t.release()
- transaction.t_lock = False
- transaction.check_conflicts()
- transaction.to_add = transaction.t.to_add
- transaction.to_remove = []
- for pkg in transaction.conflict_to_remove.values():
- transaction.to_remove.append(pkg)
- if len(transaction.to_add) + len(transaction.to_remove) == 0:
- transaction.t.release()
- transaction.t_lock = False
- print("Nothing to update")
- else:
- transaction.t.release()
- transaction.t = transaction.init_transaction(noconflicts = True, nodeps = True)
- for pkg in transaction.to_add:
+ if transaction.init_transaction(recurse = True):
+ for pkg in transaction.list_first:
transaction.t.add_pkg(pkg)
- for pkg in transaction.conflict_to_remove.values():
- transaction.t.remove_pkg(pkg)
transaction.to_remove = transaction.t.to_remove
transaction.to_add = transaction.t.to_add
set_transaction_add()
if len(transaction_add) != 0:
ConfDialog.show_all()
else:
- transaction.t_finalize(transaction.t)
+ transaction.t_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:
+ transaction.t_finalize()
class Handler:
def on_UpdateWindow_delete_event(self, *arg):
@@ -155,12 +146,6 @@ def main():
UpdateWindow.show_all()
if __name__ == "__main__":
- if geteuid() == 0:
- transaction.progress_label.set_text('Refreshing...')
- transaction.progress_bar.pulse()
- transaction.action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/refresh-cache.png')
- transaction.ProgressWindow.show_all()
- transaction.do_refresh()
- transaction.ProgressWindow.hide()
+ transaction.do_refresh()
main()
Gtk.main()
diff --git a/setup.py b/setup.py
index 9fdf13f..4e39b36 100644
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
from distutils.core import setup
setup(name='Pamac',
- version='0.2',
+ version='0.3',
description='A gtk3 frontend for pyalpm',
license='GPL',
author='Guillaume Benoit',
diff --git a/start-pamac-daemon b/start-pamac-daemon
index 79a7d2f..375ea78 100755
--- a/start-pamac-daemon
+++ b/start-pamac-daemon
@@ -1,3 +1,3 @@
-#! /bin/bash
+#! /bin/sh
-DISPLAY=:0.0 /usr/lib/python3.3/site-packages/pamac/pamac-daemon.py
+/usr/lib/python3.3/site-packages/pamac/pamac-daemon.py &
diff --git a/tray b/tray
old mode 100644
new mode 100755
index 10ce7ba..260c2f2
--- a/tray
+++ b/tray
@@ -1,3 +1,3 @@
#! /bin/sh
-exec /usr/lib/python3.3/site-packages/pamac/tray.py
+/usr/lib/python3.3/site-packages/pamac/tray.py