#! /usr/bin/python # -*-coding:utf-8 -*- from gi.repository import Gtk import pyalpm from os import geteuid from pamac import config, common, transaction interface = Gtk.Builder() interface.add_from_file('/usr/share/pamac/gui/updater.glade') interface.add_from_file('/usr/share/pamac/gui/dialogs.glade') UpdateWindow = interface.get_object("UpdateWindow") ConfDialog = interface.get_object('ConfDialog') transaction_add = interface.get_object('transaction_add') top_label = interface.get_object('top_label') bottom_label = interface.get_object('bottom_label') update_listore = interface.get_object('update_list') update_label = interface.get_object('update_label') def have_updates(): available_updates = transaction.get_updates() update_listore.clear() update_label.set_justify(Gtk.Justification.CENTER) if not available_updates: update_listore.append(["", ""]) update_label.set_markup("No update available") return False else: for pkg in available_updates: pkgname = pkg.name newversion = transaction.get_new_version_available(pkgname) pkgname = pkg.name+" "+newversion 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]]) i = 1 while i < len(transaction.to_remove): 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) 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: transaction.to_add.remove(name) if transaction.to_add: transaction_add.append(['To install:', transaction.to_add[0]]) i = 1 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)') 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.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.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): if __name__ == "__main__": Gtk.main_quit() else: UpdateWindow.hide() def on_QuitButton_clicked(self, *arg): if __name__ == "__main__": Gtk.main_quit() else: UpdateWindow.hide() def on_ApplyButton_clicked(self, *arg): do_sysupgrade() have_updates() def on_RefreshButton_clicked(self, *arg): transaction.do_refresh() have_updates() def on_TransCancelButton_clicked(self, *arg): ConfDialog.hide() transaction.t_lock = False transaction.t.release() def on_TransValidButton_clicked(self, *arg): ConfDialog.hide() transaction.t_finalize(t) def main(): have_updates() interface.connect_signals(Handler()) UpdateWindow.show_all() if __name__ == "__main__": transaction.do_refresh() main() Gtk.main()