#! /usr/bin/python # -*-coding:utf-8 -*- from gi.repository import Gtk, GdkPixbuf, Gdk, GObject import pyalpm import math import sys from time import strftime, localtime from os import geteuid import traceback from pamac import transaction, config, callbacks interface = Gtk.Builder() interface.add_from_file('/usr/share/pamac/gui/manager.glade') interface.add_from_file('/usr/share/pamac/gui/dialogs.glade') MainWindow = interface.get_object("MainWindow") packages_list = interface.get_object('packages_list') groups_list = interface.get_object('groups_list') package_desc = interface.get_object('package_desc') toggle = interface.get_object('cellrenderertoggle1') search_entry = interface.get_object('search_entry') tree2 = interface.get_object('treeview2_selection') tree1 = interface.get_object('treeview1_selection') installed_column = interface.get_object('installed_column') name_column = interface.get_object('name_column') ConfDialog = interface.get_object('ConfDialog') transaction_sum = interface.get_object('transaction_sum') top_label = interface.get_object('top_label') bottom_label = interface.get_object('bottom_label') installed_column.set_sort_column_id(1) name_column.set_sort_column_id(0) tmp_list = [] for repo in config.handle.get_syncdbs(): for name, pkgs in repo.grpcache: if not name in tmp_list: tmp_list.append(name) tmp_list = sorted(tmp_list) for name in tmp_list: groups_list.append([name]) pkg_name_list = [] pkg_object_dict = {} pkg_installed_dict = {} list_dict = None current_group = None transaction_type = None transaction_dict = {} def set_list_dict_search(*patterns): global pkg_name_list global pkg_object_dict global pkg_installed_dict pkg_name_list = [] pkg_object_dict = {} pkg_installed_dict = {} for db in config.handle.get_syncdbs(): for pkg_object in db.search(*patterns): if not pkg_object.name in pkg_name_list: pkg_name_list.append(pkg_object.name) pkg_object_dict[pkg_object.name] = pkg_object pkg_installed_dict[pkg_object.name] = False for pkg_object in config.handle.get_localdb().search(*patterns): print(pkg_object) if not pkg_object.name in pkg_name_list: pkg_name_list.append(pkg_object.name) pkg_installed_dict[pkg_object.name] = True pkg_object_dict[pkg_object.name] = pkg_object pkg_name_list = sorted(pkg_name_list) def set_list_dict_group(group): global pkg_name_list global pkg_object_dict global pkg_installed_dict pkg_name_list = [] pkg_object_dict = {} pkg_installed_dict = {} for db in config.handle.get_syncdbs(): grp = db.read_grp(group) if grp is not None: name, pkg_list = grp for pkg_object in pkg_list: if not pkg_object.name in pkg_name_list: pkg_name_list.append(pkg_object.name) pkg_object_dict[pkg_object.name] = pkg_object pkg_installed_dict[pkg_object.name] = False db = config.handle.get_localdb() grp = db.read_grp(group) if grp is not None: name, pkg_list = grp for pkg_object in pkg_list: if not pkg_object.name in pkg_name_list: pkg_name_list.append(pkg_object.name) pkg_installed_dict[pkg_object.name] = True pkg_object_dict[pkg_object.name] = pkg_object pkg_name_list = sorted(pkg_name_list) def refresh_packages_list(): global packages_list packages_list.clear() if not pkg_name_list: packages_list.append([" ", False, False]) else: for name in pkg_name_list: if name in config.holdpkg: packages_list.append([name, pkg_installed_dict[name], False]) break elif transaction_type is "install": if pkg_installed_dict[name] is True: packages_list.append([name, pkg_installed_dict[name], False]) elif name in transaction_dict.keys(): packages_list.append([name, True, True]) else: packages_list.append([name, pkg_installed_dict[name], True]) elif transaction_type is "remove": if pkg_installed_dict[name] is False: packages_list.append([name, pkg_installed_dict[name], False]) elif name in transaction_dict.keys(): packages_list.append([name, False, True]) else: packages_list.append([name, pkg_installed_dict[name], True]) else: packages_list.append([name, pkg_installed_dict[name], True]) print(name,pkg_installed_dict[name]) def set_packages_list(): global list_dict if list_dict == "search": search_strings_list = search_entry.get_text().split() set_list_dict_search(*search_strings_list) if list_dict == "group": set_list_dict_group(current_group) refresh_packages_list() def set_desc(pkg, style): """ Args : pkg_object -- the package to display style -- 'local' or 'sync' """ if style not in ['local', 'sync', 'file']: raise ValueError('Invalid style for package info formatting') package_desc.clear() if style == 'sync': package_desc.append(['Repository:', pkg.db.name]) package_desc.append(['Name:', pkg.name]) package_desc.append(['Version:', pkg.version]) package_desc.append(['Description:', pkg.desc]) package_desc.append(['URL:', pkg.url]) package_desc.append(['Licenses:', ' '.join(pkg.licenses)]) package_desc.append(['Groups:', ' '.join(pkg.groups)]) package_desc.append(['Provides:', ' '.join(pkg.provides)]) package_desc.append(['Depends On:', ' '.join(pkg.depends)]) package_desc.append(['Optional Deps:', '\n'.join(pkg.optdepends)]) if style == 'local': package_desc.append(['Required By:', ' '.join(pkg.compute_requiredby())]) package_desc.append(['Conflicts With:', ' '.join(pkg.conflicts)]) package_desc.append(['Replaces:', ' '.join(pkg.replaces)]) if style == 'sync': package_desc.append(['Download Size:', transaction.format_size(pkg.size)]) if style == 'file': package_desc.append(['Compressed Size:', transaction.format_size(pkg.size)]) package_desc.append(['Installed Size:', transaction.format_size(pkg.isize)]) package_desc.append(['Packager:', pkg.packager]) package_desc.append(['Architecture:', pkg.arch]) package_desc.append(['Build Date:', strftime("%a %d %b %Y %X %Z", localtime(pkg.builddate))]) if style == 'local': package_desc.append(['Install Date:', strftime("%a %d %b %Y %X %Z", localtime(pkg.installdate))]) if pkg.reason == pyalpm.PKG_REASON_EXPLICIT: reason = 'Explicitly installed' elif pkg.reason == pyalpm.PKG_REASON_DEPEND: reason = 'Installed as a dependency for another package' else: reason = 'N/A' package_desc.append(['Install Reason:', reason]) if style != 'sync': package_desc.append(['Install Script:', 'Yes' if pkg.has_scriptlet else 'No']) if style == 'sync': package_desc.append(['MD5 Sum:', pkg.md5sum]) package_desc.append(['SHA256 Sum:', pkg.sha256sum]) package_desc.append(['Signatures:', 'Yes' if pkg.base64_sig else 'No']) if style == 'local': if len(pkg.backup) == 0: package_desc.append(['Backup files:', '']) else: package_desc.append(['Backup files:', '\n'.join(["%s %s" % (md5, file) for (file, md5) in pkg.backup])]) def set_transaction_sum(): transaction_sum.clear() if transaction.to_remove: transaction_sum.append(['To remove:', transaction.to_remove[0]]) i = 1 while i < len(transaction.to_remove): transaction_sum.append([' ', transaction.to_remove[i]]) i += 1 bottom_label.set_markup('') if transaction.to_add: installed = [] for pkg_object in config.handle.get_localdb().pkgcache: installed.append(pkg_object.name) 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: transaction.to_add.remove(name) if transaction.to_add: transaction_sum.append(['To install:', transaction.to_add[0]]) i = 1 while i < len(transaction.to_add): transaction_sum.append([' ', transaction.to_add[i]]) i += 1 if transaction.to_update: transaction_sum.append(['To update:', transaction.to_update[0]]) i = 1 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: '+format_size(totaldlcb)) top_label.set_markup('Transaction Summary') class Handler: def on_MainWindow_delete_event(self, *arg): if __name__ == "__main__": Gtk.main_quit() else: MainWindow.hide() def on_QuitButton_clicked(self, *arg): if __name__ == "__main__": Gtk.main_quit() else: 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() #if response: #transaction.ErrorDialog.hide() #el if not transaction_dict: transaction.ErrorDialog.format_secondary_text("No package is selected") response = transaction.ErrorDialog.run() if response: transaction.ErrorDialog.hide() else: if transaction.t_lock is True: print('Transaction locked') else: if transaction_type is "remove": transaction.init_transaction(cascade = True) for pkgname in transaction_dict.keys(): transaction.Remove(pkgname) 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 transaction.get_to_remove() #transaction.get_to_add() set_transaction_sum() ConfDialog.show_all() if transaction_type is "install": transaction.init_transaction(noconflicts = True) for pkgname in transaction_dict.keys(): transaction.Add(pkgname) 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 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 global transaction_dict transaction_dict.clear() transaction_type = None refresh_packages_list() def on_RefreshButton_clicked(self, *arg): transaction.do_refresh() refresh_packages_list() def on_TransCancelButton_clicked(self, *arg): ConfDialog.hide() transaction.t_lock = False 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() if transaction_type is "install": 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) transaction.finalize() transaction_dict.clear() transaction_type = None set_packages_list() transaction.t_lock = False def on_search_button_clicked(self, widget): global list_dict list_dict = "search" set_packages_list() def on_search_entry_icon_press(self, *arg): global list_dict list_dict = "search" set_packages_list() def on_search_entry_activate(self, widget): global list_dict list_dict = "search" set_packages_list() def on_treeview2_selection_changed(self, widget): liste, line = tree2.get_selected() if line is not None: if packages_list[line][0] in pkg_object_dict.keys(): pkg_object = pkg_object_dict[packages_list[line][0]] if pkg_installed_dict[packages_list[line][0]] is True: style = "local" else: style = "sync" set_desc(pkg_object, style) def on_treeview1_selection_changed(self, widget): global list_dict global current_group liste, line = tree1.get_selected() if line is not None: list_dict = "group" current_group = groups_list[line][0] set_packages_list() def on_installed_column_clicked(self, widget): installed_column.set_sort_column_id(1) def on_name_column_clicked(self, widget): name_column.set_sort_column_id(0) def on_cellrenderertoggle1_toggled(self, widget, line): global transaction_type global transaction_dict global pkg_object_dict if packages_list[line][0] in transaction_dict.keys(): transaction_dict.pop(packages_list[line][0]) if not transaction_dict: transaction_type = None lin = 0 while lin < len(packages_list): if packages_list[lin][0] in config.holdpkg: packages_list[lin][2] = False else: packages_list[lin][2] = True lin += 1 pass else: if packages_list[line][1] is True: transaction_type = "remove" transaction_dict[packages_list[line][0]] = pkg_object_dict[packages_list[line][0]] lin = 0 while lin < len(packages_list): if not packages_list[lin][0] in transaction_dict.keys(): if packages_list[lin][1] is False: packages_list[lin][2] = False lin += 1 if packages_list[line][1] is False: transaction_type = "install" transaction_dict[packages_list[line][0]] = pkg_object_dict[packages_list[line][0]] lin = 0 while lin < len(packages_list): if not packages_list[lin][0] in transaction_dict.keys(): if packages_list[lin][1] is True: packages_list[lin][2] = False lin += 1 packages_list[line][1] = not packages_list[line][1] packages_list[line][2] = True def main(): interface.connect_signals(Handler()) 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()