From 6a773a48d6289a117c2267f39168406ff8e6e472 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Tue, 26 Apr 2016 15:46:49 +0200 Subject: [PATCH 001/133] Sanitize pane size defaults Adds minimum sizes for GtkPaned in Groups and History view --- src/yumex.ui | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index df44ff1..11f2fe1 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -1200,6 +1200,8 @@ start Yum Extender True + 200 + 250 True True in @@ -1209,11 +1211,13 @@ start Yum Extender False - True + False + 350 + 250 True True in @@ -1223,7 +1227,7 @@ start Yum Extender True - True + False @@ -1252,6 +1256,8 @@ start Yum Extender 250 + 200 + 250 True True in @@ -1261,11 +1267,13 @@ start Yum Extender False - True + False + 350 + 250 True True in @@ -1275,7 +1283,7 @@ start Yum Extender True - True + False From 8ab51cd96767ea183f2f3e494cf194982bee63e5 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Tue, 26 Apr 2016 16:37:15 +0200 Subject: [PATCH 002/133] Use halign instead of xalign --- src/yumex.ui | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 11f2fe1..7258858 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -97,8 +97,8 @@ False Use the toolbar in the header of the window standard when using GNOME + start Show toolbar in window headerbar - 0 0 @@ -160,8 +160,8 @@ standard when using GNOME False Select all available updates when Yum Extender is started + start Select updates at startup - 0 0 @@ -214,7 +214,6 @@ Yum Extender is started start True Start update checker at user login - 0 0 @@ -250,7 +249,6 @@ Yum Extender is started start True Update check interval (minutes) - 0 0 @@ -332,8 +330,8 @@ active when Yum Extender starts True False + start Cleanup Old Installonly packages - 0 0 @@ -356,10 +354,10 @@ active when Yum Extender starts True False + start 25 25 Number of installonly packages to keep - 0 0 @@ -555,6 +553,7 @@ active when Yum Extender starts True False + start 10 10 10 @@ -562,7 +561,6 @@ active when Yum Extender starts 6 6 Repositories used in current session - 0 @@ -614,7 +612,7 @@ start Yum Extender True True False - 0 + start True @@ -702,10 +700,10 @@ start Yum Extender True False + start 6 <b>Package Versions</b> True - 0 0 @@ -717,10 +715,10 @@ start Yum Extender True False + start 6 <b>Archs</b> True - 0 0 @@ -769,8 +767,8 @@ start Yum Extender True False Show only the latest package versions + start 12 - 0 True @@ -1082,8 +1080,8 @@ start Yum Extender True False + start Updates - 0 @@ -1099,8 +1097,8 @@ start Yum Extender True False + start Installed - 0 @@ -1116,8 +1114,8 @@ start Yum Extender True False + start Available - 0 @@ -1133,8 +1131,8 @@ start Yum Extender True False + start All - 0 @@ -1665,7 +1663,6 @@ start Yum Extender True False Package names starting with search key - 0 True True @@ -1681,7 +1678,6 @@ start Yum Extender True False Package names containing search key - 0 True sch_opt_prefix @@ -1697,7 +1693,6 @@ start Yum Extender True False Specified package fields containing search keys. - 0 True sch_opt_prefix @@ -1725,7 +1720,6 @@ start Yum Extender True False Package name - 0 True @@ -1740,7 +1734,6 @@ start Yum Extender True False Package summary - 0 True @@ -1755,7 +1748,6 @@ start Yum Extender True False Package description - 0 True From 245c9fe9518e2e04f099768146df29e9a3d16e1f Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Tue, 26 Apr 2016 16:40:07 +0200 Subject: [PATCH 003/133] Unify preferences dialog child properties --- src/yumex.ui | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 7258858..ec62cb3 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -85,7 +85,6 @@ True False - start 6 10 6 @@ -125,7 +124,6 @@ standard when using GNOME False The interval in hour, when the DNF cache will be expired and updated (0 = disabled) start - start Cache expire interval (hours) end @@ -190,7 +188,6 @@ Yum Extender is started True False - start 6 6 @@ -211,7 +208,6 @@ Yum Extender is started False Autostart the Yum Extender update checker at user login start - start True Start update checker at user login @@ -246,7 +242,6 @@ Yum Extender is started False How often the update checker will run start - start True Update check interval (minutes) @@ -267,7 +262,6 @@ Yum Extender is started True False - start 6 6 @@ -278,7 +272,6 @@ Yum Extender starts. Will show only latest version of available packages start - start True Show newest only @@ -305,7 +298,6 @@ packages Erase unused requirement option is active when Yum Extender starts start - start True Erase Unused Requirements @@ -402,7 +394,6 @@ active when Yum Extender starts True False start - start True Color for installed packages @@ -417,7 +408,6 @@ active when Yum Extender starts True False start - start True Color for available updates @@ -432,7 +422,6 @@ active when Yum Extender starts True False start - start True Color for available packages @@ -447,7 +436,6 @@ active when Yum Extender starts True False start - start True Color for obsoleted packages @@ -462,7 +450,6 @@ active when Yum Extender starts True False start - start True Color for available downgrades From df11977d73f43cbd58742e83ad7e3f3e20022809 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Tue, 26 Apr 2016 16:42:33 +0200 Subject: [PATCH 004/133] Remove some Gtk+ 3.x warnings Removes some warnings caused by API changes. Require 3.18 since GtkTextView:top-margin and :bottom-margin require it. --- src/yumex.ui | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index ec62cb3..67117fc 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -1,7 +1,7 @@ - + 10 900 @@ -77,10 +77,7 @@ True False - 12 - 12 - 6 - 7 + 6 True @@ -875,7 +872,6 @@ start Yum Extender True True True - immediate False @@ -895,11 +891,11 @@ start Yum Extender True False - 6 False True + 8 2 From 21921c2674d16885c5a972c762d8ff0da1285640 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Tue, 26 Apr 2016 17:04:39 +0200 Subject: [PATCH 005/133] update Makefile --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index e49d223..2ef703e 100644 --- a/Makefile +++ b/Makefile @@ -73,6 +73,9 @@ release-publish: @$(MAKE) rpm release-cleanup: + @git checkout develop + @git merge --no-ff release-${VERSION} -m "merge ${APPNAME}-${VERSION} release" + @git push origin @git branch -D release-${VERSION} test-cleanup: From 84e411b1aaea6b3178a2f540a6c7d91d80758077 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Wed, 27 Apr 2016 19:24:10 +0200 Subject: [PATCH 006/133] Delete old_init.py --- src/yumex/old_init.py | 1375 ----------------------------------------- 1 file changed, 1375 deletions(-) delete mode 100644 src/yumex/old_init.py diff --git a/src/yumex/old_init.py b/src/yumex/old_init.py deleted file mode 100644 index 5007431..0000000 --- a/src/yumex/old_init.py +++ /dev/null @@ -1,1375 +0,0 @@ -# -*- coding: iso-8859-1 -*- -# Yum Exteder (yumex) - A graphic package management tool -# Copyright (C) 2013 Tim Lauridsen < timlaufedoraprojectorg > -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version..Win -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to -# the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -from __future__ import absolute_import - -from gi.repository import Gtk -from gi.repository import Gdk -from gi.repository import Gio -from yumex.misc import doGtkEvents, _, CONFIG, ExceptionHandler,\ - QueueEmptyError, TransactionBuildError, \ - TransactionSolveError, dbus_statusicon, dbus_dnfsystem,\ - get_style_color, color_to_hex - -import argparse -import logging -import datetime -import subprocess -import sys -import os.path -import re -import yumex.const as const -import yumex.status -import yumex.dnf_backend -import yumex.gui.dialogs as dialogs -import yumex.gui.views as views -import yumex.gui.widgets as widgets - -logger = logging.getLogger('yumex') - - -class BaseWindow(Gtk.ApplicationWindow): - """ Common Yumex Base window """ - - def __init__(self, app, status): - Gtk.ApplicationWindow.__init__( - self, title='Yum Extender - Powered by DNF', application=app) - self.set_position(Gtk.WindowPosition.CENTER) - self.app = app - self.status = status - icon = Gtk.IconTheme.get_default().load_icon('yumex-dnf', 128, 0) - self.set_icon(icon) - self.connect('delete_event', self.on_delete_event) - - self._root_backend = None - self._root_locked = False - self.is_working = False - self.pid = app.pid - - # setup GtkBuilder - self.ui = Gtk.Builder() - self.ui.set_translation_domain('yumex-dnf') - try: - self.ui.add_from_file(const.DATA_DIR + '/yumex.ui') - except: - raise - dialogs.show_information( - self, 'GtkBuilder ui file not found : ' + - const.DATA_DIR + '/yumex.ui') - sys.exit() - - # transaction result dialog - self.transaction_result = dialogs.TransactionResult(self) - - def set_working(self, state, insensitive=False): - """Set the working state.""" - self.is_working = state - - def _check_cache_expired(self, cache_type): - time_fmt = '%Y-%m-%d %H:%M' - now = datetime.datetime.now() - refresh_period = datetime.timedelta(hours=CONFIG.conf.refresh_interval) - if cache_type == 'session': - last_refresh = datetime.datetime.strptime( - CONFIG.conf.session_refresh, time_fmt) - period = now - last_refresh - if period > refresh_period: - return True - else: - return False - elif cache_type == 'system': - last_refresh = datetime.datetime.strptime( - CONFIG.conf.system_refresh, time_fmt) - period = now - last_refresh - if period > refresh_period: - return True - else: - return False - - def _set_cache_refreshed(self, cache_type): - time_fmt = '%Y-%m-%d %H:%M' - now = datetime.datetime.now() - now_str = now.strftime(time_fmt) - if cache_type == 'session': - CONFIG.conf.session_refresh = now_str - CONFIG.write() - elif cache_type == 'system': - CONFIG.conf.system_refresh = now_str - CONFIG.write() - - @property - def backend(self): - return self.get_root_backend() - - @ExceptionHandler - def get_root_backend(self): - """Get the current root backend. - - if it is not setup yet, the create it - if it is not locked, then lock it - """ - if self._root_backend is None: - self._root_backend = yumex.dnf_backend.DnfRootBackend(self) - if self._root_locked is False: - logger.debug('Lock the DNF root daemon') - locked, msg = self._root_backend.setup() - if locked: - self._root_locked = True - if self._check_cache_expired('system'): - logger.debug('Refresh system cache') - self.set_working(True, True) - self.infobar.info(_('Refreshing Repository Metadata')) - rc = self._root_backend.ExpireCache() - self.set_working(False) - if rc: - self._set_cache_refreshed('system') - else: - dialogs.show_information( - self, _('Could not refresh the DNF cache (root)')) - else: - logger.critical("can't get root backend lock") - if msg == 'not-authorized': # user canceled the polkit dialog - errmsg = _( - 'DNF root backend was not authorized.\n' - 'Yum Extender will exit') - # DNF is locked by another process - elif msg == 'locked-by-other': - errmsg = _( - 'DNF is locked by another process.\n\n' - 'Yum Extender will exit') - dialogs.show_information(self, errmsg) - # close down and exit yum extender - self.status.SetWorking(False) # reset working state - self.status.SetYumexIsRunning(self.pid, False) - sys.exit(1) - return self._root_backend - - @ExceptionHandler - def release_root_backend(self, quit=False): - """Release the current root backend, if it is setup and locked.""" - if self._root_backend is None: - return - if self._root_locked is True: - logger.debug('Unlock the DNF root daemon') - self._root_backend.Unlock() - self._root_locked = False - if quit: - logger.debug('Exit the DNF root daemon') - self._root_backend.Exit() - - def exception_handler(self, e): - """Called if exception occours in methods with the - @ExceptionHandler decorator. - """ - close = True - msg = str(e) - logger.error('BASE EXCEPTION : %s ' % msg) - err, errmsg = self._parse_error(msg) - logger.debug('BASE err: [%s] - msg: %s' % (err, errmsg)) - if err == 'LockedError': - errmsg = 'DNF is locked by another process.\n' - '\nYum Extender will exit' - close = False - elif err == 'NoReply': - errmsg = 'DNF D-Bus backend is not responding.\n' - '\nYum Extender will exit' - close = False - if errmsg == '': - errmsg = msg - dialogs.show_information(self, errmsg) - # try to exit the backends, ignore errors - if close: - try: - self.release_root_backend(quit=True) - except: - pass - self.status.SetWorking(False) # reset working state - self.status.SetYumexIsRunning(self.pid, False) - sys.exit(1) - - def _parse_error(self, value): - """Parse values from a DBus releated exception.""" - res = const.DBUS_ERR_RE.match(str(value)) - if res: - err = res.groups()[0] - err = err.split('.')[-1] - msg = res.groups()[1] - return err, msg - return '', '' - - -class YumexInstallWindow(BaseWindow): - """Simple ui windows class for doing actions from the command line.""" - def __init__(self, app, status): - BaseWindow.__init__(self, app, status) - self.set_default_size(600, 80) - - # Setup the main window ui - vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - self.add(vbox) - # infobar revealer - infobar = self.ui.get_object('infobar') - vbox.pack_start(infobar, False, False, 0) - self.add(vbox) - vbox.show() - self.infobar = yumex.gui.widgets.InfoProgressBar(self.ui) - self.infobar.show_all() - info_spinner = self.ui.get_object('info_spinner') - info_spinner.set_from_file(const.PIX_DIR + '/spinner-small.gif') - self.system_backend_refreshed = True # dont refresh metadata - - def on_delete_event(self, *args): - if CONFIG.conf.hide_on_close or self.is_working: - self.hide() - return True - else: - self.app.on_quit() - - @ExceptionHandler - def process_actions(self, action, package, always_yes): - """Process the pending actions from the command line. - - :param action: action to perform (install/remove) - :param package: package to work on - :param always_yes: ask the user or default to yes/ok to all questions - """ - self.status.SetWorking(True) - if action == 'install': - self.infobar.info(_('Installing package: %s') % package) - self.infobar.info_sub(package) - txmbrs = self.backend.Install(package) - logger.debug('txmbrs: %s' % str(txmbrs)) - elif action == 'remove': - self.infobar.info(_('Removing package: %s') % package) - self.infobar.info_sub(package) - txmbrs = self.backend.Remove(package) - logger.debug('txmbrs: %s' % str(txmbrs)) - elif action == 'update': - self.infobar.info(_('Updating all available updates')) - txmbrs = self.backend.Update('*') - self.infobar.info(_('Searching for dependencies')) - rc, result = self.backend.BuildTransaction() - self.infobar.info(_('Dependencies resolved')) - if rc: - self.transaction_result.populate(result, '') - if not always_yes: - ok = self.transaction_result.run() - else: - ok = True - if ok: # Ok pressed - self.infobar.info(_('Applying changes to the system')) - self.backend.RunTransaction() - self.release_root_backend() - self.hide() - if not always_yes: - dialogs.show_information( - self, - _('Changes was successfully applied to the system')) - else: - dialogs.show_information( - self, _('Error(s) in search for dependencies'), - '\n'.join(result)) - self.release_root_backend(quit=True) - self.status.SetWorking(False) - self.app.quit() - - -class YumexWindow(BaseWindow): - """Main application window class.""" - def __init__(self, app, status): - BaseWindow.__init__(self, app, status) - self.set_name('YumexMainWindow') - width = CONFIG.conf.win_width - height = CONFIG.conf.win_height - self.set_default_size(width, height) - if CONFIG.conf.win_maximized: - self.maximize() - self.connect('configure-event', self.on_window_changed) - self.connect('window-state-event', self.on_window_state) - - # load custom styling from current theme - self.load_custom_styling() - - # init vars - self.cur_height = 0 # current window height - self.cur_width = 0 # current windows width - self.cur_maximized = False - self.last_search = None - self.current_filter = None - self._root_backend = None - self._root_locked = False - self.search_type = 'prefix' - self.last_search_pkgs = [] - self.current_filter_search = None - if CONFIG.conf.archs: - self.active_archs = CONFIG.conf.archs - else: - self.active_archs = list(const.PLATFORM_ARCH) - self._grps = None # Group and Category cache - self.active_page = None # Active content page - self.search_fields = CONFIG.conf.search_fields - self.add_accel_group(self.ui.get_object('main_accelgroup')) - - vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - # setup the main gui - if CONFIG.conf.headerbar: - self.hb = widgets.YumexHeaderBar(self.ui) - self.set_titlebar(self.hb) - self.hb.show() - else: - toolbar = widgets.YumexToolBar(self.ui) - toolbar.show() - vbox.pack_start(toolbar, False, False, 0) - - # Setup the main window ui - self.add(vbox) - # infobar revealer - infobar = self.ui.get_object('infobar') - vbox.pack_start(infobar, False, False, 0) - # content Stack - self.stack = Gtk.Stack() - self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) - self.stack.set_transition_duration(500) - for name in ['packages', 'groups', 'history', 'queue']: - page = self.ui.get_object('page_%s' % name) - self.stack.add_named(page, name) - vbox.pack_start(self.stack, True, True, 0) - self.stack.show() - vbox.show() - - # Setup package filters - for name in ['updates', 'installed', 'available', 'all']: - rb = self.ui.get_object('filter_' + name) - rb.connect('toggled', self.on_pkg_filter, name) - - # set default value for clean_instonly - CONFIG.session.clean_instonly = CONFIG.conf.clean_instonly - - # Connect menu radio buttons to handler - for name in ['newest_only', 'clean_unused', 'clean_instonly']: - rb = self.ui.get_object('option_' + name) - rb.set_active(getattr(CONFIG.session, name)) - rb.connect('toggled', self.on_options, name) - - # build the search_conf widget - # Connect menu radio buttons to handler - # setup search type option - for key in ['prefix', 'key', 'fields']: - wid = self.ui.get_object('search_%s' % key) - if key == CONFIG.conf.search_default: - wid.set_active(True) - wid.connect('toggled', self.on_search_config, key) - self.search_type = CONFIG.conf.search_default - - self.set_fields_active(CONFIG.conf.search_default == 'fields') - - # setup search fields - for field in ['name', 'summary', 'description']: - wid = self.ui.get_object('field_%s' % field) - if field in CONFIG.conf.search_fields: - wid.set_active(True) - else: - wid.set_active(False) - wid.connect('toggled', self.on_search_field, field) - - # Setup search entry - self.search_entry = self.ui.get_object('search') - self.search_entry.connect('activate', self.on_search_changed) - self.search_entry.connect('icon-press', self.on_search_icon) - - # setup the package/queue/history views - self.setup_main_content() - - # Get the theme default TreeView text color - color_normal = get_style_color(self.package_view) - CONFIG.conf.color_normal = color_to_hex(color_normal) - logger.debug('theme color : %s' % color_to_hex(color_normal)) - - # spinner - self.spinner = self.ui.get_object('progress_spinner') - self.info_spinner = self.ui.get_object('info_spinner') - self.info_spinner.set_from_file(const.PIX_DIR + '/spinner-small.gif') - self.spinner.hide() - - # infobar - self.infobar = yumex.gui.widgets.InfoProgressBar(self.ui) - self.infobar.hide() - - # preferences dialog - - self.preferences = dialogs.Preferences(self) - - # setup actions - - wid = self.ui.get_object('main_pref') - wid.connect('activate', self.on_pref) - wid = self.ui.get_object('main_packages') - wid.set_active(True) - wid.connect('activate', self.on_packages) - wid = self.ui.get_object('main_groups') - wid.connect('activate', self.on_groups) - wid = self.ui.get_object('main_actions') - wid.connect('activate', self.on_queue) - wid = self.ui.get_object('main_history') - wid.connect('activate', self.on_history) - wid = self.ui.get_object('main_about') - wid.connect('activate', self.on_about) - wid = self.ui.get_object('main_doc') - wid.connect('activate', self.on_docs) - wid = self.ui.get_object('header_execute') - wid.connect('clicked', self.on_apply_changes) - - if not self.app.args.minimized: - self.show_now() - - # setup the package manager backend - # get the default enabled repos - if CONFIG.conf.repo_saved: - CONFIG.session.enabled_repos = CONFIG.conf.repo_enabled - else: - CONFIG.session.enabled_repos = self.backend.get_repo_ids('enabled') - - # get the arch filter - self.arch_filter = self.backend.get_filter('arch') - self.arch_filter.set_active(True) - self.arch_filter.change(self.active_archs) - - # setup default selections - self.ui.get_object('filter_updates').set_active(True) - # self.ui.get_object('search_keyword').set_active(True) - if CONFIG.conf.auto_select_updates: - self.package_view.on_section_header_clicked(None) - if self.app.args.minimized: - self.iconify() - - def load_custom_styling(self): - """Load custom .css styling from current theme.""" - css_fn = None - theme = Gtk.Settings.get_default().props.gtk_theme_name - css_postfix = '%s/apps/yumex.css' % theme - for css_prefix in [os.path.expanduser('~/.themes'), - '/usr/share/themes']: - fn = os.path.join(css_prefix, css_postfix) - logger.debug('looking for %s', fn) - if os.path.exists(fn): - css_fn = fn - break - if css_fn: - screen = Gdk.Screen.get_default() - css_provider = Gtk.CssProvider() - css_provider.load_from_path(css_fn) - context = Gtk.StyleContext() - context.add_provider_for_screen(screen, css_provider, - Gtk.STYLE_PROVIDER_PRIORITY_USER) - logger.debug('loading custom styling : %s', css_fn) - - def set_fields_active(self, state=True): - """Set search fields active/inactive.""" - for field in ['name', 'summary', 'description']: - wid = self.ui.get_object('field_%s' % field) - wid.set_sensitive(state) - - def on_window_state(self, widget, event): - # save window current maximized state - self.cur_maximized = event.new_window_state & \ - Gdk.WindowState.MAXIMIZED != 0 - - def on_window_changed(self, widget, data): - self.cur_height = data.height - self.cur_width = data.width - - def on_delete_event(self, *args): - if CONFIG.conf.hide_on_close or self.is_working: - self.hide() - return True - else: - self.app.on_quit() - - def _is_url(self, url): - """Check for a legal web URL.""" - urls = re.findall( - '^http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+~]' - '|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url) - if urls: - return True - else: - return False - - def _open_url(self, url): - """Open URL in default browser.""" - if self._is_url(url): # just to be sure and prevent shell injection - rc = subprocess.call('xdg-open %s' % url, shell=True) - # failover to gtk.show_uri, if xdg-open fails or is not installed - if rc != 0: - Gtk.show_uri(None, url, Gdk.CURRENT_TIME) - else: - dialogs.show_information('%s is not an url' % url) - - def on_about(self, widget): - """ Main Menu: Help -> About """ - dialog = dialogs.AboutDialog() - dialog.run() - dialog.destroy() - - def on_docs(self, widget): - """ Main Menu: Help -> Documentation""" - self._open_url('http://yumex-dnf.readthedocs.org/en/latest/') - pass - - def on_search_field(self, widget, field): - if widget.get_active(): - if not field in self.search_fields: - self.search_fields.append(field) - else: - if field in self.search_fields: - self.search_fields.remove(field) - CONFIG.conf.search_fields = self.search_fields - - def on_status_icon_clicked(self, force=False): - """Left click on statusicon callback. - - hide/show the window, based on current state - """ - if force or not self.is_active(): - self.show() - self.present() - else: - self.iconify() - - def setup_main_content(self): - """Setup the main content - - Setup the package, history and queue views pages - """ - # Package Page - queue_menu = self.ui.get_object('queue_menu') - self.queue_view = views.QueueView(queue_menu) - arch_menu_widget = self.ui.get_object('arch_menu') - self.arch_menu = yumex.gui.widgets.ArchMenu(arch_menu_widget, - const.PLATFORM_ARCH) - self.arch_menu.connect('arch-changed', self.on_arch_changed) - self.package_view = views.PackageView(self.queue_view, self.arch_menu) - self.package_view.connect( - 'pkg_changed', self.on_pkg_view_selection_changed) - sw = self.ui.get_object('package_sw') - sw.add(self.package_view) - # setup info view - info = self.ui.get_object('info_box') - self.info = yumex.gui.widgets.PackageInfo(self, self) - info.pack_start(self.info, True, True, 0) - self.info.show_all() - # Queue Page - sw = self.ui.get_object('queue_sw') - sw.add(self.queue_view) - # History Page - self.setup_history_page() - # Groups - sw = self.ui.get_object('groups_sw') - hb = Gtk.Box() - hb.set_direction(Gtk.Orientation.HORIZONTAL) - self.groups = views.GroupView(self.queue_view, self) - self.groups.connect('group-changed', self.on_group_changed) - #hb.pack_start(self.groups, True, True, 0) - # sw.add(hb) - sw.add(self.groups) - sw = self.ui.get_object('group_pkg_sw') - self.group_package_view = views.PackageView( - self.queue_view, self.arch_menu, group_mode=True) - #self.group_package_view.connect('arch-changed', self.on_arch_changed) - self.group_package_view.connect( - 'pkg_changed', self.on_group_pkg_view_selection_changed) - sw.add(self.group_package_view) - info = self.ui.get_object('group_pkg_info_sw') - self.group_info = yumex.gui.widgets.PackageInfo(self, self) - info.add(self.group_info) - self.info.show_all() - self.stack.show_all() - - def setup_history_page(self): - # History elements / packages views - hb = Gtk.Box() - hb.set_direction(Gtk.Orientation.HORIZONTAL) - self.history_view = views.HistoryView(self) - hb.pack_start(self.history_view, False, False, 0) - hb.pack_start(self.history_view.pkg_view, True, True, 0) - sw = self.ui.get_object('history_sw') - sw.add(hb) - # setup history buttons - undo = self.ui.get_object('history_undo') - undo.connect('clicked', self.on_history_undo) - - def set_content_page(self, page): - """Set the visible content page. - - :param page: active page (PAGE_PACKAGES, PAGE_QUEUE, PAGE_HISTORY) - """ - self.active_page = page - self.stack.set_visible_child_name(page) - - def exception_handler(self, e): - """Called if exception occours in methods with the - @ExceptionHandler decorator. - """ - close = True - msg = str(e) - logger.error('EXCEPTION : %s ' % msg) - err, errmsg = self._parse_error(msg) - logger.debug('err: [%s] - msg: %s' % (err, errmsg)) - if err == 'LockedError': - errmsg = 'dnf is locked by another process \n' \ - '\nYum Extender will exit' - close = False - elif err == 'AccessDeniedError': - errmsg = "Root backend was not authorized and can't continue" - close = True - elif err == 'FatalError': - errmsg = 'Fatal error in yumex backend' - close = False - elif err == 'NoReply': - errmsg = 'DNF Dbus backend is not responding \n'\ - '\nYum Extender will exit' - close = False - if errmsg == '': - errmsg = msg - dialogs.show_information(self, errmsg) - # try to exit the backends, ignore errors - if close: - try: - self.release_root_backend(quit=True) - except: - pass - self.status.SetWorking(False) # reset working state - self.status.SetYumexIsRunning(self.pid, False) - Gtk.main_quit() - sys.exit(1) - - def set_working(self, state, insensitive=False): - """Set the working state. - - - show/hide the progress spinner - - show busy/normal mousepointer - - make gui insensitive/sensitive - - set/unset the woring state in the status icon - based on the state. - """ - self.is_working = state - if state: - self.spinner.show() - self.status.SetWorking(True) - self._set_busy_cursor(insensitive) - else: - self.spinner.hide() - self.infobar.hide() - self.status.SetWorking(False) - self._set_normal_cursor() - - def check_for_updates(self, widget=None): - """Check for updates in status icon callback.""" - self.backend.reload() # Reload backend - widget = self.ui.get_object('filter_updates') - if widget.get_active(): - self.on_pkg_filter(widget, 'updates') - else: - self.ui.get_object('filter_updates').set_active(True) - - def _set_busy_cursor(self, insensitive=False): - """Set busy cursor in main window and - make it insensitive if selected. - """ - win = self.get_window() - if win is not None: - win.set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH)) - if insensitive: - for widget in const.WIDGETS_INSENSITIVE: - self.ui.get_object(widget).set_sensitive(False) - self.stack.set_sensitive(False) - doGtkEvents() - - def _set_normal_cursor(self): - """Set Normal cursor in main window and make it sensitive.""" - win = self.get_window() - if win is not None: - win.set_cursor(None) - for widget in const.WIDGETS_INSENSITIVE: - self.ui.get_object(widget).set_sensitive(True) - self.stack.set_sensitive(True) - doGtkEvents() - -# -# Callback handlers -# - def on_history_undo(self, widget): - tid = self.history_view.get_selected() - logger.debug('History Undo : %s', tid) - rc, messages = self.backend.HistoryUndo(tid) - if rc: - self.process_actions(from_queue=False) - else: - msg = "Can't undo history transaction :\n%s" % \ - ("\n".join(messages)) - logger.debug(msg) - dialogs.show_information( - self, _('Error in undo history transaction'), - "\n".join(messages)) - - def on_pkg_view_selection_changed(self, widget, pkg): - """Package selected in the view callback.""" - self.info.set_package(pkg) - - def on_group_pkg_view_selection_changed(self, widget, pkg): - """Package selected in the group view callback.""" - self.group_info.set_package(pkg) - - def on_packages(self, action, data=None): - """Switching to package page callback.""" - self.set_content_page(const.PAGE_PACKAGES) - self.hide_search_buttons(hide=False) - - def set_search_focus(self): - """Set focus on search entry and move cursor to end of text.""" - self.search_entry.grab_focus() - self.search_entry.emit( - 'move-cursor', Gtk.MovementStep.BUFFER_ENDS, 1, False) - - def on_search_config(self, widget, data): - """Search config callback.""" - self.search_type = data - CONFIG.conf.search_default = data - if data == 'fields': - self.set_fields_active(True) - else: - self.set_fields_active(False) - if self.last_search: - self.last_search = None - # send an active signal from the search entry & grap focus & place - # cursor - self.search_entry.emit('activate') - self.set_search_focus() - - def on_pkg_filter(self, widget, data): - """Switching package filter callback.""" - if widget.get_active(): - self.on_packages(None, None) - if data in ['installed', 'available', 'updates', 'all']: - self.infobar.info(const.PACKAGE_LOAD_MSG[data]) - self.set_working(True, True) - if self.last_search: # we are searching - self.current_filter_search = (widget, data) - pkgs = self.filter_search_pkgs(data) - else: # normal package filter - self.current_filter = (widget, data) - pkgs = self.backend.get_packages(data) - if data == 'updates': - if CONFIG.session.newest_only: - pkgs = self.backend.get_packages(data) - else: - pkgs = self.backend.get_packages('updates_all') - obs_pkgs = self.backend.get_packages('obsoletes') - pkgs.extend(obs_pkgs) - else: - pkgs = self.backend.get_packages(data) - self.status.SetUpdateCount(len(pkgs)) - self.info.set_package(None) - self.infobar.info(_('Adding packages to view')) - self.package_view.populate(pkgs) - self.set_working(False) - self.infobar.hide() - if data == 'updates': - self.package_view.set_header_click(True) - else: - self.package_view.set_header_click(False) - self.set_search_focus() - - def on_arch_changed(self, widget, data): - """Arch changed in arch menu callback.""" - self.active_archs = data.split(',') - logger.debug('arch-changed : %s' % self.active_archs) - self.arch_filter.change(self.active_archs) - self.refresh_search() - - def refresh_search(self): - if self.last_search: - self.last_search = None - self.on_search_changed(self.search_entry) - elif self.active_page == const.PAGE_PACKAGES and self.current_filter: - widget, flt = self.current_filter - self.on_pkg_filter(widget, flt) - - def on_search_icon(self, widget, icon_pos, event): - """Search entry callback.""" - #print(icon_pos) - # clear icon pressed - if icon_pos == Gtk.EntryIconPosition.SECONDARY: - widget.set_text('') - widget.emit('activate') - - def on_search_changed(self, widget): - """Search entry callback.""" - data = widget.get_text() - if data == '': # revert to the current selected filter - self.last_search = None - self.last_search_pkgs = [] - self.current_filter_search = None - if self.current_filter: - widget, flt = self.current_filter - state = widget.get_active() - if not state: - widget.set_active(True) - else: - self.on_pkg_filter(widget, flt) - else: - if self.search_type == 'key': - flt = '*%s*' - self._search_name(data, flt) - elif self.search_type == 'prefix': - flt = '%s*' - self._search_name(data, flt) - elif self.search_type == 'fields': - self._search_keys(self.search_fields, data) - - def filter_search_pkgs(self, flt): - """Get filtered search results. - - :param flt: filter (updates, install or all) - """ - if flt == 'updates': # get update only - pkgs = [ - po for po in self.last_search_pkgs if po.action in ('u', 'o')] - return pkgs - elif flt == 'installed': # get installed only - pkgs = [po for po in self.last_search_pkgs if po.installed] - return pkgs - elif flt == 'available': - pkgs = [po for po in self.last_search_pkgs if po.action == 'i'] - return pkgs - else: # get all - return self.last_search_pkgs - - def _search_name(self, data, search_flt): - """Search package name for keyword with wildcards.""" - # only search for word larger than 3 chars - if len(data) >= 3 and data != self.last_search: - self.last_search = data - self.set_working(True) - newest_only = CONFIG.session.newest_only - self.last_search_pkgs = self.backend.get_packages_by_name( - search_flt % data, newest_only) - logger.debug('Packages found : %d' % len(self.last_search_pkgs)) - self.info.set_package(None) - self.set_working(False) - if self.current_filter_search: - widget, flt = self.current_filter_search - self.on_pkg_filter(widget, flt) - else: - self._set_available_active() - - def _search_keys(self, fields, data): - """Search given package attributes for given keywords.""" - self.last_search = data - self.set_working(True, True) - newest_only = CONFIG.session.newest_only - self.last_search_pkgs = self.backend.search( - fields, data.split(' '), True, newest_only, True) - self.on_packages(None, None) # switch to package view - self.info.set_package(None) - self.set_working(False) - if self.current_filter_search: - widget, flt = self.current_filter_search - self.on_pkg_filter(widget, flt) - else: - self._set_available_active() - - def _set_available_active(self): - """Make the 'available' filter active, by selecting 'updates' and - the back to 'available'""" - widget = self.ui.get_object('filter_updates') - widget.set_active(True) - widget = self.ui.get_object('filter_all') - widget.set_active(True) - - def on_groups(self, widget): - """Group page selected callback.""" - if widget.get_active(): - self.set_content_page(const.PAGE_GROUPS) - self.hide_search_buttons() - if not self._grps: - logger.debug('getting group and categories') - self._grps = self.backend.get_groups() - self.groups.populate(self._grps) - - def on_group_changed(self, widget, grp_id): - """ Group changed callback - - called when a new group is selected and the group package view - shall be updated with the packages in the group - - :param widget: - :param grp_id: group id to show packages for. - """ - logger.debug('on_group_changed : %s ' % grp_id) - self.set_working(True, True) - pkgs = self.backend.get_group_packages(grp_id, 'all') - self.group_package_view.populate(pkgs) - self.set_working(False) - - def hide_search_buttons(self, hide=True): - """Hide search releated button, only shown on package page.""" - for widget in ['header_filters', 'header_search_options', 'search']: - self.ui.get_object(widget).set_sensitive(not hide) - - def on_history(self, widget): - """History page selected callback""" - if widget.get_active(): - if not self.history_view.is_populated: - result = self.backend.GetHistoryByDays( - 0, CONFIG.conf.history_days) - self.history_view.populate(result) - self.set_content_page(const.PAGE_HISTORY) - self.hide_search_buttons() - else: - self.release_root_backend() - - def on_queue(self, widget): - """Queue page selected callback.""" - if widget.get_active(): - self.set_content_page(const.PAGE_QUEUE) - self.hide_search_buttons() - - def on_info(self, action, parameter): - """Package info page radiobuttons callback.""" - widget = self.ui.get_object(action.get_name()) - if widget.get_active(): - self.info.clear() - self.info.write(action.get_name()) - - def on_apply_changes(self, widget): - """Apply Changes button callback.""" - self.process_actions() - - def on_options(self, widget, option): - """Options menu callback. - - Set the CONFIG parameter values based on the menu checkbox states - """ - state = widget.get_active() - setattr(CONFIG.session, option, state) - logger.debug('session option : %s = %s' % - (option, getattr(CONFIG.session, option))) - if option in ['newest_only']: # search again - self.refresh_search() - if option in ['clean_instonly', 'clean_unused']: - self.reset_on_error() - - def on_pref(self, widget): - """Preferences selected callback.""" - need_reset = self.preferences.run() - if need_reset: - self.reset() - - def _populate_transaction(self): - self.backend.ClearTransaction() - errors = 0 - error_msgs = set() - for action in const.QUEUE_PACKAGE_TYPES: - pkgs = self.queue_view.queue.get(action) - for pkg in pkgs: - if action == 'do': - logger.debug('adding: %s %s' % - (const.QUEUE_PACKAGE_TYPES[action], - pkg.pkg_id)) - rc, trans = self.backend.AddTransaction( - pkg.pkg_id, - const.QUEUE_PACKAGE_TYPES[action]) - if not rc: - logger.debug('result : %s: %s' % (rc, pkg)) - errors += 1 - error_msgs.add('%s : %s' % - (const.QUEUE_PACKAGE_TYPES[action], pkg)) - else: - logger.debug('adding: %s %s' % - (const.QUEUE_PACKAGE_TYPES[action], - pkg.pkg_id)) - rc, trans = self.backend.AddTransaction( - pkg.pkg_id, const.QUEUE_PACKAGE_TYPES[action]) - if not rc: - logger.debug('result: %s: %s' % (rc, pkg)) - errors += 1 - error_msgs.add('%s : %s' % - (const.QUEUE_PACKAGE_TYPES[action], pkg)) - for grp_id, action in self.queue_view.queue.get_groups(): - if action == 'i': - rc, trans = self.backend.GroupInstall(grp_id) - else: - rc, trans = self.backend.GroupRemove(grp_id) - if not rc: - errors += 1 - error_msgs.add('group : %s : %s ' % (action, grp_id)) - logger.debug(' add transaction errors : %d', errors) - if errors > 0: - raise TransactionBuildError(error_msgs) - - def _check_protected(self, trans): - """Check for deletion protected packages in transaction""" - protected = [] - for action, pkgs in trans: - if action == 'remove': - for id, size, replaces in pkgs: - (n, e, v, r, a, repo_id) = str(id).split(',') - if n in CONFIG.conf.protected: - protected.append(n) - return protected - - def _build_from_queue(self): - """Populate transaction from queue and resolve deps.""" - # switch to queue view - if self.queue_view.queue.total() == 0: - raise QueueEmptyError - widget = self.ui.get_object('main_actions') - widget.set_active(True) - self.set_content_page(const.PAGE_QUEUE) - self._populate_transaction() - self.infobar.info(_('Searching for dependencies')) - rc, result = self.backend.BuildTransaction() - self.infobar.info(_('Dependencies resolved')) - if not rc: - raise TransactionSolveError(result) - return result - - def _get_transaction(self): - """Get current transaction.""" - rc, result = self.backend.GetTransaction() - if not rc: - raise TransactionSolveError(result) - return result - - def _run_transaction(self): - """Run the current transaction.""" - self.infobar.info(_('Applying changes to the system')) - self.set_working(True, True) - rc, result = self.backend.RunTransaction() - # This can happen more than once (more gpg keys to be - # imported) - while rc == 1: - # get info about gpgkey to be comfirmed - values = self.backend._gpg_confirm - if values: # There is a gpgkey to be verified - (pkg_id, userid, hexkeyid, keyurl, timestamp) = values - logger.debug('GPGKey : %s' % repr(values)) - ok = dialogs.ask_for_gpg_import(self, values) - if ok: - # tell the backend that the gpg key is confirmed - self.backend.ConfirmGPGImport(hexkeyid, True) - # rerun the transaction - # FIXME: It should not be needed to populate - # the transaction again - self._populate_transaction() - rc, result = self.backend.BuildTransaction() - rc, result = self.backend.RunTransaction() - else: - break - else: # error in signature verification - dialogs.show_information( - self, _('Error checking package signatures\n'), - '\n'.join(result)) - break - - if rc == 4: # Download errors - dialogs.show_information( - self, _('Downloading error(s)\n'), - '\n'.join(result)) - self.reset_on_cancel() - return - elif rc != 0: # other transaction errors - dialogs.show_information( - self, _('Error in transaction\n'), - '\n'.join(result)) - self.reset() - return - - @ExceptionHandler - def process_actions(self, from_queue=True): - """Process the current actions in the queue. - - - setup the Dnf transaction - - resolve dependencies - - ask user for confirmation on result of depsolve - - run the transaction - """ - self.set_working(True, True) - self.infobar.info(_('Preparing system for applying changes')) - try: - if from_queue: - result = self._build_from_queue() - else: - result = self._get_transaction() - self.set_working(False) - # check for protected packages - check = self._check_protected(result) - if check: - dialogs.show_information( - self, _("Can't remove protected package(s)"), - '\n'.join(check)) - self.reset_on_cancel() - return - # transaction confirmation dialog - self.transaction_result.populate(result, '') - ok = self.transaction_result.run() - if ok: # Ok pressed - self._run_transaction() - else: # user cancelled transaction - self.reset_on_cancel() - return - except QueueEmptyError: # Queue is empty - self.set_working(False) - dialogs.show_information(self, _('No pending actions in queue')) - self.reset_on_cancel() - except TransactionBuildError as e: # Error in building transaction - dialogs.show_information( - self, _('Error(s) in building transaction'), - '\n'.join(e.msgs)) - self.reset_on_cancel() - except TransactionSolveError as e: - dialogs.show_information( - self, _('Error(s) in search for dependencies'), - '\n'.join(e.msgs)) - self.reset_on_error() - - def reset_on_cancel(self): - """Reset gui on user cancel""" - self.set_working(True) - self.infobar.hide() - self.set_working(False) - - def reset_on_error(self): - """Reset gui on transaction errors.""" - self.set_working(True) - self.infobar.hide() - self.release_root_backend() - self.set_working(False) - - @ExceptionHandler - def reset(self): - """Reset the gui to inital state. - - Used after a transaction is completted. - """ - self.set_working(True) - self.infobar.hide() - self.release_root_backend() - self.backend.reload() - # clear the package queue - self.queue_view.queue.clear() - self.queue_view.refresh() - # clear search entry - self.last_search = None - self.current_filter_search = None - self.search_entry.set_text('') - # reset groups - self._grps = self.backend.get_groups() - self.groups.populate(self._grps) - self.group_package_view.populate([]) - self.set_working(False) - # switch to package page - widget = self.ui.get_object('main_packages') - widget.set_active(True) - self.set_content_page(const.PAGE_PACKAGES) - # show updates - widget = self.ui.get_object('filter_updates') - widget.set_active(True) - self.on_pkg_filter(widget, 'updates') - - -class YumexApplication(Gtk.Application): - """Main Gtk.Application class.""" - - def __init__(self): - Gtk.Application.__init__( - self, - flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) - self.args = None - self.status = None - self.save_win_size = False # save windows size flag - self.win = None # main window - self.pid = 0 - - def do_activate(self): - """Gtk.Application activate callback.""" - logger.debug('do_activate') - if self.args.install: - self.install = YumexInstallWindow(self, self.status) - self.install.show() - self.install.process_actions( - 'install', self.args.install, self.args.yes) - elif self.args.remove: - self.install = YumexInstallWindow(self, self.status) - self.install.show() - self.install.process_actions( - 'remove', self.args.remove, self.args.yes) - elif self.args.updateall: - self.install = YumexInstallWindow(self, self.status) - self.install.show() - self.install.process_actions( - 'update', '*', self.args.yes) - - else: - self.save_win_size = True # normal app mode - self.win = YumexWindow(self, self.status) - self.win.connect('delete_event', self.on_quit) - self.win.show() - - def do_startup(self): - """Gtk.Application startup callback.""" - logger.debug('do_startup') - Gtk.Application.do_startup(self) - # Setup actions - self._create_action('quit', self.on_quit) - - def _create_action(self, name, callback, para=None): - """Create and Gio.Action and connect it to a callback handler - handles app. actions defined in GtkBuilder ui file. - """ - action = Gio.SimpleAction.new(name, para) - action.connect('activate', callback) - self.add_action(action) - - def on_quit(self, action=None, parameter=None): - """Quit callback.""" - # If we quit from the StatusIcon, then quit the status icon also - if action is None: - self.keep_icon_running = False - self.quit() # quit the application - - def do_command_line(self, args): - """Gtk.Application command line callback. - - Called if Gio.ApplicationFlags.HANDLES_COMMAND_LINE is set. - must call the self.do_activate() to get the application up and running. - """ - Gtk.Application.do_command_line(self, args) - parser = argparse.ArgumentParser(prog='yumex') - parser.add_argument('-d', '--debug', action='store_true') - parser.add_argument( - '-y', '--yes', action='store_true', - help='Answer yes/ok to all questions') - parser.add_argument( - '--icononly', action='store_true', - help='Start only the status icon') - parser.add_argument('--exit', action='store_true', - help='tell session dbus services used by yumex to exit') - parser.add_argument( - '-I', '--install', type=str, metavar='PACKAGE', - help='Install Package') - parser.add_argument( - '-R', '--remove', type=str, metavar='PACKAGE', - help='Remove Package') - parser.add_argument( - '--updateall', action='store_true', - help='apply all available updates') - parser.add_argument( - '--minimized', action='store_true', - help='start Yum Extender mimimized') - self.args = parser.parse_args(args.get_arguments()[1:]) - if self.args.debug: - self.doTextLoggerSetup(loglvl=logging.DEBUG) - # setup log handler for yumdaemon API - self.doTextLoggerSetup( - logroot='yumdaemon', - logfmt='%(asctime)s: [%(name)s] - %(message)s', - loglvl=logging.DEBUG) - else: - self.doTextLoggerSetup() - logger.debug('cmdline : %s ' % repr(self.args)) - if self.args.exit: - dbus_statusicon('Exit') - dbus_dnfsystem('Exit') - sys.exit(0) - # Start the StatusIcon dbus client - self.status = yumex.status.StatusIcon(self) - if not self.status.is_started: - msg = self.status.last_err + _('\n\nYum Extender will close') - dialogs.show_information(None, - _('Error in starting notification icon'), - msg) - sys.exit(0) - self.status.Start() # Show the icon - if self.args.icononly: # Only start the icon and exit - sys.exit(0) - # Check if yumex is running already - self.pid = os.getpid() - run_pid = self.status.GetYumexIsRunning() - if run_pid > 0: # yumex is allready running - if dialogs.yes_no_dialog(None, 'Yum Extender is already running', - '\nprocess-id : %d' % run_pid + - '\nDo you want to quit it'): - if not self.status.GetYumexIsWorking(): - dbus_statusicon('QuitYumex') # no, quit the running yumex - else: - dbus_statusicon('ShowYumex') # yes, show the running yumex - else: # user answered no to quit - dbus_statusicon('ShowYumex') # show the running yumex - sys.exit(0) - else: # not running, - if self.status.SetYumexIsRunning(self.pid, True): - self.do_activate() - else: - msg = _('Yum Extender will close') - dialogs.show_information(None, - _('Error in locking notification icon'), - msg) - sys.exit(1) - - return 0 - - def do_shutdown(self): - """Gtk.Application shutdown callback. - - Do clean up before the application is closed. - """ - Gtk.Application.do_shutdown(self) - if self.status: - if self.status.GetYumexIsRunning() == self.pid: - self.status.SetYumexIsRunning(self.pid, False) - if not CONFIG.conf.autostart and \ - not CONFIG.conf.autocheck_updates: - self.status.Exit() - # if windows object exist, unlock and exit backends - if self.win: - # don't save windows size in install mode - if self.save_win_size: - if self.win.cur_maximized: - CONFIG.conf.win_maximized = True - else: - CONFIG.conf.win_width = self.win.cur_width - CONFIG.conf.win_height = self.win.cur_height - CONFIG.conf.win_maximized = False - self.win.release_root_backend(quit=True) - logger.info('Saving config on exit') - CONFIG.write() - - def doTextLoggerSetup(self, logroot='yumex', - logfmt='%(asctime)s: %(message)s', - loglvl=logging.INFO): - """Setup Python logging.""" - logger = logging.getLogger(logroot) - logger.setLevel(loglvl) - formatter = logging.Formatter(logfmt, '%H:%M:%S') - handler = logging.StreamHandler() - handler.setFormatter(formatter) - handler.propagate = False - logger.addHandler(handler) From e94743b67db15b71f1c14e98032e03204df65914 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Wed, 27 Apr 2016 20:33:14 +0200 Subject: [PATCH 007/133] InfoBar: remove custom colors and code Rely on Gtk theme for coloring the info bar. Use a GtkInfoBar. This will fix #87. --- src/yumex.ui | 81 +++++++++++++++++++++++----------------- src/yumex/gui/widgets.py | 54 +++++++++++++-------------- 2 files changed, 74 insertions(+), 61 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 67117fc..87768e0 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -871,8 +871,8 @@ start Yum Extender True True - True False + True True @@ -905,43 +905,53 @@ start Yum Extender False True - 1 + 2 - + True + True False - - - True + 5 + + + False + 6 + end + + + + + + + + + + + + False + False + 0 + + + + False - 6 - 6 - 5 - 5 - 6 - 6 - 0 - in True False - 6 - 6 True 6 + 5 True False start - 6 - 6 6 10 - True label @@ -956,27 +966,22 @@ start Yum Extender True False - 12 - 12 10 10 True - 0 + 1 1 - 2 False start - 20 - 10 + 16 20 10 - True label @@ -984,36 +989,44 @@ start Yum Extender - 0 + 1 2 - 2 True False - 12 - 6 True 0 0 + 3 - - - + + False + True + 1 + + + False + False + 0 + + + + False True - 2 + 0 diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index b354933..fbfec60 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -47,44 +47,42 @@ class InfoProgressBar: def __init__(self, ui): self.ui = ui self.infobar = ui.get_object("infobar") # infobar revealer - frame = ui.get_object("info_frame") - new_bg = Gdk.RGBA() - if yumex.misc.check_dark_theme(): - new_bg.parse("rgb(0,0,0)") - else: - new_bg.parse("rgb(255,255,255)") - frame.override_background_color(Gtk.StateFlags.NORMAL, new_bg) self.label = ui.get_object("infobar_label") self.sublabel = ui.get_object("infobar_sublabel") self.progress = ui.get_object("infobar_progress") + self.spinner = ui.get_object("info_spinner") def _show_infobar(self, show=True): - self.infobar.set_reveal_child(show) + if show: + self.infobar.show() + self.spinner.start() + else: + self.spinner.stop() + self.infobar.hide() + self.label.hide() + self.sublabel.hide() + self.progress.hide() + self.progress.set_show_text(False) def show_progress(self, state): if state: self.show_label() else: - self.hide() + self._show_infobar(False) def hide(self): - self.label.hide() - self.sublabel.hide() - self.progress.hide() self._show_infobar(False) - self.progress.set_text("") - #self.progress.set_show_text (False) def hide_sublabel(self): self.sublabel.hide() - def show_label(self): + def show_label(self, msg=""): + self.label.set_text(msg) self.label.show() - self.label.set_text("") - def show_sublabel(self): + def show_sublabel(self, msg=""): + self.sublabel.set_text(msg) self.sublabel.show() - self.sublabel.set_text("") def show_all(self): self.show_label() @@ -93,25 +91,27 @@ def show_all(self): def info(self, msg): self._show_infobar(True) - self.show_label() - self.label.set_text(msg) + self.show_label(msg) def info_sub(self, msg): self._show_infobar(True) - self.show_sublabel() - self.sublabel.set_text(msg) + self.show_sublabel(msg) def set_progress(self, frac, label=None): if label: self.progress.set_text(label) + self.progress.set_show_text(True) + else: + self.progress.set_show_text(False) + if frac >= 0.0 and frac <= 1.0: - self.infobar.show() + self._show_infobar() self.progress.show() self.progress.set_fraction(frac) - # make sure that the main label is shown, else the progres - # looks bad. this is normally happen when changlog - # or filelist info is needed for at package - # and it will trigger the yum daemon to download the need metadata. + # make sure that the main label is shown, else the progress + # looks bad. this normally happens when changlog or filelist info + # is needed for a package and it will trigger the yum daemon to + # download the need metadata. if not self.label.get_property('visible'): self.info(_("Getting Package Metadata")) From 09a48c5beba2ce1e64cb37fc2ecf440c1b6d69e5 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Wed, 27 Apr 2016 21:30:04 +0200 Subject: [PATCH 008/133] Delete spinner-small.gif --- gfx/spinner-small.gif | Bin 847 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 gfx/spinner-small.gif diff --git a/gfx/spinner-small.gif b/gfx/spinner-small.gif deleted file mode 100644 index b1833fa8afbf6c6558267bb28f53f14c8dd7839b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 847 zcmZ?wbhEHb6krfw_`<;O|NsB6p6kDU|E*qnf9>(tk$uA5x~?T5{m! z%$?8PeEPNP!n+$!zP7G;)VJvg11Ui9KewN2NU*bGfUA+70W%{|ui`%`=c3falGGH1 z^30M9g~Y7Hik$q!6ur#6w0s7|pDdhQKvg;*TR@IvU=2`E=u63*x70u+M^URKVb$6h zBF835nKpc2yV=nY-OFObl-U|EQJ|HvvvpD58cm%B&!``ZRFXdI@|ZNiqGg4tnrua< zX|{rmu*j!M*`x3Kov>Mwp`g&^eyJxzOX}!@6)PN6Tx$;;IC$+S6GzXKhSUrZA)bQ= z6dVM(d=4~xNDg#wW^&r{bX$Pw3!u-kC5G#KzjvRP>Ha<(fgVzWE}=tJet6Etp#cxZ7Q2@v7bUD9s&-nfy=%K5aR z_ZE+qriW}EdNWjRZmeYB5ZHI|4C{?7ZoS5E7l%81kqnCrJUGQ#bqxBPu5k5b3wS+y z%M)sETF%T;qms=Vqsh=_!j zGwqw8?Al~edazEi@Z=R(^J4R(Pp7853g=NdW^%iI(bJs2W_XK*y;nl9PO znB?NIg^gj=&cq}gu0GX<0%Nh{Bgz}pfAGFhVmC1}4^Y#J&~MP_=~cmMX*|?Y51_|5 zmN}R(9NKiuQOR>6$A(!86FBVhT3I~}R5~Pj<-E-|@p|a6AMDgEY1V3Lc9jwlSaMkR sV#11!gab@J1q?emBsNTU=;w1b&*0EEWJzO<(d_O~Q)I9PB~LH_0A9-x5dZ)H From 78da7561b1de38145f8473906dfdf59bf879c932 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Wed, 27 Apr 2016 21:30:22 +0200 Subject: [PATCH 009/133] Delete spinner.gif --- gfx/spinner.gif | Bin 7661 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 gfx/spinner.gif diff --git a/gfx/spinner.gif b/gfx/spinner.gif deleted file mode 100644 index e1f00794107fd5e8bc655e2285c4edbc49e80d75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7661 zcmd^^`(IOMp2ttlNls4gC--}DPI5xh4qED^gO_nb?%`sw+9|e9ixw@T2mui&A|@eV zK<GB(r_0Ag1?dN{Z2AzZcs{w73NED2B8` zFH^~UMe*C9!Xw^SEGlqo*5S;~u3?Y5szl3w*{P@+S|>?l#4YGVM{97#-Rk9*J~|R8 zUWX|(9h*LzCj6kfq<%)~aWnd5tjcw_&-Cv*-<{f7i^2E5Eb70%tn#QLB1nNE3dR+&WBbXWlRyzb z4nPY)2tW=1FJKE40pt+T!k#XG9VjTO2%sIHh=@$SiO3`(sO&5t2cU)C*L#5+fXaaA z{u!b`?^zok4*RR&(&f8aDU@0QM#=e#szgct1zs5%x4Ii(E2+T&2h9AOFeohwL0J=NsFh z9HU6P0ei~w)w8Vm8(|0g?hB47h|Q$15aIFzzvB=LtQTC=Fohe(A$+9}m%@m4!7S^8qAN8cY zfzs|nxBNJCU}BI2QRo0P;0{;=?tuP<4=<4Ej1psm) zDgZzqXdo&806h{36(OJjpadY8MK-Tj&;##gG)&qsSPR;R;QTFOXelrA@V%C{O$*iXb5@`9d>A#$gSEp%$IAzb5; z_2z0n-7LbcTUOKG!^l;hGc_isa5=?eD?-G^fwIPz+A>&+O&j4^v$QuYqXYZwPb8|b z7dP4cZH+>8tMIE!p3cywg%a-78|E^I`C+>U>JkRZVr5ng@_B1b^zyV=M_PR#Cd6EJ zt;TXLU`89fR~8Kr#GWlE;*a_C%twj%eemW7z(?$Qs2^Az7#{GBi|Z4X2MQUHJl)B$_IJL-I(2G9b4H=qtkM?DYB57Yp(0+0jn0Cv>;kJk1e+M6B* z{#H|$vvD?^|C^s>NoL?-bdlmYujuU9?ZA?$-`2H%a=GPJ0aR4PG}<+i>|{1lCKt0v zDX^u+&KBSZJH@CkLqyp!8qZFNgK~XEBD=kS)9vVYNNZkgdr@4*+?v8TDCbl;NWWa0 zYVhNv$5@6NhP)K#{Oc~bpb!(eNV-djomP6JUzUwIl)9K~pRQIf^`ft?+spkD+v>6S z>d$^~h&mqoQDXhsVEMnC|4Wgjj|v?S^AaV=W!)nIU+Uuu-&oC98%xqL*F}>%K zIbos}V}8K?!K4QY0QjTqCw(6^J#c@N{iNvu`zZKHuSbmz!XOHM((X~O1Jge$yGMrv zF#SW>XXVfM&>(M1y>!JA8^glJ;*<;BO`Ad^2d%M1b26V??Q;|sLAVZES)gS+!+{G5 zM0$>tCkU(UJbpO*DiAJJUw%?5eaMKARg1VI(3jz5GL6zM|o}oE?s#o_)y_#EgwW&hJ`r0-( zt>T8ajIOF)d?TG0M68!?We&UFry-dIl9fm8#G)on5&Wx#3Q--sD(UgKVT@;WaUgnp z%TUG%XCss+YQ#H~G0i+l`>#*MC5YaC%!;sX+cJ>fWhQU?@XvU&hsKldf8Nyb*3Zrp z4{?2@;}4IoJ}}$z@_}aoD?kqr28IQMfoDOi1J44OfPW*?FpS z<%e|1HUT_s>v<{Xt4^ZDPRKDjeN8z|SEY)T`GqX8PM~9Kz>G9b%+ox24P5DnQ7RSU zRy*^hL~&a_xysqtZCgj`>HFO=>>4_AKC=KL-*j>+w5i&1%;4c|(900lyB%mVPI**( zs?Q!HR`4&{5Uk=tN(@sdS|j~PC8^n{OKv(`&K)sdGjVsn*_YujpARz}5Y1q#ocArh zqd$GK3@Y{H1Sq#jT zb}qV{`FJzR;}{kTzo_CgpldG9`g^w(PMJcDrSRT*tLM@LdD8=)kCKmgetfV;$OC8- z61akl!m>iG?84s{OTILg;ANY}V_X3rB zsID%<-=NW%Qc(N)beL;n2K>Zqx{G2_UrN~Scb>U>6Q_t5>F6!`6ZW%7=NMY+ZF#21!USd!SyXT{g zVA=ofy}es6lLc#yDHPKvM0xNr2ePINL%glmdF!e#9aYfRu07!$_&zv0{^qW9TK9VO z=B%`S&&eRBo9jp$wl)&;n49U)slQ%%w|4zziO($}>=oR178U4++6n&?kV6VBvN!?(MsrGhs9-%tb_Q8EsQgp&*mkazz=Z!^P0Y2w7Sx^RNdNGALN~t6%DtaOXxj8{eV-|7N~XWdp60XC2o^S6U>wU!DZqHcJRaP?ygXn zxkqg!(0xarp0o-&R^A`uGH5e*l5o+RSP<3lFVyxY_FCl4wF&euXt*Wuoe z-^@J!6l>z4_h9}1@S%6V{=w6KeDg<(AF!X)!GqlobTBD`A1(kOf@u9myB`SaC#(P7 zg7-{Q*+2(_i_@K=5_;ye2cE|8dT~VGKnj0`<#CpO~CRD zwxZ1Gr^^~}z167+4-6tAlv{s$s>kNk>n%S!31o3_OpC?}0#`|+s95D>F*W>WK z1CH(_(-R?#QM&|wZg7yS`x0g;5?=R)A!Y0h*taq@geDxMHxZ-HoS&M0A`%5zA5TQV zV-L2$^Gg7hNLr8YfC&Hb9WeR4yT1cK-$!>q^xQMC1ETRC_4}ln?yrGpv4Cb6PnF3v z09xe{t^u$E9{%hD5}4;{qP>z=l)hklc-IoIi!gfx|Ww+kjQaZ~bC0z|h1m z5?$WibLowU1m;lKkG%UIxZnM+IS`>Xe!{y?ZDI~YVqp9-7#V`&YyThbf=Cj8EjT_3 zfZiVAF8I-Re?$PTrok1{XD`)n^M@cCL14IBe7R*e2c`1|iK(Ckd^s?q@M$xLMu}Kr zy`Vv?q!jBgSe$G&al(mhnij&O7fZ=@3sZ*^Di*WHX%=ugL#uJ2lP4+3Aq-l9n@4Gg zl0l8$uIFbDu6skZ&7~K@>vM8&mK`Z>DdF-sf_^8HR4KMfhHMfxpJWYU>IHg+hzt|6 zaZF5`({Y`Zyez#nj=8gXd&`L5zY%3OS7T#5F^eg*g~B5Nhnub;rYU`c0&)d^-`8Yc z`)N4oi}Yvy7PHhbWfz}9+d`ji?kt zwgCYYXUJ(hTFBr31l^myX1^|WHTPOx0J@q@G1jICq~r>lk-^am1bPm@?}x=n0tU4j z=7l_Flg2OSdGrj)YCp!#PZYqrTV53Q9Kerc>zFR47%{Pqv?*yZe3J~-@zDb?Lu*2g zIgRY*cUG@PD{Z`9+%V!58#a9E|H5fHfT`z;**CM<*KPXsy_&uhF?Dxv>9bWD>B z%^Y)d8aSFU$D*@ztbOi$EgXRCj4FEzUdi0AHLv#j2667ay{%pRO{|YTHYgPzf z#$ySo*3*v_8%+EYG&HaP!EryVTamO@C|F4s+vRdTUrvRU_!c$CW9EeYJ8(MJYu0E3 z7>T&KY_(+PmQ{u|9zJ}Ke63Y7PAS0_Z$<&^kBZ2p8h7NAJ;^rHh`vjVQM=wL{bLq5W2D9V#dm}xm4a;s{ zoZDC5?hn&tk7vE$C(CGaz440g`zyv;=~pz|_`S&kKevviqtiz5GnH%sjds8vcjtfAZ)9UVi{Opbxl5SKs8N7i=~_ z4RD`aeNo~M9e)4d%nKd^Kh64|@=J-j^5pQ_Tjn-44zCFigxp3o6>NE2z3>%UFs%Zi zuZFU-jrx^|dLx#Dm(z829#3lE8x`d+JF!pzm*-$)rIV-Dl*NM)VI!xNSPkb;Xql6t5wE?)q=6k27g60q+{oj#_gu%f80$*~(j=4^3WV@bPGBDiR zul7$X>*hizGkiyeA^5H-k z#$Y=Z-TwG~;`7w>A8GtU}EM76ew$9&L+irT!Ja#A}28Z25{=M^e?RrK5Voo<4xV4rYO6*!uTR$!E;`t4I*GmrbSnO%dKJesqlIFW{HV{}7p z0k{0?Qmy8+gZS)iTp{-kx82#4qIcqpkA7siLchu8p?eo|)5AJx9JgN7W zE^>;Xn^nH+b5nXb}IVsG?7S Date: Wed, 27 Apr 2016 21:36:18 +0200 Subject: [PATCH 010/133] Remove tray icons Remove tray icons and references to it in Makefile. Makefile: Don't create empty directory any more. --- gfx/Makefile | 4 ---- gfx/tray-error.png | Bin 5006 -> 0 bytes gfx/tray-info.png | Bin 5200 -> 0 bytes gfx/tray-no-updates.png | Bin 5145 -> 0 bytes gfx/tray-updates.png | Bin 4242 -> 0 bytes gfx/tray-working.png | Bin 5636 -> 0 bytes 6 files changed, 4 deletions(-) delete mode 100644 gfx/tray-error.png delete mode 100644 gfx/tray-info.png delete mode 100644 gfx/tray-no-updates.png delete mode 100644 gfx/tray-updates.png delete mode 100644 gfx/tray-working.png diff --git a/gfx/Makefile b/gfx/Makefile index 1d05a70..6c51b79 100644 --- a/gfx/Makefile +++ b/gfx/Makefile @@ -8,11 +8,7 @@ clean: echo "Nothing to do" install: - mkdir -p $(DESTDIR)$(DATADIR)/$(APPNAME)/gfx mkdir -p $(DESTDIR)$(DATADIR)/icons/hicolor/scalable/apps mkdir -p $(DESTDIR)$(DATADIR)/icons/hicolor/48x48/apps install -m644 yumex-icon.svg $(DESTDIR)$(DATADIR)/icons/hicolor/scalable/apps/$(APPNAME).svg install -m644 yumex-icon.png $(DESTDIR)$(DATADIR)/icons/hicolor/48x48/apps/$(APPNAME).png - install -m644 tray*.png $(DESTDIR)$(DATADIR)/$(APPNAME)/gfx/. - install -m644 spinner*.gif $(DESTDIR)$(DATADIR)/$(APPNAME)/gfx/. - diff --git a/gfx/tray-error.png b/gfx/tray-error.png deleted file mode 100644 index ed365a9022ba5f48044f67eaaa2fefc5c0b12709..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5006 zcmV;96LIW`P)-TT&BdQERhfP_FoAOi%$4$e^!w^2uDgwfG6jvIP(jIv}S1RFF7 zB*>tn2pmySmLcFE;&_xSENPY&NepD~bkgZ`y3>1gSJiv<-n;jH^G7ZHs=7kbNyJfk zeZJgRukKrZzi++Ys{n6rZ*OmJf6E*DbKG>znl)PczP9Tb$IT4*p{WPAUw2(|;%|b0 z72jDg%LIP}jLp65vdgvB)>h$po~x9))pLU%G&eVA{wfJ*Zf@2iG5tRPe#i9br}7Vf z=pXfn9f1%6Z*1Ly^&8enQZ%d}S8A~CTd-h3`mct7+wWZd0S)|n1kCvGhd#p3m~|$U zl5kxIre(o2EO=f9oBsG3UVO1dDn%(Gx|1aP!IC9QhW}y-Sg~rwWje#%3N-J6c^9fn zFTG5&tq3w17jDJ@5di>n-9RJ~g`pep10TC~?Zo;GYklAMIe=eE;I5k%-1PEa3<0ZF zEuRa{Zz7_PpK{7H@&5O|->9yxg^&V{lY)=}tZ-`rWe4cG4%?2xG)x3RfPEe9c>aaw z{Gp*CgKPW+rR0Ckm^SOz*IaXr{C`Qns#PoA$vD47DtYD9sZ+(3S6pQ@HBJT*!FAK{ zd=HEPiU_G>3Z`kow(T(*C_8FgLnIP~Wm-^*Ffh=Ems?*}yLRnloby9cin~Z^51a`1 zIBo*&yYD_@cy!>OHLl$#rJQ%_^clgs-t}&yzODfPkjXf3J+}bPbsVJ9X(**oQ(c2d zB$9Il0#Pv$oH1Bd1Q9z5&NRJE+rS1(pNOfFcqqDk@=H))6fr>>}Bbz!*owjv^X~ zLe~uhfsX?RJJH(ODh?dz)HIDBl2ZNR-KB{T_lTymrb#?Xr zMHgOd&X{ppLECP|ftzt4gv{Y4WIP|9?;)!?jDZgU&u4&mJPy+`fdVj$C!>^rkTvAV zFbosXNDR?P6aYgqIfCswx1+W76+e^7=$!ElO3GUoFTS~@6sKOca9Q>3)sk>yZB30g zZ{GRVX{Viz%8Duz05YD7q2U2!{0vwQSRf>P&w~&GjIk_0HXeNbc+nODUtldahW{xqViK~)3(#4J1h8Vw(wL4ZTqG4ir6V%|K!^ZB1n>h7p6{7peA`hI zAPGB3O3m{!&@~-Igk&-WB2}#A9I#UD=QUqMLKu9`C8)>(Lgrnf{bDy6`+97r*g5hi z8it8fI+dkbvF+us@^S}l-QNKK$#fEiVT25qjT4qLVO4WauUmi3Av9?xIDD4jeTB*I(Z}q-k0rkx0PM zjogAoD+_k)V4jm=B4lqblK0#PW7lqsKK=`E#=x(;?psnq7f;XEt>N~o5OeS3qvFKJxMD>$V2qRdhB7j$$W{iC0tVa90) z_U?rk8iMJ0h-EwsJ@8|2#z8EvI)Y4$pyyjF(K!1|i2eH^M@PZ?`%zt0jov#}gOn;P zpT`A*qWU3MI-3@hQt0T|#~85}CQJZv)pD@ATNgsWHf=DT2h2)SW+=jEMfCJw^q%`r zKYcpi3 zqxX*Ql+`*NCPCU(1j*zmgbfg5+ey%rVYmOZg7|~GL+y|5P%p1f&e5X zAOt8UVsH>P0OMc}27mrAWGacCTW&+s=`$g_x}Y){P!Nor69j;iP+lgqEt@% zam%!EsJ924^WKFEm$grrfE#aY9?-bf(bIDfrfC5HG)+5F`UL=()25+%{#S8uPaCwR zCMYREK~NAeIEY9PK=15A=htsQ+|v*U zhHgO9H0){LBT3PQH(TfMH~Ug5`E1*sHpw}Mshi^nC^A6` zvWhWOM|hqe)$3^6}#)fRp~T?+1K%cnFb53?PE0X%hnP z>~6!Mm8(!wUk|URXH4rsFeXAkx-MvF2$hH(zT+lf;lhQ7z}U;%cWxuwwxMY{bd47}KzI`p6e(mnJJGlDcGOOq1pm;Xab{mC zB9j3P52Hd6_AkB}P-8AuYW`vH01%DF0RXSO^0JUp{rG6wef(%95vlLCw!Q)(1S;ZH zK&~h%>-RbBD^l>fyU~5qGE`Sq!RzZQiu6hd5C9&F6}f>F0>X7cqoc5sDRkU&Ytdq< z$mc`gL4>M`Ds*>uA?>7vZ3YjVFak2^;D3myzrDQ;@puIo12kPPn0PUG1w{%XkwDkt zrKql|g4f><8S;B61QY;aSr{A~0Em<3pN1cqUv z<)s$|fJcw^b^B2f(A?ZCq*OnAVdD#eGmfYo2WJ2;iUleMo*+g>(E0W2Q5A{89~dYE zJsAeC>qyxa8W&!V;n7jRwu{qZJ}5da)RwI{c-ME|)B-Bwl}M$M=;+w1E6)DwXj}dK zXeUaY9vB`T;{5}CsI0645nx(I2>h5exVv_PWxPVf4+A42NKHe^G%)>+m584=7d8L( zNu(SH(6nNrgn-Osz=S~Z51Yo~4aPdc+109nXf%#LZrP+X&bKVNVaetbPQcAK+keOtS!nh!AKR(v=mMdgmP=E!z;O z{on^s@lPLtBPEEjv6#RZ0$qn&TaB4Nxxc7oR%nobP*XJtuIr%X#TG6}esdx(d-y~q z8(b~v>gvLw-X7FcO#%a8m?lUe2Y$>QVt;=*VxRdmMqC%rG)O5C5MeYPgT3Ge3=9pS zufGp{eSPTf?+3r~3eZItz?C9fEi#4-5!BgpFyrn!!3?9I^)U;`*8Q<)94#-lNY1sF z7B9H@sfl3HCNlY%XEuynb=4J9`ult5o;UY=?gu{nzz63*AOrw{QVPBw!1q0JW&r>YXtbic=MWw2=|XLF9XMyu4FekI zg@BkRLJ`5b@U)amH$>&4F>eo#Wn^A<0@<&BAA(T|0Im{oDB+2dJrNEje{#!DJRf`ua z{omuka9ji|Sg;_ifKR;f`WDsJz8ej7lVMvn7=Vg+3?McJT#dJcFwk>rT>gh)J~# zh(==g^>3aIT*rOgO$WCe?{A#676Q1W6f?n9(Ez5$Y>*b+`vOqjuiN^ZL*s*IHo_%(M zPg1^X@#3Z1PQ~F0zirfx@f-ty1;EUU>$+yw zf$nuPXPtg&+n(Kx=bU}6R$WyK$4Nnvf*rA;h~WD{A?;bVl`VuyU$NvqR#sG_sbLDb zx)0!yM;<~dmA>t^TbDnWdxpI5@LP#LB>_AK+$=Mi0Ib2mLB4Nq$M0sHG4qn$ZM*8{ zob`9SuC^X-CW9adVC8(?_dJkNunPo?*ZicKIyBTZp`&vj9((Lj8XiupUb*~^`$C}e zV_w*?kf2Ra>qf}z!%`q4kx1}eJ9n=?^Q_tPw(r>5FmvWC-qbJ|j4`+w2fD5y8jV09 z+g#O4Vt~dpOlg{ms>&K{d1Eu4dg@8^_V(R<=c>CN2m#FtFY~L730Z@7l)fG|xjYG_ zQXnLmOyadaY+5(_%vp`QcI}*5Q5j>?PM(2ytOAbfKq>{xvc`drMPoR5>U40%@yxp4 z(n~MBh>ni^%fJ7*oN8GGpm}snCfgAe{G)2)2yN z6y#$c`^b6o&VR>^hH1>4J$p8SK%l+79U0Ht((?Sq6>HaSXbWkzRJ&m!4o3=2w3s>8 z0;n8#euOl|05H=u`4_+V@Bc9M#D@0<(r5&);i#L|HA}7 zjJCB9=+d#=ecvpYmHN6mUeG6!fO6M6905ha@i1wtlz>u8Ap8j)_^sTIbU(t|+grQ+ YAC7g%+W9U!!T@!W=a-;y{uYwl;bY4e@Xk7X*=Q6ePxx5MqGjfF9{2lEnn+&{;a2gif#N z?QON(W&WtD_v&@OPP(%(=gizb_kC5jZdHB1-}l|`E_ItoDe-?f(YITHw>$km0dKbg zZ+BAPj+d@lwJKsnwUk2XQUUo4Q^Y-YeEp7&w?h|lzJuU*?)%QQD#b&D(y5nRvPjvx zcMr?w^HNIkV+!Rv%a$$cI-mNSHv(3#Ufl?Ve_smuv4s~e6jv?2h8ji$oO2vF*oqfk z+{A3#;ZpJkRLZ`4>#a?F=R>b^PQco=Yn8V414{`Z-%ciz+DAWfqgG$v0LB^e`7CtZ zfT2ggIK%$dH}S$tn;2uv6@uR{xw0meN)4P#{mv-?t5@H1DN&S1q?8N(?wV`q!i9eY zN+|OAEG*k9)Ke4%k%$RHH^7*SmVGVQyyZp480Ql532^qniWPUgelB!8Cj_iseb1$m zD$5Dv4YOy@5g+{fe^g8}2FJ0H%V!~^00Hr9OGrKD-$`tpiE3eTePi}+|0=Zlo zE@L1B5JDoIPQx$^L?RIYJ`K{73RMt|#$f0Mgb?WM>qhg|SNVYh2Ph$=TL}4pV0d`t z%9Xumtn`@@uxiz+NF=6zjuNt52r+BHg$wxQ@BbU6s;UM6khgNkTR9LA2q}=u<&e#0 zA*DoBWfh{)C_Eh`q%0+Z5`sv?M8t@KQi@C_jXisJW83y^jB_p}$WxNwhpAgrubp=S z)~s1oFQ9#y5c)MKW%ANRmyt^@Sw!No1i0X^@;O+J1xU}u^Z7h-xg4Yr2)w_tvJw#^ zS^^p}OoVqY0if#!qR|*MRfFR?Xlpx&SDXLn_Vx8?3Z?s*5D#k9eR86`$Ak!2vt~_9 z2>W_MmCs7Zt5sE%AGqR5^`eU|M#PAKF&DXf7Pe!90FVG|%SJ9A04F8St4vnHFbtGh ze>4G}^vX3&gBdYl7*PPgz+gZ2?EN!#?b^vW=L8bZap2)O7tDEKJh9@G1gu)MO4UvM zT7}}%koYJ7W8U0(;@$6lk1}~uBUDv`?O4d=vT$9;2Pt9O4lK)p5CX&pPJj{;DiRei z4C9m@5N;x#lpus68Zlu;O{l5{*L868t)tk!eJeY5?3hXk?d1?Z1EW7rrBVkcOu)Ts z?tLGX@>7(OPYEF_r%#)~7A;z&PMbCzhVBhu@>UL(odaVWgaA@V*tQMZaf&Ypz=wbb zJwQAjhi>RV0T@P;F_M6gHw0v8x`9|EhG^6T0Hia+XxaA$wr$(WY}-~9N}D+&Us(@UkY}a`(b=&P<9f`H< zWJpRGPbA{@XFv0=hN`Hr>^x5N_ZEU0Ap}AQFvj6B7lLsQY&eHV0Eo{4Da3~1oQuxE zG*neZZ8Cz&n2z9LK!T@Ci73@`<1c|Ka2eWQ;chJp}^ti|zzXAhyzGO%FYbR6up(Atqk->{90#o#glmkDGn zhQ47NtsQ9`?6EL^?lg1`6Rduw1)024#{Ff;_~otwkOaD>qpQ0Mgpk&zrY37t#jyzR zo+5W0?>r7wQ9&t%rmAItk^p^ylc0R>;UWC=cgJw?f|*D&1&6vaU|fI;2`&T}mtexr z+$-Zkf^mUET^S5B1sBbmf$#tKA?!MEA{6`z`i0OU)N^>Jx~75&p`7aj_rNkP@!q-BxMD#a zrc_740z$Yf)EmmVXz9q{!uiv&X-5x+vUUOK$d(|>xWDGlBaR$tCz6n|?f;|%NMKh_ zPq)fAgQgi!6{W=83sw(N68!!2`8Ld*GX<^3hCHit3GM?7z+OJT7K`6mk7>2$sB6Xg z0`Me(hh1fY^0;rU`q?9z9%|O?@E{ZA?BT$E6 zdzZHSxeJpg)!=Yf7B1snSIGq!FIt%iQLvd1rQn$l+~q+x%hA@AMMHfJUfR(a!YoVV zNb~8sfq{X30EFf9tZV>0DFOLBKR^i0_xGRh2!OY6Q3}5FWH94kd+RV5(J-8|!F&Q3 zV{n<*eR`lo!GF1saQ(7!bs6K{vxti3ef=27*aa&Wr5qu>0NB~x3968NO-)S>#z
    j81prOeMtMNV zAVmW0-8p2eBG|x!Mc~}CuFDG`I2Q$yT*gB6O7CZkBV%#2b!Pq7jkG!nQrC1p03IPA zWX$#toZ`Cxp>li2@s6dOGZ;n`j^lt5g5oT_NJ7qHFmxT=176#wlz;|30}Td6K>#h< zi~Al>01%o7Na2n7g_ICNqI)2Vn4uwKxriBRDG4Y_(~M(ico0GeDj9j{WEfBC0Ys?J z0dTvzIuSSHkdRPR#hbNxKOPbZ^bT536a~XMr_}NxxA)Ei5AfdMHGz-^FkaFe!k#dk zbD&Taz5V%7-~*3Rs5eb+X?a5uN}5xtRQqWYuzdOQGzfmPbN5cBX*zVxfT9+gfj?J+ zghbzv1xEmm;|IDDHx9}?V2;bcgf|R!9Iu`efOc8wJ^r&8<8T}Xn@RKzbv^!*@yo06;SN_`ZEDs^i#*nQ;(8peWRH(NK0d54GjsI27F6QZQM| z1puUTP62edPJxVq=LF9dU@W{^R5BPuJeELb*Ksh$TtNBt851yT);l&+O8eT697fEH z0}_5SC?%jeVL)=`_4oda(Jg5PtPlhpmm!n$2pIMWa9kD&f~EH|<`KcT00cu#QZMZS z;WbHJGoWiacJ1ED2(WJX^5y9>CSb{uC0q#p*w(GhuA(T2M59nB1)=a`fJZ=0LWgD9 zpb#UhSOmmE-jK=r1Z3@!x&@1eJ;(P93IW@3P+J)-ERY1?0U#cW!*Oi1w7j88As;&x zHej4zhZRDe?CS2iEu9%g+)N;!&p}lbxPle@uOgg87ae$QKY^GH8jR_p}=K;h*v;geipYH%G3l`*a8_C9zbftZ=VfrG7}3hmCN?JeWM zHm>~vx7~L8UP@`p{{5}ejK)AIfugE~E-GjSldE;8klw(@Z~tYZyUVfT&2DUHZbR=t zwyd`Vy+sfQn9HF+qOsa21ibLFSR`sfQ4}<9Yi5G;N1K|O#91Q%0EFa^G;e*C1ArNg zgAi|MT#N$(*Izyj%+4WdD4{kSYS)Fq&WPX`oR_QXKPPG^;7$%7TRf{601l(Z{x_}fClWU^5Xqt(bCPAct;2fNB za9=WB9N(||)^+&(155CUYvz^o^^CKUdj#hoQXr;DESy<^DRpLX*yDrOH61ZCjy-$+ zEU2RFT6ycrH_ti&%a$$cl7u|DdCQAT*9|0M34jo&TDU0)eDa!^0MDbsR3SKr5FUt; zS=SWkssajG_Imi~8ZohX%S((<@=|J9YSTF*;PzW?@03#9v*G#m41^$AQ3WX_ z3`6rgKnPftjfBpyXm$h!u@R4`kV1rjdEl;E`d?W1>4)&}vpapTtfY<<0*R=K2zBuO z3oDR}a#)s)!q`)KvytkmTJ-dGPpN=+R%xOh(@3i?*j%8f#$x&RRTmb0)sf1UBj{Tx&}m_+WQ1KuyptC-CHkt&!woV zorI3gBTzLB@kAV|s>0DV=(-Enbr4}L=EqFDV|pbR?a3B=-Y3=Ix>nqOG+hgAjsjxw;OlTWmH7_n{}4hjsi6^$ZR4q@f5C;2 z-(I==_R|IroZ(*KrlzJ0ck!Wv2lwaxv}2pBuBt`MjDY}1B;tU-FGxrMDZJ655TcNS z&)=m>EB;w{)yXffubl){(Xe*i)68+5&34}X#+m33oQ2KOsZ^?sOMc@kue>ae9BW5I zT_ZG22UQd#k_qpNxA4~V0x}AuNKvw;fN(A$L!vTKi9|e!mtWb!yL)<$>x%O)Y#> zDl3yv6~!A72CKZ~tX^1PDUwlyL(5!R%psus1?^>}07U$9}r zdi3`8-Sxfu?tcOR2f)fm27t*4_Uq#!fDl5Cch6 z+IpNA=)s8rZx5rC5}8Z}nx+-D$_7cH3MSQ0K|Geg?mav4;)^fHqwUA;`tgq+TsIPI znR5ofod^l1B*3?P08&GF@T163RaO7mE&qN?eM8-i*M0apGJoDh$Xhua@9qF&ZrOK5 zBT+O?ng#;k_kVayhnKNg6 zaqirC_~1W$h-#XKz7std9PTfy=uoPlrm7Crl{FX|9>lNLJ;VC?`m7y0ci+A4nRU%R zFn0nZjN1z)>H!nY3IO%$s~0a=eD&fxev^) zbkowBn(FIj%$UKiT70!qU)KOBB|473g%@7j#QXaCXh%oq&wlcw2Osmk?3^^YufxdbLI%fm~3xvS1ikV?N8fYyMN=xP5S@{ zA7CKEnTmzN+3d#0}y8e@F<;Kq~AI|2XO(*FPtV<1TPjfvs_0000< KMNUMnLSTYZJf;!= diff --git a/gfx/tray-no-updates.png b/gfx/tray-no-updates.png deleted file mode 100644 index d088ae6e394848024643536cfe03ae16cfc23d34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5145 zcmV+!6z1!RP)#;^TbJ6-*ivgdU7T9S4;_`T2-wsP zv;~)Ht!o*pbwtp*)RvD*h#~=rErfjwfe3*>NXhcvyZbq3{&-97dwG!ru${Kve14pF z@4NTi`~Cjb^E(&dlkJo3lkJ~*BY%sVu2`{x)g7q4i%`rbz~h?Y{p`*=%Uk~`2w3#M zqEQ;?3m{~|lqsKP)z#I$<2aTO;>V8V{i?jY-2R6opuD_X2}P7U0Q&Q@&mK;%yY>bp zWQ5@RKDKS&g4LB3TngDDz<II6mrY@Y z9)fLKuxt}jN&tYOs0f9^P!$!f=VH&E-B?|@%5`0r0(gxB58hLD&-;Hj1T0>>Z~`d3 zM@spxLx&FYuby_bT3p-cPHQ#E*=hXeI>So7Yy?uip8 zRLbakLhy%5hmHEfO*h@d|6dZYc=4itA(Y3b7gG`Q$GK4~5=$Z~8B$}I>@P76CV$Yu4gi?BxbN@lf+0rxN9;Z#f zlTSXWwzM~Yg;6$>b3SSK*`?m+K6km=w@*I+fNh(w94iCPGEKx22?!xjQe1*iD3o#q z2`RIQpoBozLkJmRP)dHE+{joq#1v%KHhZw^G7p z2r2rG8#hi~I(Z5$DeeV8!m=$`wgpH53BWW>Se6ATMCPtV#l;Bep)AmlK_WWbL)UeL zLJ_En3eWdYUw;5qRcqX)$f*7`m?KXg?nT5;Ap;s;USZ5$Jl- zb=ulnv18|U`N0R(p6j{_CG=e``4f)mzgk{i?w=6?l0l7phY<2DA!I@6@KSlSOBM+vW%(W1KlxpU#se5}=+Hs@XyF`; z9WxHMeRl@Jkw^e8@=%c47ZM3GhD0I;rYI;bEWwbohCy(_g~aZBSZRL8AiEL?lSwJj z+TMbu=A(!wV(_^K&-Gv?5@>I4hh?RGoPrPv8YF-c(Dd=tXG#bNrJ$685}IToquCDA zpEdu7_|Lgtz^I7@xb^m%@yxSN!t=Z?VCO&N`yPDXgX=kPTt@?;JGxB(m)OlYXO3e- zVG5*_Xm5`p))s?lnefu4PLew9&^}Fp4w67p1f{^IMnWlM$^wGE{l}HR$K=nB0Wsnj zc#g!p2fqqZa2(UW`6Xsu zl1@TWrkrK|Db1(%X%2XrJ{AmW06f>jZ=Qb&pS}8Am`*EP-$I*p5aT9CvEZTU_~qk^ zJHeHC)Sq@GRngGe+6qF5HGB5#L)|9euDi-lFveP2TU((jYHGs5@`CL+nC2vh2ugEE zpcyv+A(@ATlz8rirMTwHlVI`V5Q1mK;|}Wg9>eI7V>@d<5I2MIgb)HnQP6z+I4B`| z2_drkF(CPSdz+h&gHi@U37EnHn$PGzNAq1+1P#Q9bZnp$L?+XighX4c9jo76iBDZN z1hy9k7d#^xEy9aS*WivH+?}KSuFYRjlZtCN+`zdIHC^HCk^te0s`>-_y|gbe%F+rB zXg(`*01FCrWc=V)Jc(tf6N z)^rFVP+xz55J}$aF#(c_s>4T)D8BE*&QXuiNf>kq~2 z3SBcmNZJj$C?iRBokz01=!g*=WYE+(5=$Ps4`2D##b~pRf^!bRliFuQ!`ioM@y+Sq zgQBp&yZ~9+&aNJl$92uX(PNFElpdQkYe8L)379#vyqQr}-`IEh^IdWaUTA zbLdBX$pwF>c3&;0ltNRqP6T9`pbX@n;BIg)9rUDx5E4=fEPmiVT>tfnh?&R11HP}a z5LUgi19#83CkuSKjh0XA=^N^r0VxIc?%5+Hu=bP*Ad2%$aJ4%c%P$;n%% zOn|1jZ*b1#@#ZE(LXl*ek~2!|r5t=%grA)DvUoxA^(3Appl z@>US6*|T?-&~*chu`D-`0qsk4Xm~++89x8z(YR~jHQ2O!73P(f!Sy`I6nG&de*cG8 zaQ-EO;FH#@v?qi>(;*ijr7zAIaZYAhoDY03CZtI+jAW|()1Rw-A+hXay$*V^6QsoQ zO`A4KAq2ukB$>V_$!pqDO8n-zr!jO)7`=zNXpYxm+E+_)_IL%;Z@B>t4Tm6vfbH0L z{>7(p$kQv%az0~Z`^@uL_rM&hR1CgP5}zJ;1C zoABK8Pvg>Q!;x@PC2uP2NeS%V*@p8*UxeNzy*pxyL?;W#N`a~PKvP|!y1H6WN_Ul& zEjV!61k9Q>>nI3$f9LKU(l87#ra)md(*X(wx)m=!i>q%s7cui#5)@DRb;4ToxUf2tcYbG_HE_qoLt6$rT+rB>|plM_g5j6iGcmN28qX2*n8{YRh z7yr|pb|3A|Nm7c3tE)G__k9#Zi-1&76!d#3C2qW7I#xXOC#ZfO5U{MY=J^&(c?38A z*96=$<08b&>B72&E@#jszg0i3EnFl^VYoiX0g|Z48?)zvrkHRL$;Q3D0 zcSMBo!RiLwa`U(I0?(Lyuu~kU4Rj*}Rn<_new`0sS$CJ)yG1~GdAZNIc>KM!@A;Ha zgpDXD0cch%5RgJ((BQN1*u&3Y{U48_w#G(CE6j3-4)HVEXH-S?s>AsHcV>W5766(H zylV?6j20pukD(l`l8IP)opt$VqoR6aC$|f+PDJOr1KdQ&H6kxC~SPGTr%65e`SOdCMljDBUvm z?zuH*oPhav&p#wVmRGEP+t)P%k#GbA1ggpct{@nW$Pd9gc?a9e16>}RJ z8gTSjBT9;Tg8)!94N@Re;7BP0p9QX(b}jDs?tHxTt37bq3=q(OI|#Hj3rH)9@#kL< z)O~*7$hClE-5&`@QMIm$Q_9xQDVzWL$40=+ne#t{l)tX1c+*!^Et7V1L(Nz~5WElq zoO6sEF%k>!eHg1=Xhd^80i{Z6!lPr|8;$tk9dlusCTz=sZQF2N7ryUjEUCjP0yB@) z=aQmcNF?H@soBVglyiEz#z}j6fyd;cBaKJp;l>8^D((YH2^3WYqckmBqh8IFR2Ld4?9^Ahm{5{U#7i8vC81WeO{ z|g37lm+ow*uBDBA*?$QeTOYXa_1MYK7oG=;NHyyyHb^B1eIgTHE?@lnv;CUW= z&rhYx%LTFIp)_X zBgG>}j3x;y0WLTI0^7DT56?NzxB>S$d?CPvkFlf9!_a|aG4+aTP!KIlMsw29RwFdk zS)%EFB2pdZ!-G-JjL2VC4AlfR0tt5onXo+7-h*hgpwjdRiUa1q6HCzLLq3H23^;oX)1JG zgQjUvR27=0K~)uKs+wGvpcD#KFnGWa9B*#ItFQeIlE~@v=iR&GRB{dTNlsoO&@?q`6*=b}imXZy0Q&an z56*q8c=<(62=1R2?2a<+tw|jwr(%_^%)35H$VUsL?eJC5K=&- z%48`zsy6^&lz_3+Izg)KF0;C7>1IeW_xJAA58+S*e^~j3XPMSkE8*RHy6-r#)BSVKiEZ{(T2x*Pb1C=bcJda{jqFbLQ1 zH`Y{LJo&;2`|4_kj~_pQ78jNvX2v0zmyD~J?eK)=B_ z)Nl|lzq|sD<=i%J-j6EI)Vq!B6t7VM=m4~|SeB(V96C}la@0AO)$ZHdfBg9uu;QX# zFwHoG6fi;tgp_byFEiQE4IPT2bY5af?G_dkV?e(_XgG2RFTC(P;_<|N_x*U`v#DoD z3+=QF@i7rVQ^2)6qXt0#%U}LN5A3ghYt-nGm+r0I(|6pt=g~gB`ogkpc%BD6<@2uN zKnejPLqKQE_b%y!etia@{@?*DU%pJXw6rey>B65s833Ig(?U*#1lB{Xs{ykQN`{Qq z)>gV__ukcG&mA*q=dSJjMvfds2lN{VLI^C|grYEn!yyPHo2yDr3}A#|(15`xDlEa4 zZ8doP^;dE1Sko`=U;N<8$m};<_$bSM`4N@X}%Ci4!L#wX~g(BT7e--X(n?gn;8(ndhXGqED}W=-+n` z+S^<4!m{W6`uY#;nwl;1p8L&jD^e#4WUWJWDIz6j)CFiBf9sB5)5erWO4LA!0(IWW1hmaA*Sp$c{Fhbb5YdcoFv|O~dwblOarB`RHu2{VT01t@h zLh_x{?NruX0&-2Bb+I2DGcs)0u%fTs{BJXgi;Ax*9Wg>&dBv5qq@*{blxRG57;nA( zrr&g|i5@=Oxb)XgEq&IqEH?$n&okzJ&J}s42?*x>lY-6TG8wt?#_K;d>B5OKRZSf^ zX3Q9Po{ze^I@pf0rE1OEMXOd-)&{hitKA?GU6CStTFjhk0hA9sJxQ7(0Enh(^wwMd z{fmQ#4808i4jw%C=o61UwKB)oMUF}Hj}ZS<>wwe!4->QtZL z&}Wi>e81Nf0a?MZi?o$XK&~Z7d<+l#*W6BaKZ#GazwY*bC7<|zLCnw)00000NkvXX Hu0mjf4wj#5 diff --git a/gfx/tray-updates.png b/gfx/tray-updates.png deleted file mode 100644 index 908cb5f0b479da985c4fdfe5682dd41fa76f6eaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4242 zcmV;D5N+>?P)1Z&ttu%LmH`%Ww0-eiawpym_(=>z-kC=x2?e_Ne!fzx2?d|Py zEFu3Bz`u6ol~?gkf9j9rm>z@UI5=={KelytxFl#)!2OB@?a8*bw%l(F0bhM|?H@?s z-z1>*)1Ueb|L}sVA%qLV$V1gMsEP*DEMV^&d$4n7mn#HiiRe*s*|%4%S~dD>OTfDI z>z2q2-w>e1H!i+O+(^cn&L1SAKfB_Jxy~nl|C35xT>~7~K|Y^_<2qpFOB1NLf-K9> z^*B^Tg>Bn7HqejlufAf9jEpE;;;#zf{!8oJ1wXszo_pN?mjtX|zwY-K=MTHWy>rf- zInJGT+@-Y4oCP9+VdP+1CKv+*5we*qR8@tp>lGTPxR$ttSS$`r)gT06c=#-KckdRx zy+;`5{Iu&jkC7{FycFSa(F8pC1AtP{_kD zjWReRpGP*AgAfAsb@hnFVqPc^h=N3L#-M32#Pm2g=g8%U{^?8Z&zb2xODT?acw&XTt(V}Y*kHsN`i@cFX!88COfB{CnP)vA&02aJlU2PpS zO$&KHiU0z6$0&+|xSoKf6+>riJdHy=2k95T=(a7(k~!nAxa2-z=AA9=?d{GbA)uJl z*cTXMe<=i|TCZxQ8*aRb&zW@@6h(n$naCG%uuRhfNia*u z?ScyMhe&ZvV2mTC#}SXkAA>{v9v0}yGlnL0d zVePdpu|JU{{ui$6E^KUUvOadx&1!4wyt22ALLNpT565vm+=PN@!L&>iU55&IAMjEI zNG6j|H5DiWLp2#;0(@#Hk)bFm;;{tcu{Z#ROlAx{M|#lR{hC!M6lBhLr*PdzR<2yr z6~-w?HZJS`d4o$>)=*z>E?#_tHgDdCP?M@v0ia+S7#ST#!76}xz--5bWtwmt2aK^I zKvoUDv_G);z?WI`*8bP>alsP-0G4gSvP`7MM-bB!NW>Gk`KDX3_@g(fLqjL=ljpX4 zykHmu047HO17oS0l=U}X_&ber4$~@NYtO&kj0TP&} z{7UsNepd0g4`Vs*tMEs0=YKBTn3UXqpqeNmtQs)!WFI{9ErjzM+XKwoXh1U zB0_q66q)Q87#IWuge~AWHf+ZMW84GGJpzg`9wec-zYLxENB|3ZmMT6bf0Gn|N*87V zfaBP392=Hx!n8~kj31gb0WRSPxvpfI1;~;NB0?sU1(67P*#j2#e#!Fz68zx3kf4A9 zeDV%?KNu#Jk1HF&;3%D_C@QkKY>{fgdZMuMsGYiO9R`3*E(1kTe8Oc_#ylwpiQztV zFmT4eI1j8jV_^QIR=V#%>8pkoh8z89@kNnUq|<3I#*7s!R-BkL0r%hEJ|am{I-O2K zkri*iB1M9&>@0B-B7*Y}3B`S!bAYiB@Cfh}wT@PaKc6thAj>j_&z%Ej>?mW5CQX3% zeMg6f&w+CZj5A2GqT>cn z4!W)o`zFFUApyb>T?5D7wo9=jajE2BpXURWBlPDZ2^B?f#=$)jh*dyW8ldX3Sf(VL z1bix}^bcO^tZEQKU|`@FW5iyaG6BRz*U3|-WXEx!t2!7j0cPQn>C5nyFu?f~;gL`* zr(Oj372xxH33RpMC(aN6LDyo)WX9n*4rk1rIspoEb`TNLV`*rr4#rAhFhLv1f_+|~ z)S;3iDr9i)m=b7TC+P1A%iu%#fezY3zgr9{ZXBa52O#Ye;)#}r%-c55m%}xLXj0nl7zSV-*QP%=lRAt{Cpp} z!hN~#tv;7?4pmmG2na}!5J*-OxIGGanji#$NK|5aKM9F}d#r7f&dZpegHTo zP{0JBOP_Pb5RWC$*LRdSV{fclwd(C@6L8;s?P)M%~0Xqpa5k^*5sz(IYoG#@0wGmNFaG_Z(IXMKH%rvt-v`e5;kLGij$JeX z%a<=d4aRo&963a~u0xV!$PzEl0O33&2r7D=N|F~Ic#jAX02~Bb@pSOLU;g0^F&<9> z0A71-x8u6v-zPKO$0u_Tk@(l{?$_Wr4pPZlz-x*k(+$mMg6uG$+f83Bcy{bM3J*WcfVWHJTD07;g868D1_KJX$4 zUIbM@6wrTFB|*e+nf$|LUvHr4F(`_Pu3bAF08dZ$ar>kQXm4+KTvt5)>W)_(&N$+F z5}W}%kPCzd%uj?*@*=DPFFYplekAaT6;P9`K{lJgz`)zG;OyTfJJru8d!Q@R#?jFc zes1_IYHDgh1gM(g15Xoxr*gup5K*cCp*-UE{zSk7!{yS!#r5ZI=UZ7(^Rsv{9kfPq0#q(HV8Wfcft`J)Q(QUWXy=kF^C!K4}q9Dxxd zflyyN1BQ`D*Um2PlKZ8pJnZ39IauLh)!^VDPM;Ynvei+gcVTi`xEgbx^{NCoJ+e_wyk;YJtJV*vNi93=zARp?;=CgDa3}~0051_yt`=iK72n6>NyK9byt2L1VT|oq zzWl)*?>PZ$9$0fifF9kl<;M;HG}JW~XJBGlrQ`D_K|vwlRJQWqr>d9m&k0oTBNU$v zHZ?Tk)X+&B>^aEDb^dWWPr3PYPD*I0NAgB~p!@aRq9#=bRn@^bhaQWSGd>06Ur|K4 zJ1l!YV%`7~5aD}1*ibhEU<^O~=@y58^($9CeBgZ}VCmAOCS36kU0pkPdTbQUjV<6{ zP!t7QD9;uJVHRFWTH6YtF5WW-hF#0lgSR7IeXo7f9Jrbd*X@} ztG5#9N1HcqvN>aDYHR_45R1paC0^_c{GFf(#=am?-3Ep{9hi6Uh>*C9mZsS_bM`bk zJ3AmC{t>XumCfgXCar*LJ&bwWmsmxYm};|%v3dcqP1#vnFw{Y4VY2igdJVm>A=A^v%+C_ zKJ?H-!@qI@0H9-Q=j(Uh{fT7H;hvkXyXHDpS6h#4ZoD|JsHrebt1!iBc2ITWu2olg^Is_3c%PyBa zP1hjHa`ht??`=)04lT{IF?i|(o_gws$Yyh2{_-Phzwg~c$#~Uci1&y9?g3XL)+zw) z-FM&R$KD=zalwb@-*U9Cw`tKweupMxv>QU z$B$vtrl)CiG`-;~YrpoS4|Hi=GBzC&q$zq`@yXtAWiry~H19ofblcS*S-808@WJN! z^B3@z=2>8j!6@V*%M#-87zB!wt8yp@NKC@)mN}@csmJ~U`|#XzTX5#g*>60${;`cd zpe5rGzuK6R8l*|ax?gf762ev{B$LTt&oB3OEWCQb%--H3^HVhmHuv&YBois*jXYc- zplMna_(VK`%jaAP&NyD`c!759+KGXIch-LEo8Q@lsr{()k`llpVoth{S(e3icJ1!I zs&#IDWMpLV=-3F&Yn{(#)Hgy10n;+d_sKa&V?#4$HqFNPcp6VV{X=J9;GM$0efwAc z;6MMX!#i-|)-h);j>#VLn>Jd$FUL9 z9&q-hXA-f6BAg}F_SK3lO-T5d1-?8{&m^r z&YfHPxzGRk(z@EZyIbeY6L;Nl7q73M0V2ZCnUi?&r5BvDXU_7ICx0A#B@0e}6v;rn$ds`;K*6 zw|4gVyc+hdpNNS_p{X`A(`|sF!1D`~DF%S4s><)Z_pknF&gEBp5de-KKmM&JzVqFm zhhklXB<-HZoay!f7yAzrd;)JvKG5NH)OF97%)+rQE*A8qBp~YhCL$n^949DSVFJQR oAiM`R{C+MMx*p+!<^5g$4+gTQh6+%(K>z>%07*qoM6N<$f{)|ui~s-t diff --git a/gfx/tray-working.png b/gfx/tray-working.png deleted file mode 100644 index f5b441f81b2ff9ddc4e4aa1253fa11744c181318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5636 zcmV+f7W?UmP)(6mL)IRZLPglSJi!gbW3h6UU4#8 zZl9lSch{}1`hI`Q{oUU!!5`Zn+aKG1=O+F=F8aa?FKG1*bzc*bZwUCgsb|0U*MGgT z`@aPN5C8qcQ%&Tv2yw;2g^RSBni?mQ$)r5b`*tRk{pre;E7Sia30S#urS1>v{}1H% zCrp?qZ~xS1bidD!<2dZzvy*k}*SgA6T^{atHLS;$FJGScFGIlhe(=z(8uCX9Cf)w2 zPs?djFT?X(QmG`SWnmf?nM|5(JGQcEQ?=`PDz23JfpW!9A9&z_uK%)fic&SlQ zJ{qMIsZ@fDok0ljlp@|2$23iRKHn)CRIb;ghTk8+GA%q$apFWfTWYp=2M+8PQp#4> zb$+N^?eUA@9v_>4#~ypk=;}T3KQyV`>$>ioi4!JeZ@A$`qpWlk0O@p+R3k61K@-|x@6fc%=B(>Fo>J;*q12-*Ry?@v z4^F@%kE|T!VSHH%?W>;h%BD}BuCATGP{yLgfFhMnkxHjPc_<*6Op;2aP@Xq%)uLz= zzvUkU8dXTdDfh4}3%@^zp&MkKERBr~R9C-aw|8`yQp&x`bszOS?bqjP72^CrKN575 zeWxbn-Abuz48wF5EnH+wpFWd-KY-`CBvVP!nG`4m0#eCzF5r0z#Nf+Ci=tSTHAMR( z5ui}{F@|9f@CC7~oa^-TcC)v3kNV()nyhWxx)gGwtK3I3N$2I2D_1%fg@9a86JHcU z+~s*HJZa)2HFw_CvTF1g48y>-GbGaq>`W#PQjy8nq%&ze*F)ri3m8N~I2^%eS!cC? zLKn&P3LzwZUx0u=fUX;4vo^bmaF@$`SW@4owvpEm)IJo3;i zSBXE>H2HbgbuTR~Ewit=dcHYn(&Pbcr_xDM=_HQh=5Z_18JmoqA*VV{fiD2wKLdn9 zAxz7J0bmR#V<-Uy*3eIeVVDH`K?42&An5Dsp>}^QH8t2z9`Laz5*_uKd1|BdRQ zIQ0<|msNlFh^x4_I2OyynKRd#JoyqL;UW_tok`Kzb%L~=M&yBI9Tz*3!Eqdf5IKNi zIQahW2ekt51FYry!oLIK2A>Fkoy}m|8M=Er@%w@V13~6ry?{Aa%`;nCnt0{amv2m` zQjNg55g-sE90}X^eDSX=DJ2;@O;2wZ$#fFse!vspaXMIdtE`(+RbB5(OQ z-S@@g1Ok49IHmCdj01i@4F5>n6@K;26OF_eJ7zqd>$#p{|43Nn$c`cQ zB@#(ZDMfd07wsoni6{DS+$>o;OEQt5x3`y6s^7;YLP%sG0a74^#Pbxtd-E+`e)YGx z<5Kd$0}TWeq-$QATMpbdpP z^3mKMLpSN}?nVfay6?XGj-4|BU;En1PEFIgySuwFbR)lD(MAM&>dSsk1`|;dD@IB| zX-NqO>h`gxb{G2(?xU-xlP}%Ga##B~Py?OJ9;2APQD28GmZvMKFQ{3^UI(-Gy@s~74qVqk*L7mi7}c9U;N~SaQ8~Jj z*47TfkqDmh2>5->oH-pS#Xu(5kES2=aEm{EgaC!l^3&JXi{m&_2>1L6Fog4-Qi|@L zZY5dCg&nlw_JdNcF#%lQ1VJJ|fe2l;4h5DbQ}vsp~jpuB7pLJEAAFBfE`Wc#+A z{PW{aXWqA;D1<<_&6?6s?`W^V*bzRb_G$1exgS4IE3;%N&PyhN^-q}>m?3uH$vl&d&q`Rw&g$u5sw6qi< zwZZ1!p9YU)`Xl(hLSg6znx=86{*bFYwf;=&9Q{lOUC-T6cc^aM%o(#aQ#bKEk1Wox z2}vMM-HXU+?;n2rGd^|OCuwVIrKF^kL^4jsN%Og7cc4(TpKL)&iKgpp+43QQV2ESK zk6{`*KmO^Xj2$x;+s^RWJN|SK_yLy~LF@hZV3|IY@;G?lfKu?@nJ~&TE)|v7*wAno z&+{-XA2L6;57oWu&*btqApk?yiN#_Zs&7CjNl{T0r98TNPSVrch4K`pVX}Es4YOv? zA{+^`WbyTU^wAD(y#9J_zG*QT+s*+Vv?v-0{NQ-t^ZDuR>&4F6x^l(a7fgU@+ONB= zt2$1!6Z8jjJULPb0{$R% zbqAFcV#fmyJaG6-7_~DUeEaQ<>7}GUW5W1xRBzf$I+^6nH`h^Hdw}ZAHC%q_r33r{Hy2D($>uJ<41`ndI^R? zeB!!AJo&3HGXFuYpcFD+ zCEB;|Bczo3mf!ne!&&j2ZNQ2ZD_Rj^OYQ!>%IEW;X*#+l2P#0E!2*)06feH?3NO9# zI!`?P3|G#cO<73^@nnK6H6M~nWw5guG)*HGi}CI|TbMXu0u4uwf|B_CezJ~DFc{#v zMb}~)<{P9m9bd}j9Xi$*{?k$p)i)lpwxM<^6V z2+;IgoxmFg-osNKN-07CKXrA7XlQ7_G<1$1Z=$w#KMUv2W7h2HG&CMTH%tt}z;Uwt z`DbqDCqMfIzxlUUnQ{4a9M{3LEP8sn`ShRMMq}eKJg*=lEXWNkpC7|8souQF0iHY8 z?RM>425sE9(ObM^aj3ncebL;j=E-a}i{se1p2}&2g4`W=@ugR3YwzHtM zijI@*6vv8~a>*q$G&FLkzLCnR3dWA9LN{_%-B>Kf;u~*d&Q(`%va16G7@Enp?Yq!5 zo%)8u%$s-Bh!#*BEy2#%tXccERGPeJ-RgC%7tI0yTwOih)zv9GPP7w=6rmKDmXX)I zmpA*IRw~LXm~r`K+;qcrbatMkt)qqJ);7|q47Ou4WBTRn*tv_PH{3}5p~DnKq67i~ zQkf*J?M-x?Y{T_jOw(d-?LI0-mlG}uaoepo=dQ=8ig5p0BM=C&W9K$clXB++fAhfh zbH#Pe1bpLfzHv+;o?p9ewPTq+f`K3cfnjI`uHcc*WN2w?!^t|7l#~*W_tDyZl3Q=S znSBQjQ52362n8r9Dds!h{XPxHj_|~jzrwa%BH<{ZU>LtIfKY<{wFh{w`hCWYsbuu% zaw;n;P6fb%T4JoIgj6a?^`>g+D)(>CXR}8;pTW1@a^pumy?tMuJoyq?94nzO-h`ZoG1*d5msgkMl2{oV-r3-`wY9x} z|MCY{{N4yyy?TAm(xro^6)NCP{QrmM4u@ngp_e%x59 zs;c{gjoIW7{^bz5a@naOave>yDleCY|$aSxr6M+|qhaQ_FG6%PL5w z;^>BfW@m9-7tix(Zf@bwp$4X2GKt0`N0>HkDyF58vQso4YvRS1ULz3jlSm|4xNtt6 zQb<`(^`^~SJAW?0fS*WYJd?(aBM=H;7$#DaNGTDV0v`y32>64%@w?X?A;gvy%fJ5K z`Qp*e_k{JU*Y_^Dd9nX+ef_m_=ggD3u9Hk9&~%M>UmxAwy`)kpcI@24g8B2=wR_HbNXcnq0lvr(W6H*b;@L7vD}8KWm@ws`EZLD2}dzaA3{oW z!@#y}9LM3x+0*&ulTXpn*2c8S6WP6cFH@#of?-;;b)3L+U8E*43=_-p6AT216orXI zauN=Q357xgfr2u45CHF#QS=%EDP6l@LUhg&>1(TidZa4FciQtEVk{~1t_kWcNO7Kh-fTI zQM8DnXc0cY55q7q&72sfj$!DzDwGg|Djq&xfU=Tuwr=}K9XxQLBb~69ZQQug{)0au z^4(Q`_e^oLWZ4(*zQ;&s(zJFoLw*-2ol28Vr^#lsxUQGmRYK&nZW>sYMR9Q~|9rs6 z8yiE*UJB5q&e*C6oH*IRlTSUN5Zr$M@(16zPz?IVAwU<_|LN}SzGlt(H4|^W`8F+_ z4AU3yBNPtddLEjt4Xzj$Y>oGSQtHebeQF3JWu@h~uEPs2{;MklKe+E>fWP1v(BGCX zU!L&bbGvu#^y=ylGOBbmKFfyy!l582fv56o123N~dftHK9eP0e*LP}Qp{WMOD4?Wx z6ajyb-~R6PY$}=Bl}cp4^>LqZ(mw7FtXsXV<))>JJ8NtA-ZpjWRLVz?x;NZ^|ATuk#=U-Ora=g+<3P<`FRS+lN?(MXKGWE`awKFcJV zPm~JH-11rIBUnIT6bJ{yRE(Qkkzj_~75Jy;#pSY8QBp0a$?9FR4_@ zJbtWs?UbpPET}tluzc3c*;=%ym}D}Jr#yUqAD&X!c6Ok4VEHU`T_3*1lK&V9N2wT9 z$?@i6Jp1f3#N&zYeCOK_J(a(Qevt)%_3 zZ2ILhWNC33sr+Bw?>_YX#|l9A z_x&O+gaqw8wQdxceW47H(cRrG59~jZ>o)*4F-yKUnp{#|wb=iyYypjq|bw?Hql*(B%3_ z7%BsV^!4?z^`mWTFTHGP`GEubr-UOxF@EeMLcuV}R1(+ouq`CK?-$JoJ+v{p|VkOxi9g0dfSN)6OQgZHrCSTWTgw8lUX!?3~lp)2Sv;nj%VK zrFfo4#!d~~r<9V?;!%{BRnptr&9l!v<1{uNNpIi2^TDT|{MFk0KyOgeaC-6ba#3AC zj^J~L+iza}>bkY-_5yB!c&Cw(#$433fE>Z(wbOhq><480`0+)byYsVOjTS|3nKXH_ zw{-DR8H<&ml%l1riMLn3<+Qi8%ciE5$A9^Y$Dc~2Qg$AYGeSS~{ZLUCn}EW3|Eyp~ zaG3%5vp@Uvm2>7^b+2I>Q!c&qQnFcx`ucj(nas}Wciww=&6@Rf1zH`d-9jQxM~XV% zWadH>ppn4KvrJP05TzE} zKTOEeXj>})J+vR`x@QVzLw()*xS%g40VDn1=?FN@M*5Ivp9T{!)DjfGha3JwwzFMN e@yGUuZT}z7|96XS?h9c60000 Date: Thu, 28 Apr 2016 09:57:42 +0200 Subject: [PATCH 011/133] Revert "move extra filters to headerbar" This reverts commit ddd0d1e44884515908b4ebe2af934a75b0d49c1e. --- src/yumex.ui | 54 +++++++++++++++++++++------------------- src/yumex/__init__.py | 4 +-- src/yumex/gui/widgets.py | 3 --- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 87768e0..f9a6d87 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -1059,6 +1059,33 @@ start Yum Extender True False vertical + + + True + False + icons + 2 + + + True + False + More filtering options + True + view-list-symbolic + + + False + False + + + + + False + False + end + 0 + + 120 @@ -1521,33 +1548,10 @@ start Yum Extender False True - - True - False - - - True - True - True - Extra filtering options - - - True - False - view-list-symbolic - - - - - False - True - 0 - - - + - + True False 24 diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index bb18032..81ab4c5 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -321,7 +321,7 @@ def set_working(self, state, insensitive=True): def _disable_buttons(self, state): WIDGETS_INSENSITIVE = ['left_buttons', 'right_buttons', - 'package_sidebar', 'center_buttons'] + 'package_sidebar'] for widget in WIDGETS_INSENSITIVE: self.ui.get_object(widget).set_sensitive(state) @@ -1008,11 +1008,9 @@ def on_page_changed(self, widget, page): """Handle content page is changed.""" if page == 'packages': self._search_toggle.set_sensitive(True) - self.extra_filters.set_sensitive(True) self.search_bar.show() self.info.show() else: - self.extra_filters.set_sensitive(False) self._search_toggle.set_sensitive(False) self.search_bar.hide() self.info.show(False) diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index fbfec60..4ddabf4 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -777,9 +777,6 @@ def __init__(self, win): def popup(self): self._on_button(self._button) - def set_sensitive(self, state): - self._button.set_sensitive(state) - def _on_button(self, button): self._popover.show_all() From b338a2b7408199e818c23263dffd0d2997eb0e9c Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Thu, 28 Apr 2016 12:34:38 +0200 Subject: [PATCH 012/133] fix issue with get_tags() (fixes #94) --- src/yumex/gui/widgets.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 4ddabf4..78a9ecc 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -453,19 +453,23 @@ def on_mouse_motion(self, widget, event, data=None): # convert coords to TextBuffer coords x, y = widget.window_to_buffer_coords(Gtk.TextWindowType.TEXT, x, y) # Get the tags on current pointer location - tags = widget.get_iter_at_location(x, y).get_tags() - # Remove underline and hand mouse pointer - if self.underlined_url: - self.underlined_url.set_property("underline", Pango.Underline.NONE) - widget.get_window(Gtk.TextWindowType.TEXT).set_cursor(None) - self.underlined_url = None - for tag in tags: - if tag in self.url_tags: - # underline the tags and change mouse pointer to hand - tag.set_property("underline", Pango.Underline.SINGLE) - widget.get_window(Gtk.TextWindowType.TEXT).set_cursor( - Gdk.Cursor(Gdk.CursorType.HAND2)) - self.underlined_url = tag + itr = widget.get_iter_at_location(x, y) + if isinstance(itr, tuple): + itr = itr[1] + tags = itr.get_tags() + # Remove underline and hand mouse pointer + if self.underlined_url: + self.underlined_url.set_property("underline", + Pango.Underline.NONE) + widget.get_window(Gtk.TextWindowType.TEXT).set_cursor(None) + self.underlined_url = None + for tag in tags: + if tag in self.url_tags: + # underline the tags and change mouse pointer to hand + tag.set_property("underline", Pango.Underline.SINGLE) + widget.get_window(Gtk.TextWindowType.TEXT).set_cursor( + Gdk.Cursor(Gdk.CursorType.HAND2)) + self.underlined_url = tag return False def add_url(self, text, url, newline=False): From 7d2cf9ddd98b4dd386409d4af3c24e4b10476977 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Thu, 28 Apr 2016 13:16:07 +0200 Subject: [PATCH 013/133] Make info progress behave under gtk 3.20 --- src/yumex.ui | 252 ++++++++++++++++++++------------------- src/yumex/gui/widgets.py | 9 +- 2 files changed, 132 insertions(+), 129 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index f9a6d87..6d49ec6 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -843,6 +843,135 @@ start Yum Extender True False vertical + + + True + False + none + True + + + True + True + False + 5 + warning + + + False + 6 + end + + + + + + False + False + 0 + + + + + False + + + True + False + True + 6 + 5 + + + True + False + start + 6 + 10 + 6 + 10 + label + + + + + + 1 + 0 + + + + + True + False + 10 + 10 + 10 + 10 + True + + + 1 + 1 + + + + + False + start + 20 + 10 + 20 + 10 + label + + + + + + + 1 + 2 + + + + + True + False + True + + + 0 + 0 + 3 + + + + + False + True + 1 + + + + + False + False + 0 + + + + + + + + + + False + True + 0 + + True @@ -905,128 +1034,7 @@ start Yum Extender False True - 2 - - - - - True - True - False - 5 - - - False - 6 - end - - - - - - - - - - - - False - False - 0 - - - - - False - - - True - False - True - 6 - 5 - - - True - False - start - 6 - 10 - label - - - - - - 1 - 0 - - - - - True - False - 10 - 10 - True - - - 1 - 1 - - - - - False - start - 16 - 20 - 10 - label - - - - - - - 1 - 2 - - - - - True - False - True - - - 0 - 0 - 3 - - - - - False - True - 1 - - - - - False - False - 0 - - - - - - - - False - True - 0 + 1 diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 78a9ecc..b904c8d 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -46,13 +46,14 @@ class InfoProgressBar: def __init__(self, ui): self.ui = ui - self.infobar = ui.get_object("infobar") # infobar revealer + self.infobar = ui.get_object("info_revealer") # infobar revealer self.label = ui.get_object("infobar_label") self.sublabel = ui.get_object("infobar_sublabel") self.progress = ui.get_object("infobar_progress") self.spinner = ui.get_object("info_spinner") def _show_infobar(self, show=True): + self.infobar.set_reveal_child(show) if show: self.infobar.show() self.spinner.start() @@ -98,12 +99,6 @@ def info_sub(self, msg): self.show_sublabel(msg) def set_progress(self, frac, label=None): - if label: - self.progress.set_text(label) - self.progress.set_show_text(True) - else: - self.progress.set_show_text(False) - if frac >= 0.0 and frac <= 1.0: self._show_infobar() self.progress.show() From 34946c5c0343a741f03803d55a69547e29aca99b Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Thu, 28 Apr 2016 16:54:36 +0200 Subject: [PATCH 014/133] Add custom error dialog fixes #90 --- src/yumex.ui | 100 +++++++++++++++++++++++++++++++++++++++ src/yumex/__init__.py | 24 +++++----- src/yumex/gui/dialogs.py | 20 ++++++++ 3 files changed, 132 insertions(+), 12 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 6d49ec6..b74da65 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -675,6 +675,106 @@ start Yum Extender True False + + + False + 400 + 400 + dialog + False + + + False + vertical + 2 + + + False + end + + + + + + OK + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + vertical + + + True + False + Error + + + + + + + False + True + 0 + + + + + True + True + in + + + 350 + True + True + False + 5 + 5 + 5 + 5 + False + error_buffer + True + + + + + True + True + 1 + + + + + True + True + 1 + + + + + + error_ok + + True False diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 81ab4c5..32251ad 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -132,7 +132,7 @@ def get_root_backend(self): errmsg = _( 'DNF is locked by another process.\n\n' 'Yum Extender will exit') - dialogs.show_information(self, errmsg) + self.error_dialog.show(errmsg) # close down and exit yum extender #self.status.SetWorking(False) # reset working state #self.status.SetYumexIsRunning(self.pid, False) @@ -171,7 +171,8 @@ def exception_handler(self, e): close = False if errmsg == '': errmsg = msg - dialogs.show_information(self, errmsg) + self.error_dialog.show(errmsg) + # try to exit the backends, ignore errors if close: try: @@ -216,6 +217,7 @@ def __init__(self, app): sys.exit() # transaction result dialog self.transaction_result = dialogs.TransactionResult(self) + self.error_dialog = dialogs.ErrorDialog(self) def get_ui(self, widget_name): return self.ui.get_object(widget_name) @@ -289,7 +291,7 @@ def exception_handler(self, e): close = False if errmsg == '': errmsg = msg - dialogs.show_information(self, errmsg) + self.error_dialog.show(errmsg) # try to exit the backends, ignore errors if close: try: @@ -879,9 +881,8 @@ def _process_actions(self, from_queue=True): # check for protected packages check = self._check_protected(result) if check: - dialogs.show_information( - self, _("Can't remove protected package(s)"), - '\n'.join(check)) + self.error_dialog.show( + _("Can't remove protected package(s)") + '\n'.join(check)) self._reset_on_cancel() return # transaction confirmation dialog @@ -897,14 +898,13 @@ def _process_actions(self, from_queue=True): dialogs.show_information(self, _('No pending actions in queue')) self._reset_on_cancel() except misc.TransactionBuildError as e: # Error in building transaction - dialogs.show_information( - self, _('Error(s) in building transaction'), - '\n'.join(e.msgs)) + self.error_dialog.show( + _('Error(s) in building transaction') + '\n'.join(e.msgs)) self._reset_on_cancel() except misc.TransactionSolveError as e: - dialogs.show_information( - self, _('Error(s) in search for dependencies'), - '\n'.join(e.msgs)) + self.error_dialog.show( + _('Error(s) in search for dependencies') + + '\n'.join(e.msgs)) self._reset_on_error() ############################################################################### diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index a26bb34..16f9285 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -168,6 +168,26 @@ def handle_setting(self, option, state): os.unlink(const.USER_DESKTOP_FILE) +class ErrorDialog: + + def __init__(self, base): + self.base = base + self.dialog = self.base.ui.get_object("error_dialog") + self.dialog.set_transient_for(base) + self._buffer = self.base.ui.get_object('error_buffer') + + def show(self, txt): + self._set_text(txt) + self.dialog.show_all() + rc = self.dialog.run() + self.dialog.hide() + self._buffer.set_text('') + return rc == 1 + + def _set_text(self, txt): + self._buffer.set_text(txt) + + class TransactionResult: def __init__(self, base): From b6621c01070b0f5b088c6a4067220488b67e0250 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 29 Apr 2016 15:14:50 +0200 Subject: [PATCH 015/133] fix the error dialog, look & feel --- src/yumex.ui | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index b74da65..05afdf9 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -678,10 +678,13 @@ start Yum Extender False - 400 - 400 + 5 + Errors + center-on-parent + 600 + 260 + True dialog - False False @@ -702,7 +705,7 @@ start Yum Extender True - True + False True 1 @@ -710,7 +713,8 @@ start Yum Extender False - False + True + end 0 @@ -719,22 +723,6 @@ start Yum Extender True False vertical - - - True - False - Error - - - - - - - False - True - 0 - - True @@ -759,7 +747,7 @@ start Yum Extender True True - 1 + 0 From 76ed3b79c78d18b73bd0166ad66b869e8b29be04 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 29 Apr 2016 16:33:37 +0200 Subject: [PATCH 016/133] Add python based ChangeLog generation without email addrs --- ChangeLog | 3172 +++++++---------------------------------------- Makefile | 7 +- tools/git2cl | 308 ----- tools/git2cl.py | 130 ++ 4 files changed, 596 insertions(+), 3021 deletions(-) delete mode 100755 tools/git2cl create mode 100644 tools/git2cl.py diff --git a/ChangeLog b/ChangeLog index d895630..476f512 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,2914 +1,668 @@ -2016-04-26 Tim Lauridsen +2016-04-28 Tim Lauridsen - * setup.py, src/yumex/const.py, yumex-dnf.spec: bumped version to - 4.3.2 + * Add custom error dialog fixes #90 + * Make info progress behave under gtk 3.20 -2016-04-26 Tim Lauridsen +2016-04-27 Christian Stadelmann - Merge pull request #99 from genodeftest/devel-paned Fix main - GtkPaned being to small + * Remove tray icons Remove tray icons and references to it in Makefile. + Makefile: Don't create empty directory any more. + * InfoBar: remove custom colors and code Rely on Gtk theme for coloring the + info bar. Use a GtkInfoBar. This will fix #87. -2016-04-26 Tim Lauridsen +2016-04-26 Tim Lauridsen - Merge pull request #100 from genodeftest/devel-transactiondialog - Fix transaction dialog not expanding properly + * bumped version to 4.3.2 -2016-04-26 Christian Stadelmann +2015-12-17 Tim Lauridsen - * src/yumex.ui: Fix transaction dialog not expanding properly + * move extra filters to headerbar -2016-04-26 Christian Stadelmann +2015-12-15 Tim Lauridsen - * src/yumex.ui: Fix main GtkPaned being to small Without this fix, - the GtkPaned could be resized in a way that one of its child widgets - partially or completely got hidden. + * Add **Refresh Metadata** to main menu (#84) + * Added keyboard shortcut Alt-X to Extra filters (#14) + * Add Extra Filters menu with archs and package version filters (#85) -2015-12-17 Tim Lauridsen +2015-12-11 Tim Lauridsen - * src/yumex/gui/widgets.py: Extra filter popover should default - positon to bottom + * add action handler + * Remove options from main menu -2015-12-17 Tim Lauridsen +2015-12-09 Tim Lauridsen - * src/yumex/gui/widgets.py: make fields sensitive if search type is - fields + * bumped version to 4.3.1 -2015-12-17 Tim Lauridsen +2015-12-05 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/widgets.py: - move extra filters to headerbar + * Transfix pull, *.po update -2015-12-16 Tim Lauridsen +2015-12-03 Tim Lauridsen - * src/yumex.ui: change the icon of Extra filters button + * added keyboard shortcuts (#14) * Ctrl - Q = Quit * F1 = Open docs in + browser * Ctrl 1 - 4 (Select filter in package view) -2015-12-15 Tim Lauridsen +2015-12-02 Tim Lauridsen - * Makefile: build: use a relative build dir + * used paned for history view for more consistent look + * save search options #74 + * remove hide on close #74 + * Transfix push, yumex-dnf.pot update + * Transfix pull, *.po update + * rebuild .pot file + * use a popover menu for main menu #74 -2015-12-15 Tim Lauridsen +2015-12-01 Tim Lauridsen - * src/yumex/__init__.py, src/yumex/gui/widgets.py: Add **Refresh - Metadata** to main menu (#84) + * The apply pending actions button only sensitive when there is something in + the pending action queue + * fix: flickering when changing package info type + * change version to 4.3.0, to use un-even version for development and even + for a stable release in the future. + * ui updates * Rename **Actions** to **Pending Actions** * Remove pages from + main-menu (#74) + * fix: handling of legacy autostart .desktop files + * fix: autostart dir calc and make quit work + * rename autostart update checker .desktop file + * make minimize on quit work again -2015-12-15 Tim Lauridsen +2015-11-30 Tim Lauridsen - * .gitignore: update .gitignore to dont include build/ + * move package filter listbox to ui file -2015-12-15 Tim Lauridsen +2015-11-26 Tim Lauridsen - * README.md: update README + * Show notification instead of dialog when the user have performed an action + from the commandline + * cleanup update checker options + * Remove unused dk.yumex.StatusIcon files * Add install code for + yumex-dnf-updatechecker * make autostart start yumex-dnf-updatechecker -2015-12-15 Tim Lauridsen +2015-11-25 Tim Lauridsen - * Makefile: build rpms in source tree ($pwd/build) + * Add initial parts for new update checker + * adjust margins in pkg info view -2015-12-15 Tim Lauridsen +2015-11-24 Tim Lauridsen - * src/yumex/__init__.py, src/yumex/gui/widgets.py: Added keyboard - shortcut Alt-X to Extra filters (#14) + * cleanup debug print statements + * save main_paned position between session + * rework the Package Info widget * created a new look for package info + selection * only one package info widget (packages + groups) * move filter + selector into package page. + * minor ui tweaks (info radiobutton) + * Make it possible to disable dnf cache handling by setting refresh interval + to 0. (#76) + * Make the filter sidebar better + * Move filters into a sidebar -2015-12-15 Tim Lauridsen +2015-11-20 Christian Stadelmann - Add reworked option and extra filters (#85) + * Improve readability, remove hard-coded font sizes -2015-12-15 Tim Lauridsen +2015-11-20 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/views.py, - src/yumex/gui/widgets.py: Add Extra Filters menu with archs and - package version filters (#85) + * Add separate toolbar to filters -2015-12-14 Tim Lauridsen +2015-11-17 Tim Lauridsen - * src/yumex/__init__.py: show gui before the need to setup the - backend (#88) + * Integrate all the new UI parts in the right places + * add keyboard shortcuts Alt 1-4 for selecting primary pages. Alt S for + opening/closing search on package page + * Add preferences + * add logging * enable arch filter * fix issue with backend locked when some + options is changed + * Handle page change events in main window. * load groups info * more + refactoring -2015-12-11 Tim Lauridsen +2015-11-16 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py: add action handler + * add stack switcher to show main pages + * cleanup spinners + * make buttons insensitive when working + * make search work in the new gui reworked the search option (popover) -2015-12-11 Tim Lauridsen +2015-11-13 Tim Lauridsen - * src/yumex.ui: add button for more filters + * make setting the default filter smarter + * Added the basic parts for using a redesigned UI -2015-12-11 Tim Lauridsen +2015-10-08 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/widgets.py: - Remove options from main menu + * Use text color from theme (#63) -2015-12-11 Tim Lauridsen +2015-09-30 Tim Lauridsen - * src/yumex.ui: Added new preferences dialog + * bumped version to 4.1.4 -2015-12-10 Tim Lauridsen +2015-06-09 Tim Lauridsen - * Makefile: change Makefile for new release workflow + * add show available updates, when newest only is unchecked. -2015-12-09 Tim Lauridsen +2015-06-01 Tim Lauridsen - * src/yumex.ui: minor ui adjustment + * Added API version check for statusicon (#43) + * Add dnfdaemon service not started handling in statusicon + * added check for we have the need version of dnfdaemon API (#43) -2015-12-09 Tim Lauridsen +2015-05-27 Tim Lauridsen - * src/yumex/__init__.py: make search button insensitive, don't hide - (#74) + * bumped version to 4.1.3 + * i18n: translation updates -2015-12-09 Tim Lauridsen +2015-05-22 Tim Lauridsen - * src/yumex.ui: UI adjustments (#74) * Renamed 'Pending Action' to - 'Queue' in headerbar * Added comments for translators for headerbar - page buttons * Removed space between searchbar and search options - button. + * fix: RunTransaction api change, no more max_err parameter Removed + max_dnl_err yumex.conf option, not used any more -2015-12-09 Tim Lauridsen +2015-05-20 Tim Lauridsen - * ChangeLog: updated ChangeLog + * all statusicon -> yumex signal has pid + * refactor: move gpg confirmation dialog to gui.dialogs pep8: cleanup + * fix: yumex already running, is always stopping running version refactor: + dbus-send shell commands -2015-12-09 Tim Lauridsen +2015-05-19 Tim Lauridsen - * setup.py, src/yumex/const.py, yumex-dnf.spec: bumped version to - 4.3.1 + * make the status-icon daemon store the pid of the caller So we can + difference callers + * refactor: process actions and use exception instead of return codes -2015-12-07 Tim Lauridsen +2015-05-18 Tim Lauridsen - * src/yumex/__init__.py: Alt+A : Apply pending actions (#14) + * Add basics for history undo (#7) -2015-12-07 Tim Lauridsen +2015-05-14 Tim Lauridsen - * src/yumex/__init__.py: Ctrl-A toggle selection of all packages in - package view (#14) Same action as clicking the column header. + * make clean unused requirement work pep8 cleanup don't reset everything + when changing session option + * fix: make clean_instonly work when default on at launch + * Add option to set number of installonly packages to keep, when + clean_instonly is set. (#24) + * Add support of removing old version of install only pkgs (#24) -2015-12-05 Tim Lauridsen +2015-05-12 Tim Lauridsen - * po/ar.po, po/bg.po, po/bn_IN.po, po/cmn.po, po/cs.po, po/da.po, - po/de.po, po/el.po, po/es.po, po/es_ES.po, po/fa.po, po/fr.po, - po/gu.po, po/hu.po, po/id.po, po/it.po, po/ja.po, po/ko.po, - po/ky.po, po/nl.po, po/pl.po, po/pt.po, po/pt_BR.po, po/ru.po, - po/sk.po, po/sr.po, po/sr@latin.po, po/tr_TR.po, po/uk.po, - po/zh_CN.po, po/zh_TW.po: Transfix pull, *.po update + * refactor: move pkg_id convertion fn into lib + * add package requirement page to package info (#8) -2015-12-03 Tim Lauridsen +2015-05-10 Tim Lauridsen - * src/yumex/updater.py: updater: always launch /usr/bin/yumex-dnf + * Translation update (transifex) -2015-12-03 Tim Lauridsen +2015-05-06 Tim Lauridsen - * src/yumex/__init__.py: Added more keyboard shortcuts (#14) * - Return open preferences * N toggle Newest only option - * E toggle Erase unused requirements option * C toggle - Cleanup old instonly packages option + * bumped version to 4.1.2 + * protect against removing yumex-dnf and req. (#29) -2015-12-05 Tim Lauridsen +2015-04-30 Tim Lauridsen - Merge pull request #83 from rbuj/Catalan add Catalan language + * fix: yumex notification icon launch fails if no yumex.conf (RhBug: + 1217165) + * make the saved arch filter work on first start (#28) + * fix: better handling of errors starting notification icon (RhBug: 1217241) + * remember arch menu selections between sessions (#28) -2015-12-04 Robert Antoni Buj Gelonch +2015-04-29 Tim Lauridsen - * po/ca.po: add Catalan language tx pull -l ca + * Remove skipbroken option, not used by dnf + * load custom styling from current theme (#26) Add '--minimized' cmd option + to start yumex (#27) -2015-12-03 Tim Lauridsen +2015-04-28 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/widgets.py: - added keyboard shortcuts (#14) * Ctrl - Q = Quit * F1 = Open docs - in browser * Ctrl 1 - 4 (Select filter in package view) + * set styling name to toolbar & packageview (#26) -2015-12-02 Tim Lauridsen +2015-04-27 Tim Lauridsen - * src/yumex/gui/views.py: expand the latest history entry (#67) + * fix: make downgrades work (#16) -2015-12-02 Tim Lauridsen +2015-04-26 Tim Lauridsen - * src/yumex/gui/views.py: add numbers of actions in history pkg view - (#69) + * bumped version to 4.1.1 -2015-12-02 Tim Lauridsen +2015-04-26 Piotr Drąg - * src/yumex.ui, src/yumex/__init__.py: used paned for history view - for more consistent look + * Improve some strings -2015-12-02 Tim Lauridsen +2015-04-26 Tim Lauridsen - * src/yumex.ui: fix: add "Remove Selected" to queue menu + * Added --updateall there will apply all pending updates * make apply from + status icon notification launch yumex with --updateall * fix: hide status + icon when no updates is found (#23) + * move all status icon setting to a separate page in pref. added + notification on update to pref. added show only icon when updates to pref + added Makefile targets to test statusicon dbus daemon (#23) -2015-12-02 Tim Lauridsen +2015-04-25 Tim Lauridsen - * src/yumex/__init__.py: fix: when refresh_interval=0, don't refresh - dnf metadata + * Add configurable notification on update -2015-12-02 Tim Lauridsen +2015-04-24 Tim Lauridsen - * src/yumex/__init__.py, src/yumex/gui/widgets.py, - src/yumex/misc.py: save search options #74 + * save selected repositories, if "save selected repositories" is enabled + (RhBug: 1214062) -2015-12-02 Tim Lauridsen +2015-04-23 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/dialogs.py, - src/yumex/misc.py: remove hide on close #74 + * Added support of showing update information about fedora updates (Fixes #5 + & RhBug: 1121946) requires dnfdaemon >= 0.3.7 for supplying update + information + * Added option to auto select all available updates at startup (Fixes #22 & + RhBug: 1214052) + * refactor: move HeaderBar and ToolBar to gui/widgets + * save window size and maximize state between sessions (fixes #18 & RhBug: + 1214047) -2015-12-02 Tim Lauridsen +2015-04-22 Tim Lauridsen - * src/yumex/__init__.py: fix: Ctrl-F should open/close searchbar all - the time #74 + * Strech searchbox to use available space (fixes #19 & RhBug: 1214059) + * save search option between session (fixes #20 & RhBug: 1214057) + * set search defaults from config settings -2015-12-02 Tim Lauridsen +2015-04-14 Tim Lauridsen - * po/yumex-dnf.pot, src/yumex/gui/widgets.py: Transfix push, - yumex-dnf.pot update + * doc: update info about yumex is already running Add faq entry about + selecting all updates -2015-12-02 Tim Lauridsen +2015-04-13 Tim Lauridsen - * po/ar.po, po/bg.po, po/bn_IN.po, po/cmn.po, po/cs.po, po/da.po, - po/de.po, po/el.po, po/es.po, po/es_ES.po, po/fa.po, po/fr.po, - po/gu.po, po/hu.po, po/id.po, po/it.po, po/ja.po, po/ko.po, - po/ky.po, po/nl.po, po/pl.po, po/pt.po, po/pt_BR.po, po/ru.po, - po/sk.po, po/sr.po, po/sr@latin.po, po/tr_TR.po, po/uk.po, - po/zh_CN.po, po/zh_TW.po, src/yumex/__init__.py: Transfix pull, *.po - update + * update translations -2015-12-02 Tim Lauridsen +2015-04-12 Tim Lauridsen - * po/POTFILES.in, po/yumex-dnf.pot: rebuild .pot file + * bumped version to 4.1.0 -2015-12-02 Tim Lauridsen +2015-04-11 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/widgets.py, - src/yumex/misc.py: use a popover menu for main menu #74 + * fix review issues + * update fsf address -2015-12-02 Tim Lauridsen +2015-04-09 Tim Lauridsen - * src/yumex/misc.py: better GNOME detection + * add custom gtk styling + * bumped version to 4.0.10 + * Make yumex already running better + * show yumex ui always if started again an working in the background + * make better handling of yumex is started twice -2015-12-01 Tim Lauridsen +2015-04-07 Tim Lauridsen - * src/yumex/__init__.py, src/yumex/gui/views.py: The apply pending - actions button only sensitive when there is something in the pending - action queue + * bumped version to 4.0.9 + * Make toolbar in headerbar an config option. Enabled by default in gnome, + and disabled in other DE's -2015-12-01 Tim Lauridsen +2014-10-21 Tim Lauridsen - * src/yumex/__init__.py, src/yumex/gui/widgets.py: fix: flickering - when changing package info type + * bumped version to 4.0.8 -2015-12-01 Tim Lauridsen +2014-10-11 Tim Lauridsen - * src/yumex/const.py, yumex-dnf.spec: change version to 4.3.0, to - use un-even version for development and even for a stable release in - the future. + * fix: only show fedora packages links for packages in fedora repos -2015-12-01 Tim Lauridsen +2014-10-02 Tim Lauridsen - * src/yumex.ui, src/yumex/gui/widgets.py: ui updates * Rename - **Actions** to **Pending Actions** * Remove pages from main-menu - (#74) + * Use FRENZY Software Manager icons -2015-12-01 Tim Lauridsen +2014-09-25 Tim Lauridsen - * src/yumex/__init__.py, src/yumex/const.py: fix: handling of legacy - autostart .desktop files + * ui: use standard gtk+ spinner + * fix: make main menu quit work -2015-12-01 Tim Lauridsen +2014-09-24 Tim Lauridsen - * src/yumex/__init__.py, src/yumex/const.py, - src/yumex/gui/dialogs.py: fix: autostart dir calc and make quit work + * ui: added progress for package verify after transaction is completted +2014-09-21 Tim Lauridsen -2015-12-01 Tim Lauridsen + * bumped version to 4.0.7 + * cleanup: gtk 3.12 deprecated ui - * src/yumex/gui/dialogs.py: fix typo +2014-09-05 Tim Lauridsen -2015-12-01 Tim Lauridsen + * cleanup: deprecated Gtk + * fix: better exception handling when Dbus backend dies + * fix: deprecated Gtk stuff - * src/yumex/misc.py: cleanup legacy unused code +2014-09-02 Tim -2015-12-01 Tim Lauridsen + * bumped version to 4.0.6 - * misc/Makefile, misc/yumex-dnf-autostart.desktop, - misc/yumex-dnf-updater.desktop, src/yumex/const.py, - src/yumex/gui/dialogs.py: rename autostart update checker .desktop - file +2014-06-21 Tim Lauridsen -2015-12-01 Tim Lauridsen + * Fix the language setup, so Gtk.builder get translated + * i18n: updated translations + * Set translation domain for GtkBuilder, use right translation domain for + notification domain - * src/yumex.ui, src/yumex/__init__.py: make minimize on quit work - again +2014-06-08 Tim Lauridsen -2015-11-30 Tim Lauridsen + * Adjust headerbar - * src/yumex/__init__.py: Setup session based config vars from the - default from preferences +2014-06-06 Tim Lauridsen -2015-11-30 Tim Lauridsen + * bumped version to 4.0.5 - * src/yumex.ui: Add more tooltips +2014-06-03 Tim Lauridsen -2015-11-30 Tim Lauridsen + * added fedora packages links to package info - * src/yumex.ui: add tooltips to filters +2014-05-12 Tim Lauridsen -2015-11-30 Tim Lauridsen + * cleanup: doc strings and minor refactoring + * cleanup imports - * src/yumex.ui, src/yumex/gui/widgets.py: move package filter - listbox to ui file +2014-05-09 Tim Lauridsen -2015-11-30 Tim Lauridsen + * use new dnfdaemon GetPackges, the works with attrs + * bumped version to 4.0.4 + * adjust to dnfdaemon code changes - * src/yumex.ui: Add tooltips to package info buttons +2014-05-03 Tim Lauridsen -2015-11-27 Tim Lauridsen + * bumped version to 4.0.3 - * src/yumex/misc.py: always return 0 as 00 (hex) in color code +2014-04-25 Tim Lauridsen -2015-11-27 Tim Lauridsen + * code cleanup - * src/yumex/misc.py: fix problem with color to hex convertion (#81) +2014-04-10 Tim Lauridsen + * fix: typo in appdata file + * cleanup: PEP8 issues + * fix. use absolute imports in all modules + * pull translations from transifex + * fix: split up appdata translation in more elements -2015-11-27 Tim Lauridsen +2014-04-09 Tim Lauridsen - * src/yumex/misc.py: workaround for changes in Gtk 3.19.x - https://blogs.gnome.org/mclasen/2015/11/20/a-gtk-update/ + * add appdata file + * cleanup: make the code follow PEP8 -2015-11-27 Tim Lauridsen +2014-04-02 Tim Lauridsen - * src/yumex/misc.py: Cleanup old instonly packages is enabled by - default + * refactor: split yumex.widget into yumex.gui.views, dialogs, widgets -2015-11-27 Tim Lauridsen +2014-04-01 Tim Lauridsen - * src/yumex/__init__.py: PEP8 cleanup + * bumped version to 4.0.2 + * update .pot & pull po from transifex + * add: added code for installing and removing groups + * refactor: group should be reprecented as python objects in group view, to + make it possible to unselect the group, when remove from the queue view. -2015-11-26 Tim Lauridsen +2014-03-31 Tim Lauridsen - * yumex-dnf.spec: include all bins to spec + * translation: rename yum to dnf in strings & rebuild .pot file doc: added + link to translation page at transifex + * add: added Help to main menu, with About Dialog & Online docs + * doc: added debug info to FAQ + * doc: added FAQ and updated doc -2015-11-26 Tim Lauridsen +2014-03-30 Tim Lauridsen - * yumex-dnf.spec: remove dbus services from spec + * fix: pending queue right click menu not shown + * doc: Added docs -2015-11-26 Tim Lauridsen +2014-03-29 Tim Lauridsen - * yumex-dnf.spec: bunp spec version + * bumped version to 4.0.1 -2015-11-26 Tim Lauridsen +2014-03-28 Tim Lauridsen - * src/yumex/__init__.py: Add support for running action from - commandline when yumex-dnf is already started and idle (#80) + * cleanup: remove unsued code + * add: always use the dnf root backend, to avoid the mess with 2 caches, + there can be different + * add: Use Gtk.Stack for main content and Gtk.Revealer from Gtk 3.10, to show + animations, when changing pages and let the infobar slide down. -2015-11-26 Tim Lauridsen +2014-03-27 Tim Lauridsen - * src/main.py, src/yumex/__init__.py, src/yumex/misc.py: Show - notification instead of dialog when the user have performed an - action from the commandline + * add: make prefix the default search type + * optimize: make search faster by using new dnfdeamon API to get attributes + with the search results -2015-11-26 Tim Lauridsen +2014-03-26 Tim Lauridsen - * src/yumex/__init__.py: Added support for execute action from the - commandline in a minimal UI. * added --install PACKAGE * added - --remove PACKAGE * added --updateall * added --yes + * add: add new yumex ui -2015-11-26 Tim Lauridsen +2014-03-21 Tim Lauridsen - * src/yumex/__init__.py: cleanup yumex.misc import + * fix: show information is dnf cache can't be refreshed -2015-11-26 Tim Lauridsen +2014-03-20 Tim Lauridsen - * src/yumex.ui: remove ident for update checker interval in - preferences + * add: add ui for setting the expire cache interval in perferences + * add: make time between cache expire a number of hours -2015-11-26 Tim Lauridsen +2014-03-19 Tim Lauridsen - * src/yumex/updater.py: impromvement to update-checker * Clicking - "Not Now" on notification will show a new notification for a - period of 10x check interval. * Don't show a new notification until - the number of updates changes or the user has closed the previous - one. + * add: only expire dnf cache once every day + * cleanup: fix typos + * removed unused repo build tools, we use Copr now + * remove .mo binary translation files + * Added support for translation files from transifex + * updated translation source -2015-11-26 Tim Lauridsen +2014-03-18 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/dialogs.py, - src/yumex/misc.py: cleanup update checker options + * fix: show obsletes af fullname, not pkg_id -2015-11-26 Tim Lauridsen +2014-03-15 Tim Lauridsen - * Makefile, dbus/Makefile, dbus/dbus_status.py, - dbus/dk.yumex.StatusIcon.service, misc/yumex-dnf-autostart.desktop, - setup.py, src/yumex/status.py: Remove unused dk.yumex.StatusIcon - files * Add install code for yumex-dnf-updatechecker * make - autostart start yumex-dnf-updatechecker + * cleanup: remove some unused code -2015-11-26 Tim Lauridsen +2014-03-13 Tim Lauridsen - * src/yumex/updater.py: Use Gio.Application + * Updated README and Makefile cleanup -2015-11-26 Tim Lauridsen +2014-03-12 Tim Lauridsen - * src/yumex/updater.py: make it possible to stop the updater by - running update.py --exit + * group packages optimizations + * Remove skip-broken option, dont exist in dnf + * Refresh dnf metadata on startup -2015-11-25 Tim Lauridsen +2014-03-11 Tim Lauridsen - * src/update.py, src/yumex/__init__.py, src/yumex/misc.py, - src/yumex/updater.py: Add initial parts for new update checker + * yumex-nextgen -> yumex-dnf rename + * Use the dnfdaemon for packaging action -2015-11-25 Tim Lauridsen +2014-02-18 Tim Lauridsen - * src/yumex.ui: Make package info TextView ReadOnly + * Change the default window close action to exit yumex add at setting in + preferences to change the window close action to just hide the window -2015-11-25 Tim Lauridsen +2013-10-24 Tim Lauridsen - * src/yumex.ui, src/yumex/gui/widgets.py: adjust margins in pkg info - view + * Changed the way yumex is build - use setup.py - use Makefile in subdirs -2015-11-25 Tim Lauridsen +2013-10-23 Tim Lauridsen - * src/yumex/__init__.py: Make the --exit option work in both first - and second run + * - Show project url in package description (Issue #169 - clean rpms before + upload to repo -2015-11-24 Tim Lauridsen +2013-10-16 Tim Lauridsen - * src/yumex.ui: minor ui tweak + * Add package filtering (updates, installed) on search results -2015-11-24 Tim Lauridsen +2013-10-14 Tim Lauridsen - * src/yumex/__init__.py, src/yumex/gui/widgets.py: cleanup debug - print statements + * Added new mock_build target and build helper -2015-11-24 Tim Lauridsen +2013-10-13 Tim Lauridsen - * src/yumex/gui/widgets.py: only send signal if we have valid - selection + * add mock-build target to Makefile added script to build repo and upload to + fedorapeople.org -2015-11-24 Tim Lauridsen +2013-10-11 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/misc.py: save - main_paned position between session + * better handling of locked and not authorized error when getting the root + backend + * Added Right Click + * Make the arch menu entries reflect the current system -2015-11-24 Tim Lauridsen +2013-10-10 Tim Lauridsen - * src/yumex.ui: center the page switcher on the headerbar + * set archs based on current system arch + * - minor toolbar button rearrange - adjusted debug logging - Added GPG key + import support -2015-11-24 Tim Lauridsen +2013-10-09 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/views.py, - src/yumex/gui/widgets.py: rework the Package Info widget * created - a new look for package info selection * only one package info widget - (packages + groups) * move filter selector into package page. + * - minor toolbar button rearrange - adjusted debug logging + * Store colors in hex, the rgb(R,G,B) notation dont work with markup like + foreground="...." -2015-11-24 Tim Lauridsen +2013-10-07 Tim Lauridsen - * src/yumex/gui/views.py: Make the info view font a little smaller - then the default Monospace size + * change the search entry so it only does auto search when searching only in + package names, when searching a wider scope, then first do the search when + return is pressed. + * Click on selection column header in group view, will switch between: - + install all packages in group (not already install) - remove all packages + already installed in group - back to initial selection Click on selection + column header in package view (updates only) will switch between: - select + all updates. - deselect all updates. - back to initial selection Added + '--exit' command line option to exit session based dbus services started by a + yumex (Status icon & YumReadonlyBackend) -2015-11-24 Tim Lauridsen +2013-10-04 Tim Lauridsen - * src/yumex.ui, src/yumex/gui/widgets.py: minor ui tweaks (info - radiobutton) + * - Added group and category content - reworked package view to use signals - + extracted archmenu into ArchMenu object - made a package info widget, so it + can be reused for group view -2015-11-24 Tim Lauridsen +2013-10-03 Tim Lauridsen - * src/yumex/misc.py: increase default window width + * Inital support for groups (not complete yet) + * Add .desktop file for installation of local rpms Updated requirments in + .spec Add COPYING to be GPL complient + * changed po/Makefile to add .ui files with [type: gettext/glade] prefix + rebuild .pot and POTFILES.in + * Show a main label when downloading extra metadata (changelog, filelists + etc.) Minor ui adjustments to info progress bar -2015-11-24 Tim Lauridsen +2013-10-02 Tim Lauridsen - * src/yumex/gui/widgets.py: Show updates on start + * Updated README and minor Makefile adjustments + * Added schduled update checker in status icon Added update check interval + and and startup delay to preferences + * Added 'Start Yum Extender' to status icon added '--icononly' option to + yumex, it will only start the status icon change autostart option in pref to + start status icon only -2015-11-24 Tim Lauridsen +2013-10-01 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py: Make it possible to disable - dnf cache handling by setting refresh interval to 0. (#76) + * Send signals from the status icon on actions and listen and do the right + action in the client. + * Added DBus based Status Icon + * Added command line install & remove support using --install package or + --install package. Using a smaller ui (only info progress bar) -y/--yes + command line option will disable questions and info dialogs when running + actions from the command line. Added small spinner to info progress bar. -2015-11-24 Tim Lauridsen +2013-09-30 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/widgets.py: - Make the filter sidebar better + * Better progress infomation when downloading metadata + * - minor ui adjustments - use the right yumex-nextgen icon + * Better info/progress bar look & feel Changed progress strings. minor code + clean up -2015-11-24 Tim Lauridsen +2013-09-29 Tim Lauridsen - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/widgets.py: - Move filters into a sidebar + * Added arch filtering, click on the header of the arch column to select to + archs to show -2015-11-20 Tim Lauridsen +2013-09-28 Tim Lauridsen - Merge pull request #77 from genodeftest/font-sizes Font sizes + * Change bg color of progress infobar to very light gray + * minor ui cleanup added accelerator (dont work ) + * make we always set the active repos in the root backend -2015-11-20 Tim Lauridsen +2013-09-27 Tim Lauridsen - * src/yumex/__init__.py: Add auto gnome detection + * Make changes to enabled repositories work both in root and non-root backend -2015-11-20 Tim Lauridsen - - * src/yumex.ui: Add some tooltips and other UI tweaks - -2015-11-20 Christian Stadelmann - - * src/yumex/const.py, src/yumex/gui/views.py: Improve readability, - remove hard-coded font sizes - -2015-11-20 Christian Stadelmann - - * src/yumex.ui: infobar_sublabel: Fix visibility, use relative font - Without this change infobar_sublabel is visible by default. It uses - an absolute font which is not required but might interfere with - users choosing their own custom font size. - -2015-11-20 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: Add separate toolbar to - filters - -2015-11-20 Tim Lauridsen - - * src/yumex.ui: cleanup margins in preferences - -2015-11-18 Tim Lauridsen - - * src/yumex/gui/widgets.py: fix possible traceback RhBug: 1253630 - -2015-11-18 Tim Lauridsen - - * dbus/dbus_status.py: don't use deprecated GObject.SIGNAL_RUN_FIRST - - -2015-11-18 Tim Lauridsen - - * yumex-dnf.spec: add libnotify requirement RhBug: 1279992 - -2015-11-18 Tim Lauridsen - - * src/yumex/status.py: don't act on statusicon dbus signals, if - there is no window - -2015-11-18 Tim Lauridsen - - * dbus/dbus_status.py: fix gi warnings - -2015-11-17 Tim Lauridsen - - * src/yumex/gui/widgets.py: Set direction on the search option - popover - -2015-11-17 Tim Lauridsen - - * src/main.py, src/new-main.py, src/yumex-new.ui, src/yumex.ui, - src/yumex/__init__.py, src/yumex/const.py, - src/yumex/gui/new_widgets.py, src/yumex/gui/widgets.py, - src/yumex/old_init.py: Integrate all the new UI parts in the right - places - -2015-11-17 Tim Lauridsen - - Add the new redesigned yumex ui to master - -2015-11-17 Tim Lauridsen - - * src/new-main.py: Added Transactions processing parts - -2015-11-17 Tim Lauridsen - - * src/new-main.py, src/yumex/gui/new_widgets.py: add keyboard - shortcuts Alt 1-4 for selecting primary pages. Alt S for - opening/closing search on package page - -2015-11-17 Tim Lauridsen - - * src/new-main.py, src/yumex/gui/new_widgets.py: Add preferences - -2015-11-17 Tim Lauridsen - - * src/new-main.py, src/yumex/gui/new_widgets.py: add logging * - enable arch filter * fix issue with backend locked when some options - is changed - -2015-11-17 Tim Lauridsen - - * src/new-main.py: handle option changes - -2015-11-17 Tim Lauridsen - - * src/new-main.py: load and populate history information - -2015-11-17 Tim Lauridsen - - * src/new-main.py, src/yumex/gui/new_widgets.py: Handle page change - events in main window. * load groups info * more refactoring - -2015-11-17 Tim Lauridsen - - * src/new-main.py: Refactor code and add better doc strings - -2015-11-17 Tim Lauridsen - - * src/yumex/gui/new_widgets.py: add docstrings/comments - -2015-11-17 Tim Lauridsen - - * src/yumex-new.ui: stack should expand - -2015-11-16 Tim Lauridsen - - * src/yumex-new.ui, src/yumex/gui/new_widgets.py: add stack switcher - to show main pages - -2015-11-16 Tim Lauridsen - - * src/new-main.py, src/yumex-new.ui, src/yumex/gui/new_widgets.py: - cleanup spinners - -2015-11-16 Tim Lauridsen - - * src/yumex-new.ui: minor adj. to spinner - -2015-11-16 Tim Lauridsen - - * src/yumex-new.ui: adjust ui margins to look better - -2015-11-16 Tim Lauridsen - - * src/new-main.py, src/yumex-new.ui, src/yumex/gui/new_widgets.py: - make buttons insensitive when working - -2015-11-16 Tim Lauridsen - - * src/new-main.py, src/yumex-new.ui, src/yumex/gui/new_widgets.py: - make search work in the new gui reworked the search option (popover) - - -2015-11-13 Tim Lauridsen - - * src/new-main.py, src/yumex/gui/new_widgets.py: make setting the - default filter smarter - -2015-11-13 Tim Lauridsen - - * src/new-main.py, src/yumex-new.ui, src/yumex/gui/new_widgets.py: - Added the basic parts for using a redesigned UI - -2015-11-04 Tim Lauridsen - - * src/yumex/gui/widgets.py: adjust toolbar margins - -2015-11-04 Tim Lauridsen - - * src/main.py: use gi.require_version('Gtk', '3.0') - -2015-11-04 Tim Lauridsen - - Merge pull request #73 from timlau/revert-72-patch-2 Revert - 99091b39c5639df2f7ea331465cb3f8e6c30cf3f - -2015-11-04 Tim Lauridsen - - * src/main.py: Revert 99091b39c5639df2f7ea331465cb3f8e6c30cf3f - -2015-11-04 Tim Lauridsen - - Merge pull request #72 from genodeftest/patch-2 Require Gtk - version 3.10 - -2015-11-03 Christian Stadelmann - - * src/main.py: Require Gtk version 3.10 This fixes some warnings - from gi. I chose Gtk 3.10 since yumex-dnf uses `GtkHeaderBar`s which - require 3.10. - -2015-10-20 Tim Lauridsen - - Merge pull request #66 from genodeftest/patch-1 Unify page - borders/margins - -2015-10-20 Christian Stadelmann - - * src/yumex.ui: Unify page borders/margins - -2015-10-09 Tim Lauridsen - - * src/yumex/gui/views.py: Wrap text in Package Info view (#62) - -2015-10-08 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: Use text color from - theme (#63) - -2015-10-08 Tim Lauridsen - - * src/yumex/misc.py: add helper to get default color for a widget - -2015-10-08 Tim Lauridsen - - * src/yumex/misc.py: cleanup: more PEP8 fixes - -2015-10-08 Tim Lauridsen - - * src/yumex/gui/views.py: cleanup: PEP8 fixes - -2015-10-06 Tim Lauridsen - - * src/yumex/misc.py: check_dark theme is a function - -2015-10-06 Tim Lauridsen - - * src/yumex/gui/views.py: Make repoview column header click work - fixes RhBug: #1233376 - -2015-10-06 Tim Lauridsen - - * src/main.py: remove -tt from python3 shebang - -2015-10-06 Tim Lauridsen - - * src/yumex/__init__.py: Fix traceback on errors in building group - transaction (RhBug: 1262879) - -2015-10-05 Tim Lauridsen - - Merge pull request #49 from tamimym/master Change font colors - if using dark theme - -2015-10-05 Tim Lauridsen - - Merge pull request #56 from - genodeftest/genodeftest-patch-trayicon Fix a warning when - rightclick-opening a tray popup menu - -2015-10-02 Tim Lauridsen - - Merge pull request #58 from - genodeftest/genodeftest-patch-pythonargs Remove deprecated python - option `-tt` - -2015-10-02 Christian Stadelmann - - * dbus/dbus_status.py: Remove deprecated python option `-tt` The - `-t` option was removed in python3. It has no effect any more and is - ignored. It can be safely removed. See - https://bugzilla.redhat.com/show_bug.cgi?id=1268262 - -2015-10-02 Christian Stadelmann - - * dbus/dbus_status.py: Fix a warning when rightclick-opening a tray - popup menu Currently on F22 when opening a popup menu on yumex's - status icon I get this message on stderr: `TypeError: pos() takes 2 - positional arguments but 4 were given` This is caused by an API - break in Gtk3's GObject/Python bindings, see - https://github.com/lazka/pgi-docgen/issues/92 for details. This - change fixes the issue for me on F22/Gtk+ 3.16. Needs testing on - 3.18 and 3.14, I can't do that right now. If this change doesn't - work on all supported Gtk versions, another idea can be found in - https://github.com/exaile/exaile/pull/112 - -2015-10-01 Tim Lauridsen - - * src/main.py: Handle SIGINT, So Ctrl-C will not leave yumex-dnf in - limbo (#55) - -2015-09-30 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-09-30 Tim Lauridsen - - * src/yumex/const.py, yumex-dnf.spec: bumped version to 4.1.4 - -2015-07-28 tamimym - - * src/yumex/gui/widgets.py: Checks for dark GTK theme when setting - background color of InfoBar - -2015-07-28 tamimym - - * src/yumex/gui/views.py: Checks for dark GTK theme and set colors - in PackageInfoView and of url - -2015-07-28 tamimym - - * src/yumex/misc.py: Added check_dark_theme function and changed - default font colors if using dark GTK theme - -2015-06-09 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py, - src/yumex/dnf_backend.py: add show available updates, when newest - only is unchecked. - -2015-06-01 Tim Lauridsen - - * src/yumex/__init__.py: don't reset queue on download errors (#41) - - -2015-06-01 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py, src/yumex/status.py: - Added API version check for statusicon (#43) - -2015-06-01 Tim Lauridsen - - * src/yumex/__init__.py: cleanup: pep8 fixes - -2015-06-01 Tim Lauridsen - - * dbus/dbus_status.py: show the full error msg, when status icon - can't launch dnfdaemon - -2015-06-01 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/dnf_backend.py: Add dnfdaemon - service not started handling in statusicon - -2015-06-01 Tim Lauridsen - - * src/yumex/const.py, src/yumex/dnf_backend.py: added check for we - have the need version of dnfdaemon API (#43) - -2015-05-31 Tim Lauridsen - - * src/yumex/dnf_backend.py: fix: show download size in bytes, not - bits (RhBug: 1226572) - -2015-05-31 Tim Lauridsen - - * src/yumex/const.py: fix: support reinstall in rpm progress strings - (RhBug: 1226617) - -2015-05-28 Tim Lauridsen - - * src/yumex/gui/dialogs.py: fix: create autostart dir if it don't - exists (RhBug: 1225518) - -2015-05-27 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-05-27 Tim Lauridsen - - * ChangeLog, setup.py, src/yumex/const.py, yumex-dnf.spec: bumped - version to 4.1.3 - -2015-05-27 Tim Lauridsen - - * .tx/config, po/ar.po, po/bg.po, po/bn_IN.po, po/cmn.po, po/cs.po, - po/da.po, po/de.po, po/el.po, po/es.po, po/es_ES.po, po/fa.po, - po/fr.po, po/gu.po, po/hu.po, po/id.po, po/it.po, po/ja.po, - po/ko.po, po/ky.po, po/nl.po, po/pl.po, po/pt.po, po/pt_BR.po, - po/ru.po, po/sk.po, po/sr.po, po/sr@latin.po, po/tr_TR.po, - po/uk.po, po/yumex-dnf.pot, po/zh_CN.po, po/zh_TW.po: i18n: - translation updates - -2015-05-22 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: fix: RunTransaction api - change, no more max_err parameter Removed max_dnl_err yumex.conf - option, not used any more - -2015-05-20 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/__init__.py, src/yumex/status.py: - all statusicon -> yumex signal has pid - -2015-05-20 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py, - src/yumex/gui/dialogs.py, src/yumex/gui/widgets.py, - src/yumex/misc.py, src/yumex/status.py: refactor: move gpg - confirmation dialog to gui.dialogs pep8: cleanup - -2015-05-20 Tim Lauridsen - - * src/yumex/__init__.py: doc: added some comments - -2015-05-20 Tim Lauridsen - - * Makefile: build: add some extra Makefile targets - -2015-05-20 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: fix: yumex already - running, is always stopping running version refactor: dbus-send - shell commands - -2015-05-19 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/__init__.py, src/yumex/status.py: - make the status-icon daemon store the pid of the caller So we can - difference callers - -2015-05-19 Tim Lauridsen - - * src/yumex.ui: cleanup: GtkButton:xalign is deprecated - -2015-05-19 Tim Lauridsen - - * src/yumex.ui: cleanup: margin_left/right -> margin_begin/end - -2015-05-19 Tim Lauridsen - - * src/yumex/__init__.py: fix: populate_transaction don't return - anything - -2015-05-19 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: refactor: process - actions and use exception instead of return codes - -2015-05-19 Tim Lauridsen - - * src/yumex/__init__.py: fix: don't show 2 dialogs, when queue is - empty - -2015-05-19 Tim Lauridsen - - * src/yumex/__init__.py: fix: traceback when group is empty - -2015-05-19 Tim Lauridsen - - * src/yumex/__init__.py: make history undo work (#7) - -2015-05-18 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/views.py: Add - basics for history undo (#7) - -2015-05-14 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/dnf_backend.py, - src/yumex/misc.py: make clean unused requirement work pep8 cleanup - don't reset everything when changing session option - -2015-05-14 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/dnf_backend.py: fix: make - clean_instonly work when default on at launch - -2015-05-14 Tim Lauridsen - - * src/yumex.ui, src/yumex/dnf_backend.py, src/yumex/gui/dialogs.py, - src/yumex/misc.py: Add option to set number of installonly packages - to keep, when clean_instonly is set. (#24) - -2015-05-14 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/dnf_backend.py, - src/yumex/gui/dialogs.py, src/yumex/misc.py: Add support of removing - old version of install only pkgs (#24) - -2015-05-13 Tim Lauridsen - - * src/yumex/__init__.py: fix: only show error in transaction dialog - on errors - -2015-05-13 Tim Lauridsen - - * src/yumex/dnf_backend.py: fix: misc. grammar errors (RhBug: - #1221155) - -2015-05-13 Tim Lauridsen - - * src/yumex/gui/views.py: fix: misc. grammar errors (RhBug: - #1221155) - -2015-05-13 Tim Lauridsen - - * src/yumex/__init__.py: fix: traceback in arch menu changes. - (RhBug #1220949) - -2015-05-12 Tim Lauridsen - - * src/main.py: add better exception handling (#36) - -2015-05-12 Tim Lauridsen - - * src/yumex/dnf_backend.py, src/yumex/misc.py: refactor: move pkg_id - convertion fn into lib - -2015-05-12 Tim Lauridsen - - * src/yumex/dnf_backend.py, src/yumex/gui/widgets.py, - src/yumex/misc.py: add package requirement page to package info (#8) - - -2015-05-12 Tim Lauridsen - - * src/yumex/__init__.py: separate gpg errors with other transaction - errors - -2015-05-12 Tim Lauridsen - - * src/yumex/__init__.py: show packages with problem when building - transaction - -2015-05-10 Tim Lauridsen - - * po/ar.po, po/bg.po, po/bn_IN.po, po/cmn.po, po/cs.po, po/da.po, - po/de.po, po/el.po, po/es.po, po/es_ES.po, po/fa.po, po/fr.po, - po/gu.po, po/hu.po, po/id.po, po/it.po, po/ja.po, po/ko.po, - po/ky.po, po/nl.po, po/pl.po, po/pt.po, po/pt_BR.po, po/ru.po, - po/sk.po, po/sr.po, po/sr@latin.po, po/tr_TR.po, po/uk.po, - po/yumex-dnf.pot, po/zh_CN.po, po/zh_TW.po: Translation update - (transifex) - -2015-05-06 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-05-06 Tim Lauridsen - - * dbus/dbus_status.py, setup.py, src/yumex/const.py, yumex-dnf.spec: - bumped version to 4.1.2 - -2015-05-06 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: protect against removing - yumex-dnf and req. (#29) - -2015-05-06 Tim Lauridsen - - * src/yumex/__init__.py: refresh search when newest_only is - changed.(#30) - -2015-05-04 Tim Lauridsen - - * src/yumex/gui/widgets.py: Only active arch menu using left click - Right click makes strange problems (RhBug: 1217730) - -2015-04-30 Tim Lauridsen - - * dbus/dbus_status.py: dont show statusicon while working, if it is - disabed (#27) - -2015-04-30 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: fix: yumex notification - icon launch fails if no yumex.conf (RhBug: 1217165) - -2015-04-30 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py, - src/yumex/gui/widgets.py: make the saved arch filter work on first - start (#28) - -2015-04-30 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/status.py: fix: better handling - of errors starting notification icon (RhBug: 1217241) - -2015-04-30 Tim Lauridsen - - * src/yumex/const.py, src/yumex/gui/widgets.py, src/yumex/misc.py: - remember arch menu selections between sessions (#28) - -2015-04-29 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: Remove skipbroken - option, not used by dnf - -2015-04-29 Tim Lauridsen - - * src/yumex/const.py: map ADVISORY_UNKNOWN to 'New Package' (RhBug: - 1216192) - -2015-04-29 Tim Lauridsen - - * src/yumex/__init__.py: changes locations where looking for custom - styling looking for ~/.themes/**name**/apps/yumex.css - /usr/share/themes/**name**/apps/yumex.css (#26) - -2015-04-29 Tim Lauridsen - - * dbus/dbus_status.py: statusicon should use system dnddaemon, to no - reloading all metadata in users context. - -2015-04-29 Tim Lauridsen - - * setup.py, src/gtk-style.css, src/yumex/__init__.py: load custom - styling from current theme (#26) Add '--minimized' cmd option to - start yumex (#27) - -2015-04-29 Tim Lauridsen - - * src/yumex/__init__.py: fix: show error dialog on gpg check errors - - -2015-04-28 Tim Lauridsen - - * src/yumex/gui/views.py: Make downgrade/reinstall work as expected - (#16) - -2015-04-28 Tim Lauridsen - - * src/yumex/gui/views.py, src/yumex/gui/widgets.py: set styling name - to toolbar & packageview (#26) - -2015-04-28 Tim Lauridsen - - * src/yumex/__init__.py: set styling name to main window (#26) - -2015-04-28 Tim Lauridsen - - * src/yumex.ui: ui adjustments - -2015-04-28 Tim Lauridsen - - * src/yumex.ui: change toolbar execute to GtkMenuButton - -2015-04-28 Tim Lauridsen - - * src/yumex/__init__.py: add 'apps.yumex-dnf' as application id - -2015-04-27 Tim Lauridsen - - * src/yumex/__init__.py: better debug output move ClearTransaction - -2015-04-27 Tim Lauridsen - - * src/yumex/gui/views.py: import downgrade/reinstall menu - -2015-04-27 Tim Lauridsen - - * src/yumex/gui/views.py: add package view right click menu with - reinstall & downgrade (#16) - -2015-04-27 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/gui/views.py: fix: make - downgrades work (#16) - -2015-04-27 Tim Lauridsen - - * src/yumex/__init__.py: Added support for handling of gpgkey - import. (#6, RhBug: 1215428) - -2015-04-26 Tim Lauridsen - - * po/yumex-dnf.pot: Transfix push, yumex-dnf.pot update - -2015-04-26 Tim Lauridsen - - Merge pull request #25 from piotrdrag/master Improve some - strings - -2015-04-26 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-04-26 Tim Lauridsen - - * src/yumex/const.py, yumex-dnf.spec: bumped version to 4.1.1 - -2015-04-26 Piotr Drąg - - * dbus/dbus_status.py, misc/yumex-dnf.appdata.xml.in, - misc/yumex-dnf.desktop.in, src/yumex.ui, src/yumex/__init__.py, - src/yumex/const.py, src/yumex/dnf_backend.py, - src/yumex/gui/dialogs.py, src/yumex/gui/widgets.py: Improve some - strings - -2015-04-26 Tim Lauridsen - - * dbus/dbus_status.py: pep8: fixes - -2015-04-26 Tim Lauridsen - - * po/yumex-dnf.pot: Transfix push, yumex-dnf.pot update - -2015-04-26 Tim Lauridsen - - * dbus/dbus_status.py: Added translation wrappers - -2015-04-26 Tim Lauridsen - - * dbus/dbus_status.py: increase the update notification timeout to - 10s - -2015-04-26 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/__init__.py: Added --updateall - there will apply all pending updates * make apply from status icon - notification launch yumex with --updateall * fix: hide status icon - when no updates is found (#23) - -2015-04-26 Tim Lauridsen - - * Makefile, src/yumex.ui, src/yumex/gui/dialogs.py, - src/yumex/misc.py: move all status icon setting to a separate page - in pref. added notification on update to pref. added show only icon - when updates to pref added Makefile targets to test statusicon dbus - daemon (#23) - -2015-04-26 Tim Lauridsen - - * dbus/dbus_status.py: Add notifcation to statusicon update checker - and setting to hide icon if no updates. (#23) - -2015-04-25 Tim Lauridsen - - * dbus/Makefile, dbus/dbus_status.py, src/yumex/misc.py: Add - configurable notification on update - -2015-04-25 Tim Lauridsen - - * README.md: doc: update readme - -2015-04-24 Tim Lauridsen - - * src/yumex.ui, src/yumex/gui/dialogs.py: save selected - repositories, if "save selected repositories" is enabled (RhBug: - 1214062) - -2015-04-24 Tim Lauridsen - - * src/yumex/__init__.py: set enabled repos from config, if - repo_saved is set - -2015-04-24 Tim Lauridsen - - * src/yumex/misc.py: Add options to save enabled repositories - -2015-04-24 Tim Lauridsen - - * src/yumex.ui: added save checkbox to repo perferences Added more - and better tooltip to options in preferences - -2015-04-23 Tim Lauridsen - - * src/yumex/gui/widgets.py: enable package info file list view - supported in dnf-daemon by this commit - - https://github.com/timlau/dnf-daemon/commit/f2ee3eda585e4aab3de7bf6197359f04848a2c67 - -2015-04-23 Tim Lauridsen - - * src/yumex/gui/widgets.py: Don't show package info tabs for - changelog, filelist & requirement The dnfdaemon/dnf backend dont - support it yet - -2015-04-23 Tim Lauridsen - - * src/yumex/const.py, src/yumex/gui/widgets.py: Added support of - showing update information about fedora updates (Fixes #5 & RhBug: - 1121946) requires dnfdaemon >= 0.3.7 for supplying update - information - -2015-04-23 Tim Lauridsen - - * src/yumex/gui/views.py: fix: don't show hand cursor outside link - in package info (Fixes RhBug #1214050) - -2015-04-23 Tim Lauridsen - - * src/yumex/__init__.py: fix: arch_menu traceback (fixes RhBug: - 1214045) - -2015-04-23 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/dialogs.py, - src/yumex/misc.py: Added option to auto select all available updates - at startup (Fixes #22 & RhBug: 1214052) - -2015-04-23 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/gui/widgets.py: refactor: move - HeaderBar and ToolBar to gui/widgets - -2015-04-23 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: save window size and - maximize state between sessions (fixes #18 & RhBug: 1214047) - -2015-04-22 Tim Lauridsen - - * src/yumex/__init__.py: fix: set right search type from config, not - just ui - -2015-04-22 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: Strech searchbox to use - available space (fixes #19 & RhBug: 1214059) - -2015-04-22 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/config.py, src/yumex/misc.py: - save search option between session (fixes #20 & RhBug: 1214057) - -2015-04-22 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: set search defaults from - config settings - -2015-04-22 Tim Lauridsen - - * src/yumex/__init__.py: add some padding below titlebar (Fixes #20 - & RhBug: 1214057) - -2015-04-16 Tim Lauridsen - - * yumex-dnf.spec: require latest dnfdaemon - -2015-04-16 Tim Lauridsen - - * src/yumex/gui/dialogs.py: make replaces look better in transaction - result dialog - -2015-04-16 Tim Lauridsen - - * src/yumex/__init__.py: Revert "dont show obsoletes as updates, - that gives strange results" This reverts commit - 11ab683ef9cd1a18c0dde1acedbe51871bbf615d. - -2015-04-16 Tim Lauridsen - - * src/yumex/const.py: Revert "support for showing obsoletes as own - category in transaction dialog" This reverts commit - 008065311b07a55ab3124a955c4c6b7306217598. - -2015-04-13 Tim Lauridsen - - * src/yumex/const.py: support for showing obsoletes as own category - in transaction dialog - -2015-04-14 Tim Lauridsen - - * docs/faq.rst, docs/img/error-running.png, docs/main.rst: doc: - update info about yumex is already running Add faq entry about - selecting all updates - -2015-04-13 Tim Lauridsen - - * .tx/config, po/ar.po, po/bg.po, po/bn_IN.po, po/cmn.po, po/cs.po, - po/da.po, po/de.po, po/el.po, po/es.po, po/es_ES.po, po/fa.po, - po/fr.po, po/gu.po, po/hu.po, po/id.po, po/it.po, po/ja.po, - po/ko.po, po/ky.po, po/nl.po, po/pl.po, po/pt.po, po/pt_BR.po, - po/ru.po, po/sk.po, po/sr.po, po/sr@latin.po, po/tr_TR.po, - po/uk.po, po/yumex-dnf.pot, po/zh_CN.po, po/zh_TW.po: update - translations - -2015-04-12 Tim Lauridsen - - * src/yumex/__init__.py: dont show obsoletes as updates, that gives - strange results - -2015-04-12 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-04-12 Tim Lauridsen - - * yumex-dnf.spec: bumped version to 4.1.0 - -2015-04-12 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-04-12 Tim Lauridsen - - * src/yumex/const.py, yumex-dnf.spec: bumped version to 4.1.0 - -2015-04-11 Tim Lauridsen - - * yumex-dnf.spec: fix more fedora review issues - -2015-04-11 Tim Lauridsen - - * src/yumex/misc.py: fix cut & paste error - -2015-04-11 Tim Lauridsen - - * README.md, yumex-dnf.spec: fix review issues - -2015-04-11 Tim Lauridsen - - * COPYING, dbus/dbus_status.py, src/main.py, src/yumex/__init__.py, - src/yumex/backend.py, src/yumex/config.py, src/yumex/const.py, - src/yumex/dnf_backend.py, src/yumex/gui/__init__.py, - src/yumex/gui/dialogs.py, src/yumex/gui/views.py, - src/yumex/gui/widgets.py, src/yumex/misc.py, src/yumex/status.py: - update fsf address - -2015-04-10 Tim Lauridsen - - * src/yumex/misc.py: check is GDMSESSION exits (Fixes #12) - -2015-04-09 Tim Lauridsen - - * src/yumex/gui/widgets.py: better requirement message - -2015-04-09 Tim Lauridsen - - * src/yumex.ui: make some tool tips better - -2015-04-09 Tim Lauridsen - - * src/gtk-style.css: fix gtk css stylling - -2015-04-09 Tim Lauridsen - - * src/yumex/gui/views.py: Use at text label, not an image in - selection column - -2015-04-09 Tim Lauridsen - - * setup.py, src/gtk-style.css, src/yumex/__init__.py, - src/yumex/gui/views.py: add custom gtk styling - -2015-04-09 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-04-09 Tim Lauridsen - - * src/yumex/const.py, yumex-dnf.spec: bumped version to 4.0.10 - -2015-04-09 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/__init__.py: Make yumex already - running better - -2015-04-09 Tim Lauridsen - - * src/yumex/misc.py: fix detection of gnome - -2015-04-09 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/__init__.py, src/yumex/status.py: - show yumex ui always if started again an working in the background - -2015-04-09 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/__init__.py, - src/yumex/gui/dialogs.py, src/yumex/status.py: make better handling - of yumex is started twice - -2015-04-08 Tim Lauridsen - - * src/yumex/gui/views.py: Add an icon to the selection column header - - -2015-04-07 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-04-07 Tim Lauridsen - - * yumex-dnf.spec: bumped version to 4.0.9 - -2015-04-07 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2015-04-07 Tim Lauridsen - - * src/yumex/const.py, yumex-dnf.spec: bumped version to 4.0.9 - -2015-04-07 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/gui/dialogs.py, - src/yumex/misc.py: Make toolbar in headerbar an config option. - Enabled by default in gnome, and disabled in other DE's - -2014-10-21 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2014-10-21 Tim Lauridsen - - * src/yumex/const.py, yumex-dnf.spec: bumped version to 4.0.8 - -2014-10-15 Tim Lauridsen - - * yumex-dnf.spec: build: require python3-dnfdaemon - -2014-10-11 Tim Lauridsen - - * src/yumex/const.py, src/yumex/gui/widgets.py: fix: only show - fedora packages links for packages in fedora repos - -2014-10-06 Tim Lauridsen - - * Makefile: build: use dnf update for test-inst target, in dnf 6.2, - it will only do the action your ask for - -2014-10-03 Tim Lauridsen - - * src/yumex/__init__.py: add close button again - -2014-10-02 Tim Lauridsen - - * gfx/yumex-icon.png, gfx/yumex-icon.svg: Use FRENZY Software - Manager icons - -2014-09-25 Tim Lauridsen - - * src/yumex.ui: ui: minor headerbar adjustments - -2014-09-25 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: ui: use standard gtk+ spinner - - -2014-09-25 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: fix: make main menu quit work - - -2014-09-24 Tim Lauridsen - - * src/yumex/const.py, src/yumex/dnf_backend.py: ui: added progress - for package verify after transaction is completted - -2014-09-24 Tim Lauridsen - - * src/yumex/__init__.py: ui: add dummy quit menu handler - -2014-09-24 Tim Lauridsen - - * src/yumex/__init__.py: ui: don't show windows close in headerbar, - looks bad in non-gnome - -2014-09-23 Tim Lauridsen - - * src/yumex/__init__.py: fix: make search entry, undo icon work - -2014-09-23 Tim Lauridsen - - * src/yumex.ui: cleanup: remove deprecated Gtk - -2014-09-23 Tim Lauridsen - - * src/yumex/gui/dialogs.py: fix: only set transient_for if we have a - parent window - -2014-09-23 Tim Lauridsen - - * src/yumex/dnf_backend.py: fix: don't traceback when user cancel - PolicyKit dialog - -2014-09-23 Tim Lauridsen - - * src/yumex/__init__.py: fix: don't reset backend if user cancel the - transaction confirmation - -2014-09-23 Tim Lauridsen - - * src/yumex/gui/dialogs.py: cleanup: use transient_for instead of - deprecated parent - -2014-09-23 Tim Lauridsen - - * po/yumex-dnf.pot: i18n: updated .pot file - -2014-09-23 Tim Lauridsen - - * .tx/config: i18: updated and push .pot file to transifex - -2014-09-23 Tim Lauridsen - - * src/yumex/gui/widgets.py: ui: added tooltip to package info - buttons - -2014-09-22 Tim Lauridsen - - * src/yumex/gui/widgets.py: fix: url does not have correct target - -2014-09-21 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2014-09-21 Tim Lauridsen - - * src/yumex/const.py, yumex-dnf.spec: bumped version to 4.0.7 - -2014-09-21 Tim Lauridsen - - * src/yumex.ui, src/yumex/gui/widgets.py: cleanup: gtk 3.12 - deprecated ui - -2014-09-18 Tim Lauridsen - - * src/yumex.ui: gui adjustments - -2014-09-08 Tim Lauridsen - - * src/yumex.ui: cleanup: dont use deprecated GtkMisc pad & alignment - - -2014-09-05 Tim Lauridsen - - * src/yumex.ui, src/yumex/gui/views.py: cleanup: deprecated Gtk - -2014-09-05 Tim Lauridsen - - * src/yumex.ui: fix: load and save with glade 3.18.3 (Gtk 3.12) - -2014-09-05 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/backend.py, src/yumex/const.py, - src/yumex/dnf_backend.py: fix: better exception handling when Dbus - backend dies - -2014-09-05 Tim Lauridsen - - * src/yumex/gui/dialogs.py, src/yumex/gui/views.py: fix: deprecated - Gtk stuff - -2014-09-02 Tim - - * ChangeLog: updated ChangeLog - -2014-09-02 Tim - - * src/yumex/const.py, yumex-dnf.spec: bumped version to 4.0.6 - -2014-07-15 Tim Lauridsen - - * src/yumex/const.py: fix callback on downgrade message - -2014-06-21 Tim Lauridsen - - * src/yumex.ui, src/yumex/misc.py: Fix the language setup, so - Gtk.builder get translated - -2014-06-21 Tim Lauridsen - - * po/ar.po, po/bg.po, po/bn_IN.po, po/cmn.po, po/cs.po, po/da.po, - po/de.po, po/el.po, po/es.po, po/es_ES.po, po/fa.po, po/fr.po, - po/gu.po, po/hu.po, po/id.po, po/it.po, po/ja.po, po/ko.po, - po/ky.po, po/nl.po, po/pl.po, po/pt.po, po/pt_BR.po, po/ru.po, - po/sk.po, po/sr.po, po/sr@latin.po, po/tr_TR.po, po/uk.po, - po/yumex-dnf.pot, po/zh_CN.po, po/zh_TW.po: i18n: updated - translations - -2014-06-21 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/__init__.py: Set translation domain - for GtkBuilder, use right translation domain for notification domain - - -2014-06-09 Tim Lauridsen - - * src/yumex/misc.py: i18n: use the yumex-dnf translation domain - -2014-06-08 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: Adjust headerbar - -2014-06-06 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2014-06-06 Tim Lauridsen - - * setup.py, src/yumex/const.py, yumex-dnf.spec: bumped version to - 4.0.5 - -2014-06-03 Tim Lauridsen - - * src/yumex/gui/widgets.py: encode package names with '-', when used - in url - -2014-06-03 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py, - src/yumex/gui/views.py, src/yumex/gui/widgets.py: added fedora - packages links to package info - -2014-06-02 Tim Lauridsen - - * src/yumex/__init__.py: reset main menu selection on reload after - processed transaction - -2014-06-02 Tim Lauridsen - - * src/yumex/gui/views.py: reset group selection state when populated - - -2014-05-12 Tim Lauridsen - - * src/yumex/__init__.py: cleanup: docstring, single/double quotes, - remove unused code - -2014-05-12 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/dnf_backend.py, - src/yumex/gui/views.py: cleanup: doc strings and minor refactoring - -2014-05-12 Tim Lauridsen - - * src/yumex/gui/widgets.py: cleanup : imports - -2014-05-12 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/backend.py, src/yumex/config.py, - src/yumex/const.py, src/yumex/gui/dialogs.py, src/yumex/misc.py, - src/yumex/status.py: cleanup imports - -2014-05-12 Tim Lauridsen - - * src/yumex/dnf_backend.py: cleanup code (PEP8) and no wildcard - imports - -2014-05-09 Tim Lauridsen - - * src/yumex/dnf_backend.py, src/yumex/misc.py: use new dnfdaemon - GetPackges, the works with attrs - -2014-05-09 Tim Lauridsen - - * dbus/dbus_status.py: cleanup: fixed pep8 issues - -2014-05-09 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2014-05-09 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/const.py, yumex-dnf.spec: bumped - version to 4.0.4 - -2014-05-09 Tim Lauridsen - - * dbus/dbus_status.py, src/yumex/dnf_backend.py, - src/yumex/gui/widgets.py, src/yumex/misc.py: adjust to dnfdaemon - code changes - -2014-05-03 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2014-05-03 Tim Lauridsen - - * docs/conf.py, src/yumex/const.py, yumex-dnf.spec: bumped version - to 4.0.3 - -2014-04-25 Tim Lauridsen - - * src/yumex/config.py, src/yumex/misc.py: code cleanup - -2014-04-10 Tim Lauridsen - - * setup.py: cleanup: removed unused exports - -2014-04-10 Tim Lauridsen - - * .tx/config, misc/yumex-dnf.appdata.xml.in, po/yumex-dnf.pot: fix: - typo in appdata file - -2014-04-10 Tim Lauridsen - - * po/yumex-dnf.pot: i18n: update .pot file - -2014-04-10 Tim Lauridsen - - * src/yumex/backend.py, src/yumex/const.py, - src/yumex/dnf_backend.py, src/yumex/gui/dialogs.py, - src/yumex/gui/views.py, src/yumex/gui/widgets.py: cleanup: PEP8 - issues - -2014-04-10 Tim Lauridsen - - * src/main.py, src/yumex/__init__.py, src/yumex/backend.py, - src/yumex/config.py, src/yumex/const.py, src/yumex/dnf_backend.py, - src/yumex/misc.py: fix. use absolute imports in all modules - -2014-04-10 Tim Lauridsen - - * src/yumex/__init__.py: fix absolute imports - -2014-04-10 Tim Lauridsen - - * setup.py: build: install yumex.gui sub module - -2014-04-10 Tim Lauridsen - - * po/ar.po, po/bg.po, po/bn_IN.po, po/cmn.po, po/cs.po, po/da.po, - po/de.po, po/el.po, po/es.po, po/es_ES.po, po/fa.po, po/fr.po, - po/gu.po, po/hu.po, po/id.po, po/it.po, po/ja.po, po/ko.po, - po/ky.po, po/nl.po, po/pl.po, po/pt.po, po/pt_BR.po, po/ru.po, - po/sk.po, po/sr.po, po/sr@latin.po, po/tr_TR.po, po/uk.po, - po/zh_CN.po, po/zh_TW.po: pull translations from transifex - -2014-04-10 Tim Lauridsen - - * misc/yumex-dnf.appdata.xml.in, po/yumex-dnf.pot: fix: split up - appdata translation in more elements - -2014-04-09 Tim Lauridsen - - * misc/Makefile, misc/yumex-dnf.appdata.xml.in, po/Makefile, - po/POTFILES.in, po/yumex-dnf.pot, yumex-dnf.spec: add appdata file - -2014-04-09 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/backend.py, src/yumex/config.py, - src/yumex/const.py, src/yumex/dnf_backend.py, - src/yumex/gui/__init__.py, src/yumex/gui/dialogs.py, - src/yumex/gui/views.py, src/yumex/gui/widgets.py, - src/yumex/misc.py, src/yumex/status.py: cleanup: make the code - follow PEP8 - -2014-04-02 Tim Lauridsen - - * src/main.py, src/yumex/__init__.py, src/yumex/gui/__init__.py, - src/yumex/gui/dialogs.py, src/yumex/gui/views.py, - src/yumex/gui/widgets.py, src/yumex/misc.py, src/yumex/widgets.py: - refactor: split yumex.widget into yumex.gui.views, dialogs, widgets - - -2014-04-01 Tim Lauridsen - - * .tx/config: fix: only pull yumex-dnf translations from transiflex - - -2014-04-01 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2014-04-01 Tim Lauridsen - - * docs/conf.py, setup.py, src/yumex/const.py, yumex-dnf.spec: bumped - version to 4.0.2 - -2014-04-01 Tim Lauridsen - - * po/ar.po, po/bg.po, po/bn_IN.po, po/cmn.po, po/cs.po, po/da.po, - po/de.po, po/el.po, po/es.po, po/es_ES.po, po/fa.po, po/fr.po, - po/gu.po, po/hu.po, po/id.po, po/it.po, po/ja.po, po/ko.po, - po/ky.po, po/nl.po, po/pl.po, po/pt.po, po/pt_BR.po, po/ru.po, - po/sk.po, po/sr.po, po/sr@latin.po, po/tr_TR.po, po/uk.po, - po/yumex-dnf.pot, po/zh_CN.po, po/zh_TW.po: update .pot & pull po - from transifex - -2014-04-01 Tim Lauridsen - - * src/yumex/widgets.py: optimize: setting fixed heigt in TreeView - makes adding package 10x faster :) - -2014-04-01 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py: add: added code for - installing and removing groups - -2014-04-01 Tim Lauridsen - - * src/yumex/widgets.py: add: group view: show group install state as - stared/non-started icon - -2014-04-01 Tim Lauridsen - - * src/yumex/dnf_backend.py, src/yumex/widgets.py: refactor: group - should be reprecented as python objects in group view, to make it - possible to unselect the group, when remove from the queue view. - -2014-03-31 Tim Lauridsen - - * src/yumex/widgets.py: add: groups are objects, add groups to - queue, not packages - -2014-03-31 Tim Lauridsen - - * docs/main.rst, po/POTFILES.in, po/yumex-dnf.pot, - src/yumex/__init__.py: translation: rename yum to dnf in strings & - rebuild .pot file doc: added link to translation page at transifex - -2014-03-31 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/const.py, - src/yumex/widgets.py: add: added Help to main menu, with About - Dialog & Online docs - -2014-03-31 Tim Lauridsen - - * docs/faq.rst, docs/img/error-running.png: doc: added debug info to - FAQ - -2014-03-31 Tim Lauridsen - - * docs/index.rst: doc: remove indexes etc, this is not python api - docs. - -2014-03-31 Tim Lauridsen - - * docs/faq.rst, docs/index.rst, docs/main.rst: doc: added FAQ and - updated doc - -2014-03-30 Tim Lauridsen - - * src/yumex.ui, src/yumex/dnf_backend.py: fix: pending queue right - click menu not shown - -2014-03-30 Tim Lauridsen - - * .gitignore, docs/Makefile, docs/conf.py, docs/img/arch-menu.png, - docs/img/button-apply.png, docs/img/button-filters.png, - docs/img/button-main-menu.png, docs/img/button-search-options.png, - docs/img/button-search-options.svg, docs/img/filter-menu.png, - docs/img/filters.png, docs/img/groups.png, docs/img/history.png, - docs/img/main-menu.png, docs/img/options.png, - docs/img/package-info.png, docs/img/queue.png, - docs/img/search-bar.png, docs/img/search-options.png, - docs/img/search.png, docs/img/top-bar.png, - docs/img/updates-selection.png, docs/img/updates.png, - docs/index.rst, docs/main.rst: doc: Added docs - -2014-03-29 Tim Lauridsen - - * ChangeLog: updated ChangeLog - -2014-03-29 Tim Lauridsen - - * Makefile, dbus/dbus_status.py, src/yumex/const.py, yumex-dnf.spec: - bumped version to 4.0.1 - -2014-03-28 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py: cleanup: remove - unsued code - -2014-03-28 Tim Lauridsen - - * src/yumex/misc.py: cleanup: removed unused conf option - -2014-03-28 Tim Lauridsen - - * src/yumex/__init__.py: fix: filtering of seach result - -2014-03-28 Tim Lauridsen - - * src/yumex/__init__.py: fix: clear search entry on reset & set - forcus on search entry when packages is loaded - -2014-03-28 Tim Lauridsen - - * src/yumex/dnf_backend.py: refactor: move attr to var - -2014-03-28 Tim Lauridsen - - * src/yumex/dnf_backend.py: fix; use DnfSystem.GetPackagesByName, - not DnfSystem.GetPackagesByNameWithAttr - -2014-03-28 Tim Lauridsen - - * src/yumex/dnf_backend.py: fix; use DnfSystem.Search, not - DnfSystem.SearchWithAttr - -2014-03-28 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/dnf_backend.py, - src/yumex/yum_backend.py: add: always use the dnf root backend, to - avoid the mess with 2 caches, there can be different - -2014-03-28 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/const.py, - src/yumex/widgets.py: add: Use Gtk.Stack for main content and - Gtk.Revealer from Gtk 3.10, to show animations, when changing pages - and let the infobar slide down. - -2014-03-27 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: add: make prefix the default - search type - -2014-03-27 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/yum_backend.py: optimize: make - search faster by using new dnfdeamon API to get attributes with the - search results - -2014-03-27 Tim Lauridsen - - * yumex-dnf.spec: build: we need python3-gobject >= 3.10, as we new - stuff from gtk-3.10 - -2014-03-26 Tim Lauridsen - - * .gitignore, src/yumex.ui, src/yumex/__init__.py, - src/yumex/const.py, src/yumex/widgets.py, src/yumex/yum_backend.py: - add: add new yumex ui - -2014-03-21 Tim Lauridsen - - * src/yumex/__init__.py: cleanup: change error message on download - errors to be more generic - -2014-03-21 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: fix: show information is - dnf cache can't be refreshed - -2014-03-20 Tim Lauridsen - - * src/yumex/__init__.py: add: show download errors, if download - bails out - -2014-03-20 Tim Lauridsen - - * src/yumex.ui, src/yumex/widgets.py: add: add ui for setting the - expire cache interval in perferences - -2014-03-20 Tim Lauridsen - - * src/yumex/__init__.py: add: show if there is to many errors in - downloads - -2014-03-20 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: add: make time between - cache expire a number of hours - -2014-03-20 Tim Lauridsen - - * src/yumex/__init__.py: refactor: cleanup the cache expire check - -2014-03-19 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py: add: only expire dnf - cache once every day - -2014-03-19 Tim Lauridsen - - * po/da.po, po/yumex-dnf.pot, src/yumex.ui, src/yumex/widgets.py: - cleanup: fix typos - -2014-03-19 Tim Lauridsen - - * tools/repo-build.py, tools/syncrepo.sh: removed unused repo build - tools, we use Copr now - -2014-03-19 Tim Lauridsen - - * .gitignore, po/da.mo: remove .mo binary translation files - -2014-03-19 Tim Lauridsen - - * .tx/config, Makefile: Added support for translation files from - transifex - -2014-03-19 Tim Lauridsen - - * po/POTFILES.in, po/da.po, po/yumex-dnf.pot: updated translation - source - -2014-03-18 Tim Lauridsen - - * src/yumex/widgets.py, src/yumex/yum_backend.py: fix: show obsletes - af fullname, not pkg_id - -2014-03-17 Tim Lauridsen - - * src/yumex/yum_backend.py: add: show number of files download in - progress - -2014-03-17 Tim Lauridsen - - * src/yumex/__init__.py: fix: make sure the gui is setup, before - setting up the dnf backend, so ww can show the progress - -2014-03-16 Tim Lauridsen - - * src/yumex/yum_backend.py: add: rpm progress logging in debug mode - - -2014-03-15 Tim Lauridsen - - * src/yumex/yum_backend.py: add: show package download in Mb,Kb ... - - -2014-03-15 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py, src/yumex/widgets.py, - src/yumex/yum_backend.py: cleanup: remove some unused code - -2014-03-14 Tim Lauridsen - - * yumex-dnf.spec: cleanup: remove used python2 requirements - -2014-03-14 Tim Lauridsen - - * dbus/dbus_status.py: refactor: convert yumex statusicon Dbus - service to python3 - -2014-03-14 Tim Lauridsen - - * src/yumex/const.py: cleanup: remove constants not used by - dnf-daemon - -2014-03-14 Tim Lauridsen - - * src/yumex/const.py: fix: support Downgrades in transaction result - dialog - -2014-03-14 Tim Lauridsen - - * src/yumex/__init__.py: fix: better handling af ui after - transaction is completed or aborted - -2014-03-14 Tim Lauridsen - - * src/yumex/const.py: fix: dont fail if there is obsoletes in search - result - -2014-03-14 Tim Lauridsen - - * src/yumex/__init__.py: fix: handling af depsolve errors - -2014-03-13 Tim Lauridsen - - * src/yumex/__init__.py: fix: close yumex nicely on lock error - -2014-03-13 Tim Lauridsen - - * src/yumex/__init__.py: fix: yumex-dnf --exit shoud close the - DnfSystem DBus service also - -2014-03-13 Tim Lauridsen - - * src/yumex/__init__.py: fix: cleanup cmdline install code to work - with dnf-daemon - -2014-03-13 Tim Lauridsen - - * src/yumex/__init__.py: fix: dont refresh metadata, when running - install from cmdline - -2014-03-13 Tim Lauridsen - - * Makefile: fix: update test-cleanup Makefile tag to use the new git - branch (master) - -2014-03-13 Tim Lauridsen - - * src/yumex/__init__.py: fix: AttributeError: 'YumexInstallWindow' - object has no attribute 'set_working' - -2014-03-13 Tim Lauridsen - - * Makefile, README.md: Updated README and Makefile cleanup - -2014-03-12 Tim Lauridsen - - * src/yumex/yum_backend.py: more debug info to logging cleanup some - unused code - -2014-03-12 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/yum_backend.py: group packages - optimizations - -2014-03-12 Tim Lauridsen - - * Makefile: use dnf for test-inst target in Makefile - -2014-03-12 Tim Lauridsen - - * .gitignore, src/yumex.ui, src/yumex/__init__.py, - src/yumex/const.py, src/yumex/widgets.py: Remove skip-broken option, - dont exist in dnf - -2014-03-12 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/yum_backend.py: Refresh dnf - metadata on startup - -2014-03-12 Tim Lauridsen - - * src/yumex/yum_backend.py: Added file download progress - -2014-03-11 Tim Lauridsen - - * Makefile, dbus/Makefile, dbus/dbus_status.py, - dbus/dk.yumex.StatusIcon.service, gfx/Makefile, misc/Makefile, - misc/yumex-dnf-autostart.desktop, misc/yumex-dnf-local.desktop.in, - misc/yumex-dnf.desktop.in, misc/yumex-nextgen-autostart.desktop, - misc/yumex-nextgen-local.desktop.in, misc/yumex-nextgen.desktop.in, - po/Makefile, po/POTFILES.in, po/da.mo, po/da.po, po/yumex-dnf.pot, - po/yumex-nextgen.pot, setup.py, src/yumex/__init__.py, - src/yumex/const.py, src/yumex/misc.py, src/yumex/status.py, - src/yumex/widgets.py, yumex-dnf.spec, yumex-nextgen.spec: - yumex-nextgen -> yumex-dnf rename - -2014-03-11 Tim Lauridsen - - * .gitignore, src/yumex/__init__.py, src/yumex/yum_backend.py: Use - the dnfdaemon for packaging action - -2014-02-18 Tim Lauridsen - - * src/yumex.ui: Add some tooltips - -2014-02-18 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/misc.py, - src/yumex/widgets.py: Change the default window close action to exit - yumex add at setting in preferences to change the window close - action to just hide the window - -2013-11-15 Tim Lauridsen - - * Makefile: added python2-devel to get-builddeps - -2013-11-15 Tim Lauridsen - - * src/yumex/__init__.py: fix search is not working after a - transaction is performed - -2013-10-27 Tim Lauridsen - - * src/yumex/const.py: added 'i386' to arch filter, many 3 party pkgs - is i386 - -2013-10-24 Tim Lauridsen - - * Makefile, dbus/Makefile, dbus/dbus_status.py, gfx/Makefile, - misc/Makefile, po/Makefile, po/POTFILES.in, po/yumex-nextgen.pot, - setup.py, src/Makefile, src/dbus_status.py, src/yumex/Makefile, - yumex-nextgen.spec: Changed the way yumex is build - use setup.py - - use Makefile in subdirs - -2013-10-23 Tim Lauridsen - - * src/yumex/widgets.py, tools/repo-build.py: - Show project url in package description (Issue #169 - clean rpms - before upload to repo - -2013-10-23 Tim Lauridsen - - Merge pull request #17 from genodeftest/patch-1 remove typos: - "Used Requirment" -> "Unused Requirement" - -2013-10-22 Christian Stadelmann - - * src/yumex.ui: remove typos: "Used Requirment" -> "Unused - Requirement" - -2013-10-16 Tim Lauridsen - - * src/yumex/__init__.py: added docstrings - -2013-10-16 Tim Lauridsen - - * src/yumex/__init__.py: make sure view get updated, when we clear - the search entry and the previous pkg fliter is the same as the - current search pkg filter. - -2013-10-16 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py: Add package filtering - (updates, installed) on search results - -2013-10-15 tim - - * src/yumex/widgets.py: make select column wider so check mark will - fit on adwaita gtk3 theme - -2013-10-15 Tim Lauridsen - - * tools/syncrepo.sh: fixed syncrepo delete old .rpms before upload - -2013-10-14 Tim Lauridsen - - * Makefile, tools/makerepo.sh, tools/repo-build.py, - tools/update-repo.sh: Added new mock_build target and build helper - -2013-10-13 Tim Lauridsen - - * Makefile, tools/makerepo.sh, tools/syncrepo.sh, - tools/update-repo.sh: add mock-build target to Makefile added script - to build repo and upload to fedorapeople.org - -2013-10-12 Tim Lauridsen - - * Makefile: make test-release should not remove the whole ~/rpmbuild - tree - -2013-10-12 Tim Lauridsen - - * src/yumex/__init__.py: tell user if queue is empty - -2013-10-11 Tim Lauridsen - - * src/yumex/__init__.py: - Make search entry insensitive on non package pages - minor - refactoring - -2013-10-11 Tim Lauridsen - - * src/yumex/__init__.py: reset group package view after transaction - is ended - -2013-10-11 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/yum_backend.py: better handling - of locked and not authorized error when getting the root backend - -2013-10-11 Tim Lauridsen - - * src/yumex/__init__.py: switch to group view, when processing - actions - -2013-10-11 Tim Lauridsen - - * src/yumex/const.py: Add support for armfp in arch menu - -2013-10-11 Tim Lauridsen - - * src/yumex/__init__.py: Also show obsoletes in update view - -2013-10-11 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/widgets.py: Added - Right Click - -2013-10-11 Tim Lauridsen - - * src/yumex.ui, src/yumex/const.py, src/yumex/widgets.py: Make the - arch menu entries reflect the current system - -2013-10-11 Tim Lauridsen - - * src/yumex/const.py: don't blow up if we dont have an arch list for - this system, just use a default - -2013-10-11 Tim Lauridsen - - * src/yumex/const.py: rpm report arch to i386 on a 32 bit system - -2013-10-10 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py: set archs based on - current system arch - -2013-10-10 Tim Lauridsen - - Merge branch 'future' of github.com:timlau/yumex into future - -2013-10-10 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/backend.py, - src/yumex/widgets.py, src/yumex/yum_backend.py: - minor toolbar button rearrange - adjusted debug logging - Added - GPG key import support - -2013-10-09 Tim Lauridsen - - * src/yumex.ui, src/yumex/backend.py, src/yumex/widgets.py: - minor toolbar button rearrange - adjusted debug logging - -2013-10-09 Tim Lauridsen - - * src/yumex/misc.py, src/yumex/widgets.py: Store colors in hex, the - rgb(R,G,B) notation dont work with markup like foreground="...." - -2013-10-07 Tim Lauridsen - - * src/yumex/widgets.py: When group is remove from queue, then the - group packages is always unselected - -2013-10-07 Tim Lauridsen - - * README.md: remove downgrade instructions from readme, dont make - sense as we install in parallel with stable yumex - -2013-10-07 Tim Lauridsen - - * src/yumex/__init__.py: make sure we dont search for "" - -2013-10-07 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py: change the search - entry so it only does auto search when searching only in package - names, when searching a wider scope, then first do the search when - return is pressed. - -2013-10-07 Tim Lauridsen - - * src/dbus_status.py: Start yumex when user click status icon and - there is available updates - -2013-10-07 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py: Click on selection - column header in group view, will switch between: - install all - packages in group (not already install) - remove all packages - already installed in group - back to initial selection Click on - selection column header in package view (updates only) will switch - between: - select all updates. - deselect all updates. - back to - initial selection Added '--exit' command line option to exit - session based dbus services started by a yumex (Status icon & - YumReadonlyBackend) - -2013-10-07 Tim Lauridsen - - * src/yumex/widgets.py: added some extra logging - -2013-10-04 Tim Lauridsen - - * src/Makefile, src/yumex.ui, src/yumex/__init__.py, - src/yumex/widgets.py, src/yumex/yum_backend.py: - Added group and category content - reworked package view to use - signals - extracted archmenu into ArchMenu object - made a package - info widget, so it can be reused for group view - -2013-10-03 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/const.py, - src/yumex/widgets.py, src/yumex/yum_backend.py: Inital support for - groups (not complete yet) - -2013-10-03 Tim Lauridsen - - * src/yumex/__init__.py: show package to install/remove using - command line handle local rpms special reset status icon working & - yumex is running on exception - -2013-10-03 Tim Lauridsen - - * COPYING, Makefile, misc/yumex-nextgen-local.desktop.in, - yumex-nextgen.spec: Add .desktop file for installation of local rpms - Updated requirments in .spec Add COPYING to be GPL complient - -2013-10-03 Tim Lauridsen - - * po/Makefile, po/POTFILES.in, po/yumex-nextgen.pot: changed - po/Makefile to add .ui files with [type: gettext/glade] prefix - rebuild .pot and POTFILES.in - -2013-10-03 Tim Lauridsen - - * src/yumex/__init__.py: Set working in status icon when running - --install / --remove actions from the command line - -2013-10-03 Tim Lauridsen - - * src/yumex.ui, src/yumex/widgets.py: Show a main label when - downloading extra metadata (changelog, filelists etc.) Minor ui - adjustments to info progress bar - -2013-10-03 Tim Lauridsen - - * Makefile: more PKGNAME -> APPNAME cleanup in Makefile - -2013-10-03 Tim Lauridsen - - * Makefile: fix wrong name in Makefile test-inst & test-reinst - -2013-10-02 Tim Lauridsen - - * Makefile, README.md: Updated README and minor Makefile adjustments - - -2013-10-02 Tim Lauridsen - - * src/yumex/__init__.py: If autostart and auto update checkis not - set then quitting, then exit the status icon else leave it running - -2013-10-02 Tim Lauridsen - - * src/dbus_status.py, src/yumex.ui, src/yumex/misc.py, - src/yumex/widgets.py: Added schduled update checker in status icon - Added update check interval and and startup delay to preferences - -2013-10-02 Tim Lauridsen - - * misc/yumex-nextgen-autostart.desktop, src/dbus_status.py, - src/yumex.ui, src/yumex/__init__.py: Added 'Start Yum Extender' to - status icon added '--icononly' option to yumex, it will only start - the status icon change autostart option in pref to start status icon - only - -2013-10-01 Tim Lauridsen - - * Makefile: Install small spinner icon - -2013-10-01 Tim Lauridsen - - * src/dbus_status.py, src/yumex/__init__.py, src/yumex/status.py: - Send signals from the status icon on actions and listen and do the - right action in the client. - -2013-10-01 Tim Lauridsen - - * Makefile, dbus/dk.yumex.StatusIcon.service, src/Makefile, - src/dbus_status.py, yumex-nextgen.spec: Added DBus based Status Icon - - -2013-10-01 Tim Lauridsen - - * gfx/spinner-small.gif, src/yumex.ui, src/yumex/__init__.py, - src/yumex/widgets.py, src/yumex/yum_backend.py: Added command line - install & remove support using --install package or --install - package. Using a smaller ui (only info progress bar) -y/--yes - command line option will disable questions and info dialogs when - running actions from the command line. Added small spinner to info - progress bar. - -2013-09-30 Tim Lauridsen - - * src/yumex/__init__.py: center window - -2013-09-30 Tim Lauridsen - - * src/yumex/widgets.py: Always show main label, when progress bar is - shown - -2013-09-30 Tim Lauridsen - - * src/yumex/yum_backend.py: Same progress output in non-root backend - as in root backend, when downloading metadata - -2013-09-30 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/const.py, - src/yumex/yum_backend.py: Better progress infomation when - downloading metadata - -2013-09-30 Tim Lauridsen - - * .gitignore, misc/yumex-nextgen.desktop.in, src/yumex.ui, - src/yumex/__init__.py, src/yumex/widgets.py: - minor ui adjustments - use the right yumex-nextgen icon - -2013-09-30 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/backend.py, - src/yumex/widgets.py, src/yumex/yum_backend.py: Better info/progress - bar look & feel Changed progress strings. minor code clean up - -2013-09-29 Tim Lauridsen - - * src/Makefile, src/yumex.ui, src/yumex/__init__.py, - src/yumex/backend.py, src/yumex/widgets.py, - src/yumex/yum_backend.py: Added arch filtering, click on the header - of the arch column to select to archs to show - -2013-09-28 Tim Lauridsen - - * src/yumex.ui, src/yumex/widgets.py: Change bg color of progress - infobar to very light gray - -2013-09-28 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: minor ui cleanup added - accelerator (dont work ) - -2013-09-28 Tim Lauridsen - - * src/yumex/widgets.py: - Make click on repo view selection column work - add tool tip to - repoview selection column - -2013-09-28 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/yum_backend.py: make we always - set the active repos in the root backend - -2013-09-27 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py, src/yumex/widgets.py, - src/yumex/yum_backend.py: Make changes to enabled repositories work - both in root and non-root backend - -2013-09-27 Tim Lauridsen - - * src/yumex/__init__.py: Make buttons insensitive when running - transaction - -2013-09-26 Tim Lauridsen - - * src/yumex.ui, src/yumex/widgets.py: added repositories to - preferences - -2013-09-26 Tim Lauridsen - - * src/yumex/widgets.py, src/yumex/yum_backend.py: added repositories - to preferences - -2013-09-26 Tim Lauridsen - - * Makefile: Added test-inst & test-reinst target to Makefile - -2013-09-26 Tim Lauridsen - - * src/yumex.ui, src/yumex/misc.py, src/yumex/widgets.py, - src/yumex/yum_backend.py: - change colors of differnt package types in preferences - make - package view use the config colors - -2013-09-26 Tim Lauridsen - - * src/yumex.ui: Adjusted Settings page in preference dialog - -2013-09-26 Tim Lauridsen - - * Makefile, misc/yumex-nextgen-autostart.desktop, src/yumex.ui, - src/yumex/__init__.py, src/yumex/const.py, src/yumex/misc.py, - src/yumex/widgets.py: - Added autostart - create a blank yumex.conf if it dont exists - - install spinner & tray icons - added default values for options in - perferences - -2013-09-26 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/config.py, - src/yumex/misc.py, src/yumex/widgets.py: - Add config classes from yum, migrated to python3 - Added inital - preference dialog - -2013-09-24 Tim Lauridsen - - Merge branch 'future' of github.com:timlau/yumex into future - -2013-09-24 Tim Lauridsen - - * src/yumex/__init__.py: fix show number of updates in status icon - -2013-09-23 Tim Lauridsen - - * src/yumex/__init__.py: fix error on exception - -2013-09-23 Tim Lauridsen - - * src/yumex.ui, src/yumex/yum_backend.py: updated tooltips for - search types - -2013-09-23 Tim Lauridsen - - * README.md, src/yumex/__init__.py, src/yumex/const.py, - src/yumex/yum_backend.py: search in pkgtags - -2013-09-23 Tim Lauridsen - - * src/yumex/widgets.py, src/yumex/yum_backend.py: show pkgtags in - description - -2013-09-23 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/yum_backend.py: - better output when showing packages under RPM Transaction - - removed used import - -2013-09-23 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py: Added main content - notebook page enums. Added doc strings Check if window is created in - shutdown handler - -2013-09-23 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/yum_backend.py: more output to - logger - -2013-09-22 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/misc.py, src/yumex/widgets.py: - debug output to debug logger - -2013-09-22 Tim Lauridsen - - * src/yumex/__init__.py: added logger on -d option - -2013-09-22 Tim Lauridsen - - * src/yumex/__init__.py: Added command line handler - -2013-09-22 Tim Lauridsen - - * src/yumex/__init__.py: windows close only hides the window - -2013-09-22 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/backend.py, src/yumex/const.py, - src/yumex/widgets.py, src/yumex/yum_backend.py: code formatting - -2013-09-22 Tim Lauridsen - - * src/yumex/__init__.py: minor refactoring - -2013-09-22 Tim Lauridsen - - * gfx/tray-error.png, gfx/tray-info.png, gfx/tray-no-updates.png, - gfx/tray-updates.png, gfx/tray-working.png, src/yumex/__init__.py, - src/yumex/const.py, src/yumex/widgets.py: - Migrated StatusIcon from yumex3.0 and make it work with gtk3 - Set - windows icon - -2013-09-20 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/misc.py, - src/yumex/widgets.py: - Added options to options menu - use newest_only option in search - - search again when search type is changed - -2013-09-20 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/yum_backend.py: - adjusted toolbar and added menu to pref button - -2013-09-20 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py: removed a lot of - debug print() statements - -2013-09-20 Tim Lauridsen - - * src/yumex/__init__.py: Show dialog message on problems in - transaction - -2013-09-20 Tim Lauridsen - - * src/yumex/__init__.py: select updates view by default after - transaction is completted - -2013-09-20 Tim Lauridsen - - * src/yumex/const.py, src/yumex/widgets.py, - src/yumex/yum_backend.py: Added better progress while performing - package actions and downloading meta data. - -2013-09-20 Tim Lauridsen - - * src/yumex/widgets.py: Added tooltip to selection column - -2013-09-20 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py: - click on selection column header will select/deselect all when - showing updates - added right click handler on selection column - header (for future use) - removed some commented out code. - -2013-09-19 Tim Lauridsen - - * src/yumex/widgets.py: Set transaction confirmation dialog to be - transient from main window - -2013-09-19 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: Add search config menu with 4 - kind of searches - -2013-09-19 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: added search entry and - progress spinner inside toolbar - -2013-09-18 Tim Lauridsen - - * src/yumex/widgets.py: Make infobar messages bold - -2013-09-18 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/const.py, - src/yumex/widgets.py, src/yumex/yum_backend.py: Added processing of - pending tasks - -2013-09-18 Tim Lauridsen - - * src/yumex/widgets.py: removed duplicated code - -2013-09-17 Tim Lauridsen - - * src/yumex/widgets.py, src/yumex/yum_backend.py: Added yum callback - handlers - -2013-09-17 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py, - src/yumex/yum_backend.py: Added a dynamic root backend make the - history view use the root backend - -2013-09-16 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py, src/yumex/misc.py, - src/yumex/widgets.py: Added History parts, but they dont work yet, - there need a root backend to work - -2013-09-16 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/widgets.py: self.builder -> - self.ui rename - -2013-09-16 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py, src/yumex/misc.py, - src/yumex/widgets.py: - Added infobar mesages on fetching package list - i18n refactoring - - -2013-09-16 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/widgets.py: Added - infobar - -2013-09-16 Tim Lauridsen - - * src/yumex/widgets.py: Add notice about SearchEntry widget - -2013-09-16 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py, src/yumex/widgets.py: - changed package info icons - added top margin to info view - -incressed windows default size - show progress spinner when - populating info view (filelist, changelog, updateinfo) - -2013-09-16 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/backend.py, src/yumex/const.py, - src/yumex/misc.py, src/yumex/widgets.py, src/yumex/yum_backend.py: - move constants to const,py - move misc helpers to misc.py - move - busy/normal_cursor methods to YumexWindow class - package view - population optimations - -2013-09-16 Tim Lauridsen - - * gfx/spinner-arrows.gif, gfx/spinner.gif, src/yumex.ui, - src/yumex/widgets.py: - New spinner icon - Process Gtk event while populating package view - - -2013-09-16 Tim Lauridsen - - * gfx/spinner-arrows.gif, gfx/spinner.gif, src/yumex.ui, - src/yumex/__init__.py, src/yumex/const.py: animated gif spinner - -2013-09-15 Tim Lauridsen - - * src/yumex.ui, src/yumex/__init__.py: Added progress spinner - -2013-09-15 Tim Lauridsen - - * src/yumex/__init__.py: search will search for *keyword* instead of - keyword* - -2013-09-15 Tim Lauridsen - - * .gitignore, src/yumex/__init__.py, src/yumex/widgets.py: - Reset package info on search and package filter change - Detach - package store from view, when clearing view - swich to package view - on search - -2013-09-15 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/backend.py, src/yumex/const.py, - src/yumex/misc.py, src/yumex/widgets.py, src/yumex/yum_backend.py: - Added GPL header and some code pylint based refactoring - -2013-09-15 Tim Lauridsen - - * src/yumex/Makefile, src/yumex/test_backend.py: remove unneeded - files and make Makefile clean __pycache__ dir - -2013-09-15 Tim Lauridsen - - * yumex-nextgen.spec: change .spec description - -2013-09-15 Tim Lauridsen - - * yumex-nextgen.spec: fix version, release, source0, url in .spec - -2013-09-15 Tim Lauridsen - - * misc/yumex-nextgen.desktop.in: Fix Exec= in .desktop file - -2013-09-15 Tim Lauridsen - - * yumex-nextgen.spec: add translation support to spec - -2013-09-15 Tim Lauridsen - - * po/da.po: Added da translation template - -2013-09-15 Tim Lauridsen - - * Makefile: include po in install - -2013-09-15 Tim Lauridsen - - * po/POTFILES.in, po/yumex-nextgen.pot: Make intltool include - translations from the .ui file - -2013-09-15 Tim Lauridsen - - * src/yumex/__init__.py, src/yumex/const.py: Use DATA_DIR for - Builder ui file - -2013-09-15 Tim Lauridsen - - * Makefile, po/Makefile, po/POTFILES.in, po/yumex-nextgen.pot: Added - translation files - -2013-09-15 Tim Lauridsen - - * Makefile, misc/yumex-nextgen.desktop, - misc/yumex-nextgen.desktop.in, yumex-nextgen.spec: fix .desktop - install - -2013-09-15 Tim Lauridsen - - * yumex-nextgen.spec: use the current fedora .desktop installation - routine - -2013-09-15 Tim Lauridsen - - * Makefile: Makefile fixed to swich back to future branch - -2013-09-15 Tim Lauridsen - - * ChangeLog: added changelog - -2013-09-15 Tim Lauridsen - - * Makefile, gfx/yumex-icon.png, gfx/yumex-icon.svg, - misc/yumex-nextgen.desktop, src/Makefile, src/yumex/Makefile, - tools/git2cl, yumex-nextgen.spec: Added Makefiles, .spec, icon, - .desktop - -2013-09-15 Tim Lauridsen - - * README.md: cleanup readme - -2013-09-15 Tim Lauridsen - - * README.md: cleanup readme - -2013-09-15 Tim Lauridsen - - * Inital commit of Yum Extender rewrite +2013-09-26 Tim Lauridsen + * added repositories to preferences + * added repositories to preferences + * - change colors of differnt package types in preferences - make package + view use the config colors + * - Added autostart - create a blank yumex.conf if it dont exists - install + spinner & tray icons - added default values for options in perferences + * - Add config classes from yum, migrated to python3 - Added inital + preference dialog + +2013-09-23 Tim Lauridsen + + * updated tooltips for search types + * search in pkgtags + * show pkgtags in description + * - better output when showing packages under RPM Transaction - removed used + import + * Added main content notebook page enums. Added doc strings Check if window + is created in shutdown handler + * more output to logger + +2013-09-22 Tim Lauridsen + + * debug output to debug logger + * code formatting + * - Migrated StatusIcon from yumex3.0 and make it work with gtk3 - Set + windows icon + +2013-09-20 Tim Lauridsen + + * - Added options to options menu - use newest_only option in search - search + again when search type is changed + * adjusted toolbar and added menu to pref button + * removed a lot of debug print() statements + * Added better progress while performing package actions and downloading meta + data. + * - click on selection column header will select/deselect all when showing + updates - added right click handler on selection column header (for future + use) - removed some commented out code. + +2013-09-19 Tim Lauridsen + + * Add search config menu with 4 kind of searches + * added search entry and progress spinner inside toolbar + +2013-09-18 Tim Lauridsen + + * Added processing of pending tasks + +2013-09-17 Tim Lauridsen + + * Added yum callback handlers + * Added a dynamic root backend make the history view use the root backend + +2013-09-16 Tim Lauridsen + + * Added History parts, but they dont work yet, there need a root backend to + work + * self.builder -> self.ui rename + * - Added infobar mesages on fetching package list - i18n refactoring + * Added infobar + * - changed package info icons - added top margin to info view -incressed + windows default size - show progress spinner when populating info view + (filelist, changelog, updateinfo) + * - move constants to const,py - move misc helpers to misc.py - move + busy/normal_cursor methods to YumexWindow class - package view population + optimations + * - New spinner icon - Process Gtk event while populating package view + * animated gif spinner + +2013-09-15 Tim Lauridsen + + * Added progress spinner + * - Reset package info on search and package filter change - Detach package + store from view, when clearing view - swich to package view on search + * Added GPL header and some code pylint based refactoring + * remove unneeded files and make Makefile clean __pycache__ dir + * Make intltool include translations from the .ui file + * Use DATA_DIR for Builder ui file + * Added translation files + * fix .desktop install + * Added Makefiles, .spec, icon, .desktop \ No newline at end of file diff --git a/Makefile b/Makefile index 2ef703e..b55ff06 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ clean: $(CLEAN_TARGETS) get-builddeps: - @sudo dnf install python3-devel python3-gobject perl-TimeDate gettext intltool transifex-client + @sudo dnf install python3-devel python3-gobject gettext intltool transifex-client archive: @rm -rf ${APPNAME}-${VERSION}.tar.gz @@ -50,9 +50,8 @@ archive: @rm -rf ${APPNAME}-${VERSION}.tar.gz @echo "The archive is in ${BUILDDIR}/SOURCES/${APPNAME}-$(VERSION).tar.gz" -# needs perl-TimeDate for git2cl changelog: - @git log --pretty --numstat --summary | tools/git2cl > ChangeLog + $(PYTHON) tools/git2cl.py upload: @scp ~/rpmbuild/SOURCES/${APPNAME}-${VERSION}.tar.gz yum-extender.org:public_html/dnl/yumex/source/. @@ -96,7 +95,7 @@ test-release: @cat ${APPNAME}.spec | sed -e 's/${VER_REGEX}/\1${BUMPED_MINOR}/' -e 's/\(^Release:\s*\)\([0-9]*\)\(.*\)./\10.1.${GITDATE}%{?dist}/' > ${APPNAME}-test.spec ; mv ${APPNAME}-test.spec ${APPNAME}.spec @git commit -a -m "bumped ${APPNAME} version ${NEW_VER}-${NEW_REL}" # Make Changelog - @git log --pretty --numstat --summary | ./tools/git2cl > ChangeLog + $(PYTHON) tools/git2cl.py @git commit -a -m "updated ChangeLog" # Make archive @rm -rf ${APPNAME}-${NEW_VER}.tar.gz diff --git a/tools/git2cl b/tools/git2cl deleted file mode 100755 index aa1e8c1..0000000 --- a/tools/git2cl +++ /dev/null @@ -1,308 +0,0 @@ -#!/usr/bin/perl - -# Copyright (C) 2007 Simon Josefsson. -# -# The functions mywrap, last_line_len, wrap_log_entry are derived from -# the cvs2cl tool, see : -# Copyright (C) 2001,2002,2003,2004 Martyn J. Pearce -# Copyright (C) 1999 Karl Fogel -# -# git2cl is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# git2cl is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with git2cl; see the file COPYING. If not, write to the Free -# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -use strict; -use Date::Parse qw(strptime); -use POSIX qw(strftime); -use Text::Wrap qw(wrap); - -use constant EMPTY_LOG_MESSAGE => '*** empty log message ***'; - -sub mywrap { - my ($indent1, $indent2, @text) = @_; - # If incoming text looks preformatted, don't get clever - my $text = Text::Wrap::wrap($indent1, $indent2, @text); - if ( grep /^\s+/m, @text ) { - return $text; - } - my @lines = split /\n/, $text; - $indent2 =~ s!^((?: {8})+)!"\t" x (length($1)/8)!e; - $lines[0] =~ s/^$indent1\s+/$indent1/; - s/^$indent2\s+/$indent2/ - for @lines[1..$#lines]; - my $newtext = join "\n", @lines; - $newtext .= "\n" - if substr($text, -1) eq "\n"; - return $newtext; -} - -sub last_line_len { - my $files_list = shift; - my @lines = split (/\n/, $files_list); - my $last_line = pop (@lines); - return length ($last_line); -} - -# A custom wrap function, sensitive to some common constructs used in -# log entries. -sub wrap_log_entry { - my $text = shift; # The text to wrap. - my $left_pad_str = shift; # String to pad with on the left. - - # These do NOT take left_pad_str into account: - my $length_remaining = shift; # Amount left on current line. - my $max_line_length = shift; # Amount left for a blank line. - - my $wrapped_text = ''; # The accumulating wrapped entry. - my $user_indent = ''; # Inherited user_indent from prev line. - - my $first_time = 1; # First iteration of the loop? - my $suppress_line_start_match = 0; # Set to disable line start checks. - - my @lines = split (/\n/, $text); - while (@lines) # Don't use `foreach' here, it won't work. - { - my $this_line = shift (@lines); - chomp $this_line; - - if ($this_line =~ /^(\s+)/) { - $user_indent = $1; - } - else { - $user_indent = ''; - } - - # If it matches any of the line-start regexps, print a newline now... - if ($suppress_line_start_match) - { - $suppress_line_start_match = 0; - } - elsif (($this_line =~ /^(\s*)\*\s+[a-zA-Z0-9]/) - || ($this_line =~ /^(\s*)\* [a-zA-Z0-9_\.\/\+-]+/) - || ($this_line =~ /^(\s*)\([a-zA-Z0-9_\.\/\+-]+(\)|,\s*)/) - || ($this_line =~ /^(\s+)(\S+)/) - || ($this_line =~ /^(\s*)- +/) - || ($this_line =~ /^()\s*$/) - || ($this_line =~ /^(\s*)\*\) +/) - || ($this_line =~ /^(\s*)[a-zA-Z0-9](\)|\.|\:) +/)) - { - $length_remaining = $max_line_length - (length ($user_indent)); - } - - # Now that any user_indent has been preserved, strip off leading - # whitespace, so up-folding has no ugly side-effects. - $this_line =~ s/^\s*//; - - # Accumulate the line, and adjust parameters for next line. - my $this_len = length ($this_line); - if ($this_len == 0) - { - # Blank lines should cancel any user_indent level. - $user_indent = ''; - $length_remaining = $max_line_length; - } - elsif ($this_len >= $length_remaining) # Line too long, try breaking it. - { - # Walk backwards from the end. At first acceptable spot, break - # a new line. - my $idx = $length_remaining - 1; - if ($idx < 0) { $idx = 0 }; - while ($idx > 0) - { - if (substr ($this_line, $idx, 1) =~ /\s/) - { - my $line_now = substr ($this_line, 0, $idx); - my $next_line = substr ($this_line, $idx); - $this_line = $line_now; - - # Clean whitespace off the end. - chomp $this_line; - - # The current line is ready to be printed. - $this_line .= "\n${left_pad_str}"; - - # Make sure the next line is allowed full room. - $length_remaining = $max_line_length - (length ($user_indent)); - - # Strip next_line, but then preserve any user_indent. - $next_line =~ s/^\s*//; - - # Sneak a peek at the user_indent of the upcoming line, so - # $next_line (which will now precede it) can inherit that - # indent level. Otherwise, use whatever user_indent level - # we currently have, which might be none. - my $next_next_line = shift (@lines); - if ((defined ($next_next_line)) && ($next_next_line =~ /^(\s+)/)) { - $next_line = $1 . $next_line if (defined ($1)); - # $length_remaining = $max_line_length - (length ($1)); - $next_next_line =~ s/^\s*//; - } - else { - $next_line = $user_indent . $next_line; - } - if (defined ($next_next_line)) { - unshift (@lines, $next_next_line); - } - unshift (@lines, $next_line); - - # Our new next line might, coincidentally, begin with one of - # the line-start regexps, so we temporarily turn off - # sensitivity to that until we're past the line. - $suppress_line_start_match = 1; - - last; - } - else - { - $idx--; - } - } - - if ($idx == 0) - { - # We bottomed out because the line is longer than the - # available space. But that could be because the space is - # small, or because the line is longer than even the maximum - # possible space. Handle both cases below. - - if ($length_remaining == ($max_line_length - (length ($user_indent)))) - { - # The line is simply too long -- there is no hope of ever - # breaking it nicely, so just insert it verbatim, with - # appropriate padding. - $this_line = "\n${left_pad_str}${this_line}"; - } - else - { - # Can't break it here, but may be able to on the next round... - unshift (@lines, $this_line); - $length_remaining = $max_line_length - (length ($user_indent)); - $this_line = "\n${left_pad_str}"; - } - } - } - else # $this_len < $length_remaining, so tack on what we can. - { - # Leave a note for the next iteration. - $length_remaining = $length_remaining - $this_len; - - if ($this_line =~ /\.$/) - { - $this_line .= " "; - $length_remaining -= 2; - } - else # not a sentence end - { - $this_line .= " "; - $length_remaining -= 1; - } - } - - # Unconditionally indicate that loop has run at least once. - $first_time = 0; - - $wrapped_text .= "${user_indent}${this_line}"; - } - - # One last bit of padding. - $wrapped_text .= "\n"; - - return $wrapped_text; -} - -# main - -my @date; -my $author; -my @files; -my $comment; -my $merge; - -my $state; # 0-header 1-comment 2-files -my $done = 0; - -$state = 0; - -while (<>) { - #print STDERR "debug ($state, " . (@date ? (strftime "%Y-%m-%d", @date) : "") . "): `$_'\n"; - - if ($state == 0) { - if (m,^Author: (.*),) { - $author = $1; - } - if (m,^Date: (.*),) { - @date = strptime($1); - } - if (m,^Merge: (.*),) { - $merge = 1; - } - $state = 1 if (m,^$,); - } elsif ($state == 1) { - $state = 2 if (m,^$,); - s/^ //g; - s/\n/ /g; - $comment = $comment . $_; - } elsif ($state == 2 && $merge) { - $done = 1; - } elsif ($state == 2) { - if (m,^([-0-9]+)\t([-0-9]+)\t(.*)$,) { - push @files, $3; - } elsif (m,^[^ ],) { - # No file changes. - $done = 1; - } - $done = 1 if (m,^$,); - } - - if ($done && @date == ()) { - print STDERR "warning: could not parse entry\n"; - } elsif ($done) { - print (strftime "%Y-%m-%d $author\n\n", @date); - - my $files = join (", ", @files); - $files = mywrap ("\t", "\t", "* $files"), ": "; - - if (index($comment, EMPTY_LOG_MESSAGE) > -1 ) { - $comment = "[no log message]\n"; - } - - my $files_last_line_len = 0; - $files_last_line_len = last_line_len($files) + 1; - my $msg = wrap_log_entry($comment, "\t", 69-$files_last_line_len, 69); - - $msg =~ s/[ \t]+\n/\n/g; - - if ($merge) { - print "\t$msg\n"; - } else { - print "$files: $msg\n"; - } - - @date = (); - $author = ""; - @files = (); - $comment = ""; - $merge = 0; - - $state = 0; - $done = 0; - } -} - -if (@files) { - print (strftime "%Y-%m-%d $author\n\n", @date); - my $msg = wrap_log_entry($comment, "\t", 69, 69); - $msg =~ s/[ \t]+\n/\n/g; - print "\t* $msg\n"; -} diff --git a/tools/git2cl.py b/tools/git2cl.py new file mode 100644 index 0000000..965d3dd --- /dev/null +++ b/tools/git2cl.py @@ -0,0 +1,130 @@ +#!/usr/bin/python +# Copyright 2008 Marcus D. Hanwell +# Distributed under the terms of the GNU General Public License v2 or later + +from __future__ import absolute_import +from __future__ import print_function +import string, re, os + +# Execute git log with the desired command line options. +fin = os.popen('git log --summary --stat --no-merges --date=short', 'r') + +# Create a ChangeLog file in the current directory. +fout = open('ChangeLog', 'w') + +# Set up the loop variables in order to locate the blocks we want +authorFound = False +dateFound = False +messageFound = False +filesFound = False +message = "" +messageNL = False +files = "" +prevAuthorLine = "" + +# The main part of the loop +for line in fin: + # The commit line marks the start of a new commit object. + if line.find('commit') >= 0: + # Start all over again... + authorFound = False + dateFound = False + messageFound = False + messageNL = False + message = "" + filesFound = False + files = "" + continue + # Match the author line and extract the part we want + elif re.match('Author:', line): + authorList = re.split(': ', line, 1) + author = authorList[1] + author = author.split("<")[0] + author = author[0:len(author)-1] + authorFound = True + # Match the date line + elif re.match('Date:', line): + dateList = re.split(': ', line, 1) + date = dateList[1] + date = date[0:len(date)-1] + dateFound = True + # The svn-id lines are ignored + elif re.match(' git-svn-id:', line): + continue + # The sign off line is ignored too + elif re.search('Signed-off-by', line): + continue + # Extract the actual commit message for this commit + elif authorFound & dateFound & messageFound == False: + # Find the commit message if we can + if len(line) == 1: + if messageNL: + messageFound = True + else: + messageNL = True + elif len(line) == 4: + messageFound = True + else: + if len(message) == 0: + message = message + line.strip() + else: + message = message + " " + line.strip() + # If this line is hit all of the files have been stored for this commit + elif re.search('files changed', line): + filesFound = True + continue + # Collect the files for this commit. FIXME: Still need to add +/- to files + elif authorFound & dateFound & messageFound: + fileList = re.split(' \| ', line, 2) + if len(fileList) > 1: + if len(files) > 0: + pass +# files = files + ", " + fileList[0].strip() + else: + pass +# files = fileList[0].strip() + # All of the parts of the commit have been found - write out the entry + if authorFound & dateFound & messageFound & filesFound: + # First the author line, only outputted if it is the first for that + # author on this day + authorLine = date + " " + author + if len(prevAuthorLine) == 0: + fout.write(authorLine + "\n") + elif authorLine == prevAuthorLine: + pass + else: + fout.write("\n\n" + authorLine + "\n") + + # Assemble the actual commit message line(s) and limit the line length + # to 80 characters. + commitLine = "* " + message + i = 0 + commit = "" + while i < len(commitLine): + if len(commitLine) < i + 78: + commit = commit + "\n " + commitLine[i:len(commitLine)] + break + index = commitLine.rfind(' ', i, i+78) + if index > i: + commit = commit + "\n " + commitLine[i:index] + i = index+1 + else: + commit = commit + "\n " + commitLine[i:78] + i = i+79 + + # Write out the commit line + fout.write(commit) + + #Now reset all the variables ready for a new commit block. + authorFound = False + dateFound = False + messageFound = False + messageNL = False + message = "" + filesFound = False + files = "" + prevAuthorLine = authorLine + +# Close the input and output lines now that we are finished. +fin.close() +fout.close() From 763829cf04de7ac71ae9b6d0385d3215e4b56784 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 11 May 2016 09:31:05 +0200 Subject: [PATCH 017/133] bumped version to 4.3.3 --- yumex-dnf.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/yumex-dnf.spec b/yumex-dnf.spec index 9cdcb4c..d83e584 100644 --- a/yumex-dnf.spec +++ b/yumex-dnf.spec @@ -1,7 +1,7 @@ %global appname yumex Name: %{appname}-dnf -Version: 4.3.2 +Version: 4.3.3 Release: 1%{?dist} Summary: Yum Extender graphical package management tool @@ -67,6 +67,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %changelog +* Wed May 11 2016 Tim Lauridsen 4.3.3-1 +- bumped release to 4.3.3 (dev) + * Tue Apr 26 2016 Tim Lauridsen 4.3.2-1 - bumped release to 4.3.2 (dev) From 4e51d1d723afcca2e057079a85485c00cc89d816 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 11 May 2016 09:31:06 +0200 Subject: [PATCH 018/133] updated ChangeLog --- ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ChangeLog b/ChangeLog index 476f512..26e2d95 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2016-04-29 Tim Lauridsen + + * Add python based ChangeLog generation without email addrs + 2016-04-28 Tim Lauridsen * Add custom error dialog fixes #90 From d89dda5a7432076fd7ca7feee2573ab8f16290a7 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 11 May 2016 12:11:39 +0200 Subject: [PATCH 019/133] fixed store the right windows size in gtk 3.20 --- src/yumex/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 32251ad..4ae2137 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -263,8 +263,9 @@ def on_window_state(self, widget, event): Gdk.WindowState.MAXIMIZED != 0 def on_window_changed(self, widget, data): - self.cur_height = data.height - self.cur_width = data.width + size = widget.get_size() + self.cur_height = size.height + self.cur_width = size.width def exception_handler(self, e): """Called if exception occours in methods with the From 9eb884aacb15d755be3bc0a37503399dcbafa6b4 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 13 May 2016 14:19:29 +0200 Subject: [PATCH 020/133] add css base class to yumex-dnf main window --- src/yumex/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 4ae2137..3bbbd6f 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -201,6 +201,7 @@ def __init__(self, app): title='Yum Extender - Powered by DNF', application=app) BaseYumex.__init__(self) + self.get_style_context().add_class("yumex-dnf-window") self.app = app self.connect('delete_event', self.on_delete_event) icon = Gtk.IconTheme.get_default().load_icon('yumex-dnf', 128, 0) From a856f4779415a0201185ec21e995d403c8e9ea4b Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 13 May 2016 14:38:05 +0200 Subject: [PATCH 021/133] Make searchbar visible by default (#108) --- src/yumex.ui | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/yumex.ui b/src/yumex.ui index 05afdf9..3e6150a 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -1065,6 +1065,7 @@ start Yum Extender True True False + True True @@ -1677,6 +1678,7 @@ start Yum Extender True Search (show/hide) start + True True From 8fd1c0b41a6de49036de2b2b2f749343170fbd62 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 13 May 2016 15:02:56 +0200 Subject: [PATCH 022/133] Only use a headerbar, when running gnome (#108) --- src/yumex.ui | 171 ++++++++++++++++++++++-------------------- src/yumex/__init__.py | 19 +++-- 2 files changed, 103 insertions(+), 87 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 3e6150a..b2bd812 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -850,6 +850,31 @@ start Yum Extender + + True + False + True + + + + + + + + + + + + True + False + 6 + 6 + 6 + 6 + + + + @@ -1640,114 +1665,98 @@ start Yum Extender - + True False - True + 24 - + + True + False + main_stack + + + False + True + 0 + - - + + + True + False + + True False - 24 + Remove Selected + + + + + True + False + 6 + + + True + True + True + Search (show/hide) + start + True - + True False - main_stack + edit-find-symbolic - - False - True - 0 - + + False + True + 1 + - + True - False - 6 - - - True - True - True - Search (show/hide) - start - True - - - True - False - edit-find-symbolic - - - - - False - True - 1 - - - - - True - True - True - Apply pending actions - - - True - False - system-run-symbolic - - - - - False - True - 2 - - + True + True + Apply pending actions - + True - True - True - - - True - False - open-menu-symbolic - - + False + system-run-symbolic - - False - True - 2 - - end + False + True 2 - - - True - False - + True - False - Remove Selected + True + True + + + True + False + open-menu-symbolic + + + + False + True + 2 + diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 3bbbd6f..505f412 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -324,7 +324,7 @@ def set_working(self, state, insensitive=True): self._disable_buttons(True) def _disable_buttons(self, state): - WIDGETS_INSENSITIVE = ['left_buttons', 'right_buttons', + WIDGETS_INSENSITIVE = ['left_header', 'right_header', 'package_sidebar'] for widget in WIDGETS_INSENSITIVE: self.ui.get_object(widget).set_sensitive(state) @@ -450,13 +450,20 @@ def _setup_gui(self): self.add(box) self._headerbar = self.get_ui('headerbar') if self.gnome: # Gnome, headerbar in titlebar - self.set_titlebar(self.get_ui('headerbar')) + hb = self.get_ui('headerbar') + rb = self.get_ui('right_header') + lb = self.get_ui('left_header') + hb.set_custom_title(lb) + hb.pack_end(rb) + self.set_titlebar(hb) self._headerbar.set_show_close_button(True) else: - box.pack_start(self.get_ui('headerbar'), False, True, 0) - self._headerbar.set_show_close_button(False) - self._headerbar.set_title("") - self._headerbar.set_subtitle("") + hb = self.get_ui('headerbox') + rb = self.get_ui('right_header') + lb = self.get_ui('left_header') + hb.set_center_widget(lb) + hb.pack_end(rb, False, True, 0) + box.pack_start(hb, False, True, 0) box.pack_start(self.get_ui('main_box'), False, True, 0) # Setup search self.search_bar = widgets.SearchBar(self) From ffb1dcb03505963db6b61674aadf86cc9762ef28 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 13 May 2016 18:00:43 +0200 Subject: [PATCH 023/133] change toolbar/header margin (#108) --- src/yumex.ui | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index b2bd812..72dcb0e 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -867,10 +867,6 @@ start Yum Extender True False - 6 - 6 - 6 - 6 @@ -1668,6 +1664,10 @@ start Yum Extender True False + 3 + 3 + 3 + 3 24 @@ -1696,6 +1696,10 @@ start Yum Extender True False + 3 + 3 + 3 + 3 6 From 3b889f048458a7712d86ec452a1b88e7070e31fc Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Sat, 14 May 2016 18:42:59 +0200 Subject: [PATCH 024/133] Reorder extra search filter popover elements Change arrangement of checkboxes to follow functionality. --- src/yumex.ui | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 72dcb0e..0e69802 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -1812,18 +1812,6 @@ start Yum Extender 2 - - - True - False - vertical - - - 1 - 0 - 3 - - Name @@ -1831,11 +1819,12 @@ start Yum Extender True False Package name + 24 True - 2 - 0 + 0 + 3 @@ -1845,11 +1834,12 @@ start Yum Extender True False Package summary + 24 True - 2 - 1 + 0 + 4 @@ -1859,11 +1849,12 @@ start Yum Extender True False Package description + 24 True - 2 - 2 + 0 + 5 From 992b8f15d2ce8be0b0a289ae2f191bd29a64eefd Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Sat, 14 May 2016 19:17:47 +0200 Subject: [PATCH 025/133] Put Popover creation into glade (yumex.ui) file --- src/yumex.ui | 372 ++++++++++++++++++++------------------- src/yumex/gui/widgets.py | 11 +- 2 files changed, 192 insertions(+), 191 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 0e69802..3c354bc 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -763,93 +763,6 @@ start Yum Extender error_ok - - True - False - 6 - 12 - - - True - False - start - 6 - <b>Package Versions</b> - True - - - 0 - 0 - 3 - - - - - True - False - start - 6 - <b>Archs</b> - True - - - 0 - 3 - 3 - - - - - True - False - 12 - vertical - - - - - - - - - - - - 0 - 4 - 3 - - - - - True - False - vertical - - - 0 - 1 - 3 - - - - - Newest Only - True - True - False - Show only the latest package versions - start - 12 - True - - - 0 - 2 - 3 - - - True False @@ -1682,6 +1595,196 @@ start Yum Extender + + False + button_more_filters + + + True + False + 6 + 12 + + + True + False + start + <b>Package Versions</b> + True + + + 0 + 0 + 3 + + + + + True + False + start + <b>Archs</b> + True + + + 0 + 3 + 3 + + + + + True + False + vertical + + + + + + + + + + + + 0 + 4 + 3 + + + + + True + False + vertical + + + 0 + 2 + 3 + + + + + Newest Only + True + True + False + Show only the latest package versions + start + True + + + 0 + 1 + 3 + + + + + + + False + sch_options_button + bottom + + + True + False + + + Prefix + True + True + False + Package names starting with search key + True + True + + + 0 + 0 + + + + + Keyword + True + True + False + Package names containing search key + True + sch_opt_prefix + + + 0 + 1 + + + + + Fields + True + True + False + Specified package fields containing search keys. + True + sch_opt_prefix + + + 0 + 2 + + + + + Name + True + True + False + Package name + 24 + True + + + 0 + 3 + + + + + Summary + True + True + False + Package summary + 24 + True + + + 0 + 4 + + + + + Description + True + True + False + Package description + 24 + True + + + 0 + 5 + + + + + True False @@ -1763,101 +1866,6 @@ start Yum Extender - - True - False - 6 - - - Prefix - True - True - False - Package names starting with search key - True - True - - - 0 - 0 - - - - - Keyword - True - True - False - Package names containing search key - True - sch_opt_prefix - - - 0 - 1 - - - - - Fields - True - True - False - Specified package fields containing search keys. - True - sch_opt_prefix - - - 0 - 2 - - - - - Name - True - True - False - Package name - 24 - True - - - 0 - 3 - - - - - Summary - True - True - False - Package summary - 24 - True - - - 0 - 4 - - - - - Description - True - True - False - Package description - 24 - True - - - 0 - 5 - - - False 5 diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index b904c8d..c6d0747 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -161,11 +161,7 @@ def __init__(self, win): wid.set_active(True) wid.connect('toggled', self.on_type_changed, key) # setup search option popover - self.opt_popover = Gtk.Popover.new(self._options_button) - self.opt_popover.set_size_request(50, 100) - self.opt_popover.set_position(Gtk.PositionType.BOTTOM) - opt_grid = self.win.get_ui('sch_opt_grid') - self.opt_popover.add(opt_grid) + self.opt_popover = self.win.get_ui('sch_opt_popover') def show_spinner(self, state=True): """Set is spinner in searchbar is running.""" @@ -763,10 +759,7 @@ def __init__(self, win): self.current_archs = None self._button = self.win.get_ui('button_more_filters') self._button.connect('clicked', self._on_button) - self._popover = Gtk.Popover.new(self._button) - self._popover.set_position(Gtk.PositionType.BOTTOM) - grid = self.win.get_ui('grid_more_filters') - self._popover.add(grid) + self._popover = self.win.get_ui('more_filters_popover') self._arch_box = self.win.get_ui('box_archs') self._setup_archs() self.newest_only = self.win.get_ui('cb_newest_only') From 592b3ff50f3d709bf0bfefa51e1f11b2eb1c3819 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 16 May 2016 12:04:02 +0200 Subject: [PATCH 026/133] Revert a856f47: Make searchbar visible by default (#108) Revert previous change due to a regression of displaying search bar in all views now, see https://github.com/timlau/yumex-dnf/issues/108#issuecomment-219284850. Further discussion goes into #113, which depends on #112. --- src/yumex.ui | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 3c354bc..f847be4 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -999,7 +999,6 @@ start Yum Extender True True False - True True @@ -1811,7 +1810,6 @@ start Yum Extender True Search (show/hide) start - True True From 3135a4b9c37c51ab8147ac5fb35ea7dd3b11bcc3 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 16 May 2016 12:55:37 +0200 Subject: [PATCH 027/133] Set window header margin only on non-gnome platforms Following the discussion in #108 (and my own proposal) it looks like: 1. on gnome, header margin breaks consistency with other applications 2. on non-gnome, header margins are needed to ensure that window header and headerbox are not touching each other --- src/yumex.ui | 8 -------- src/yumex/__init__.py | 8 ++++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 3c354bc..d13ce36 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -1577,10 +1577,6 @@ start Yum Extender True False - 3 - 3 - 3 - 3 24 @@ -1799,10 +1795,6 @@ start Yum Extender True False - 3 - 3 - 3 - 3 6 diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 505f412..8455f19 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -460,7 +460,15 @@ def _setup_gui(self): else: hb = self.get_ui('headerbox') rb = self.get_ui('right_header') + rb.set_margin_top(3) + rb.set_margin_bottom(3) + rb.set_margin_start(3) + rb.set_margin_end(3) lb = self.get_ui('left_header') + lb.set_margin_top(3) + lb.set_margin_bottom(3) + lb.set_margin_start(3) + lb.set_margin_end(3) hb.set_center_widget(lb) hb.pack_end(rb, False, True, 0) box.pack_start(hb, False, True, 0) From 255c6ff46797798112e2b4c248d70d713d56fcd3 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Tue, 17 May 2016 09:56:54 +0200 Subject: [PATCH 028/133] Make windows size save, work with gtk 3.18 also --- src/yumex/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 8455f19..ae9357a 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -265,8 +265,12 @@ def on_window_state(self, widget, event): def on_window_changed(self, widget, data): size = widget.get_size() - self.cur_height = size.height - self.cur_width = size.width + if isinstance(size, tuple): + self.cur_height = size[1] + self.cur_width = size[0] + else: + self.cur_height = size.height + self.cur_width = size.width def exception_handler(self, e): """Called if exception occours in methods with the From 9df88d3cb9e437c927ed4e7e8a685ef8062461d7 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 18 May 2016 14:38:07 +0200 Subject: [PATCH 029/133] make the repo selection save work (#107) --- src/yumex/__init__.py | 2 ++ src/yumex/gui/dialogs.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index ae9357a..182ccae 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -491,6 +491,8 @@ def _setup_gui(self): CONFIG.session.clean_instonly = CONFIG.conf.clean_instonly CONFIG.session.newest_only = CONFIG.conf.newest_only CONFIG.session.clean_unused = CONFIG.conf.clean_unused + if CONFIG.conf.repo_saved: + CONFIG.session.enabled_repos = CONFIG.conf.repo_enabled # setup the package/queue/history views self._setup_action_page() self._setup_package_page() diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 16f9285..ffd19b3 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -98,6 +98,8 @@ def get_settings(self): # get the repositories self.repos = self.base.backend.get_repositories() self.repo_view.populate(self.repos) + if CONFIG.conf.repo_saved: + self.repo_view.select_by_keys(CONFIG.session.enabled_repos) def on_clean_instonly(self, *args): '''Handler for clean_instonly switch''' From 577ed016d9812e838ef45a08a80f08ab566a660d Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Thu, 19 May 2016 09:52:19 +0200 Subject: [PATCH 030/133] About Dialog: make window transient (#116) Windows without parents are discouraged. Before this change and with G_ENABLE_DIAGNOSTIC=1 you'll see the warning Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. when opening the AboutDialog. --- src/yumex/__init__.py | 2 +- src/yumex/gui/dialogs.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 182ccae..0df91ee 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -1003,7 +1003,7 @@ def on_mainmenu(self, widget, action, data): if self.can_close(): self.app.quit() elif action == 'about': - dialog = dialogs.AboutDialog() + dialog = dialogs.AboutDialog(self) dialog.run() dialog.destroy() elif action == 'docs': diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index ffd19b3..2bda4b3 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -37,7 +37,7 @@ class AboutDialog(Gtk.AboutDialog): - def __init__(self): + def __init__(self, parent): Gtk.AboutDialog.__init__(self) self.props.program_name = 'Yum Extender (dnf)' self.props.version = const.VERSION @@ -46,6 +46,7 @@ def __init__(self): self.props.copyright = '(C) 2015 Tim Lauridsen' self.props.website = 'https://github.com/timlau/yumex-dnf' self.props.logo_icon_name = 'yumex-dnf' + self.set_transient_for(parent) class Preferences: From d86a89f02bcc74f56ac1f6fe93bb4a1d260d2d4c Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 13:44:20 +0200 Subject: [PATCH 031/133] Fix a typo causing a traceback when undoing transactions Before this commit, pressing the "undo" button in history view would always result in this traceback: ``` __init__.py:1123:on_history_undo:AttributeError: 'Window' object has no attribute 'process_actions' Traceback (most recent call last): File "/path/to/yumex-dnf/src/yumex/__init__.py", line 1123, in on_history_undo self.process_actions(from_queue=False) AttributeError: 'Window' object has no attribute 'process_actions' ``` Fixes rhbz #1336102. --- src/yumex/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 0df91ee..4b91714 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -1120,7 +1120,7 @@ def on_history_undo(self, widget): logger.debug('History Undo : %s', tid) rc, messages = self.backend.HistoryUndo(tid) if rc: - self.process_actions(from_queue=False) + self._process_actions(from_queue=False) else: msg = "Can't undo history transaction :\n%s" % \ ("\n".join(messages)) From 8e9e4f08f7d62d1ddc5097ed71eaf50f9436a77c Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 14:59:47 +0200 Subject: [PATCH 032/133] Fix #117: Make Ctrl+A work only on PackageView Prior to this commit, pressing Ctrl+A on any part of the ui in packages view lead to all packages being selected. This behavior was unexpected when pressing Ctrl+A in search bar or when focus was in package details. --- src/yumex/__init__.py | 5 ----- src/yumex/gui/views.py | 11 +++++++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 4b91714..1a50f08 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -987,11 +987,6 @@ def on_key_press(self, widget, event): event_and_modifiers == Gdk.ModifierType.CONTROL_MASK): if self.active_page == 'packages': self.pkg_filter.set_active('all') - # Select All on Ctrl + A - if (event.keyval == Gdk.KEY_a and - event_and_modifiers == Gdk.ModifierType.CONTROL_MASK): - if self.active_page == 'packages': - self.package_view.on_section_header_clicked(None) def on_mainmenu(self, widget, action, data): """Handle mainmenu actions""" diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index 601273d..a3d233a 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -234,6 +234,7 @@ def __init__(self, qview, group_mode=False): self.store = self._setup_model() self.connect('cursor-changed', self.on_cursor_changed) self.connect('button-press-event', self.on_mouse_button) + self.connect('key_press_event', self._on_key_press) self.state = 'normal' self._last_selected = [] self.popup = None @@ -283,6 +284,16 @@ def _setup_model(self): self.set_fixed_height_mode(True) return store + def _on_key_press(self, widget, event): + modifiers = Gtk.accelerator_get_default_mod_mask() + event_and_modifiers = (event.state & modifiers) + + if event_and_modifiers != 0: + # Select All on Ctrl + A + if (event.keyval == Gdk.KEY_a and + event_and_modifiers == Gdk.ModifierType.CONTROL_MASK): + self.on_section_header_clicked(widget) + def on_section_header_button(self, button, event): if event.button == 3: # Right click print("Right Click on selection column header") From 1fd9183129f25faad02a0c470a29f748c7a02292 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 15:50:40 +0200 Subject: [PATCH 033/133] Fix intendation-related pylint warnings Fix some pylint warnings related to indentation: E122 continuation line missing indentation or outdented E124 closing bracket does not match visual indentation E125 continuation line with same indent as next logical line E127 continuation line over-indented for visual indent E128 continuation line under-indented for visual indent E131 continuation line unaligned for hanging indent --- src/yumex/__init__.py | 27 +++++++++++++++------------ src/yumex/config.py | 2 +- src/yumex/const.py | 8 ++++---- src/yumex/dnf_backend.py | 2 +- src/yumex/gui/dialogs.py | 12 ++++++------ src/yumex/gui/views.py | 30 ++++++++++++++++-------------- src/yumex/gui/widgets.py | 35 +++++++++++++++++------------------ src/yumex/misc.py | 4 ++-- src/yumex/updater.py | 9 +++++---- 9 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 1a50f08..001e439 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -255,7 +255,7 @@ def load_custom_styling(self): css_provider.load_from_path(css_fn) context = Gtk.StyleContext() context.add_provider_for_screen(screen, css_provider, - Gtk.STYLE_PROVIDER_PRIORITY_USER) + Gtk.STYLE_PROVIDER_PRIORITY_USER) logger.debug('loading custom styling : %s', css_fn) def on_window_state(self, widget, event): @@ -293,7 +293,7 @@ def exception_handler(self, e): close = False elif err == 'NoReply': errmsg = 'DNF Dbus backend is not responding \n'\ - '\nYum Extender will exit' + '\nYum Extender will exit' close = False if errmsg == '': errmsg = msg @@ -820,19 +820,19 @@ def _run_transaction(self): else: # error in signature verification dialogs.show_information( self, _('Error checking package signatures\n'), - '\n'.join(result)) + '\n'.join(result)) break if rc == 4: # Download errors dialogs.show_information( self, _('Downloading error(s)\n'), - '\n'.join(result)) + '\n'.join(result)) self._reset_on_cancel() return elif rc != 0: # other transaction errors dialogs.show_information( self, _('Error in transaction\n'), - '\n'.join(result)) + '\n'.join(result)) self._reset() return @@ -879,7 +879,7 @@ def _process_actions_installmode(self, action, package, always_yes, else: dialogs.show_information( self, _('Error(s) in search for dependencies'), - '\n'.join(result)) + '\n'.join(result)) if app_quit: self.release_root_backend(quit=True) self.app.quit() @@ -905,7 +905,7 @@ def _process_actions(self, from_queue=True): check = self._check_protected(result) if check: self.error_dialog.show( - _("Can't remove protected package(s)") + '\n'.join(check)) + _("Can't remove protected package(s)") + '\n'.join(check)) self._reset_on_cancel() return # transaction confirmation dialog @@ -1129,9 +1129,10 @@ class YumexApplication(Gtk.Application): """Main application.""" def __init__(self): - Gtk.Application.__init__(self, - application_id="dk.yumex.yumex-ui", - flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) + Gtk.Application.__init__( + self, + application_id="dk.yumex.yumex-ui", + flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) self.connect("activate", self.on_activate) self.connect("command-line", self.on_command_line) @@ -1159,8 +1160,10 @@ def on_command_line(self, app, args): parser.add_argument('-d', '--debug', action='store_true') parser.add_argument( '-y', '--yes', action='store_true', - help='Answer yes/ok to all questions') - parser.add_argument('--exit', action='store_true', + help='Answer yes/ok to all questions') + parser.add_argument( + '--exit', + action='store_true', help='tell dnfdaemon dbus services used by yumex to exit') parser.add_argument( '-I', '--install', type=str, metavar='PACKAGE', diff --git a/src/yumex/config.py b/src/yumex/config.py index 43d9ac0..3d0759d 100644 --- a/src/yumex/config.py +++ b/src/yumex/config.py @@ -272,7 +272,7 @@ def _schemelist(self): return self.schemes[0] else: return '%s or %s' % (', '.join(self.schemes[:-1]), - self.schemes[-1]) + self.schemes[-1]) class IntOption(Option): diff --git a/src/yumex/const.py b/src/yumex/const.py index 1d2778e..95ab4b6 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -179,8 +179,8 @@ ADVISORY_TYPES = { -hawkey.ADVISORY_BUGFIX: _('Bugfix'), -hawkey.ADVISORY_UNKNOWN: _('New Package'), -hawkey.ADVISORY_SECURITY: _('Security'), -hawkey.ADVISORY_ENHANCEMENT: _('Enhancement') + hawkey.ADVISORY_BUGFIX: _('Bugfix'), + hawkey.ADVISORY_UNKNOWN: _('New Package'), + hawkey.ADVISORY_SECURITY: _('Security'), + hawkey.ADVISORY_ENHANCEMENT: _('Enhancement') } diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index f5de3d3..090ac24 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -182,7 +182,7 @@ def __init__(self, frontend): "\ndon't match" '\nneeded api version : %d') % (self.running_api_version, - const.NEEDED_DAEMON_API)) + const.NEEDED_DAEMON_API)) def on_TransactionEvent(self, event, data): if event == 'start-run': diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 2bda4b3..c7ab128 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -53,10 +53,10 @@ class Preferences: VALUES = ['update_interval', 'refresh_interval', 'installonly_limit'] COLORS = ['color_install', 'color_update', 'color_normal', - 'color_obsolete', 'color_downgrade'] + 'color_obsolete', 'color_downgrade'] FLAGS = ['autostart', 'clean_unused', 'newest_only', 'headerbar', 'auto_select_updates', 'repo_saved', 'clean_instonly' - ] + ] def __init__(self, base): self.base = base @@ -264,7 +264,7 @@ def populate(self, pkglist, dnl_size): (n, e, v, r, a, repo_id) = str(id).split(',') level2 = model.append( level1, [n, a, "%s.%s" % (v, r), repo_id, - yumex.misc.format_number(size)]) + yumex.misc.format_number(size)]) # packages there need to be downloaded if sub in ['install', 'update', 'install-deps', 'update-deps', 'obsoletes']: @@ -272,7 +272,7 @@ def populate(self, pkglist, dnl_size): for r in replaces: (n, e, v, r, a, repo_id) = str(r).split(',') model.append(level2, [_("replacing {}").format(n), - a, "%s.%s" % (v, r), repo_id, + a, "%s.%s" % (v, r), repo_id, yumex.misc.format_number(size)]) self.base.ui.get_object("result_size").set_text( yumex.misc.format_number(total_size)) @@ -312,8 +312,8 @@ def ask_for_gpg_import(window, values): ' Key : 0x%s:\n' ' Userid : "%s"\n' ' From : %s') % - (pkg_name, hexkeyid, userid, - keyurl.replace("file://", ""))) + (pkg_name, hexkeyid, userid, + keyurl.replace("file://", ""))) dialog = Gtk.MessageDialog( window, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, msg) diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index a3d233a..eb36d53 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -250,12 +250,14 @@ def _setup_model(self): store = Gtk.ListStore(GObject.TYPE_PYOBJECT, str) self.set_model(store) if self.group_mode: - self.create_selection_colunm('selected', + self.create_selection_colunm( + 'selected', click_handler=self.on_section_header_clicked_group, popup_handler=self.on_section_header_button, tooltip=_("Click to install all/remove all")) else: - self.create_selection_colunm('selected', + self.create_selection_colunm( + 'selected', click_handler=self.on_section_header_clicked, popup_handler=self.on_section_header_button, tooltip=_("Click to select/deselect all")) @@ -567,8 +569,8 @@ def _toggle_downgrade(self, obj): pkg = pkgs[0] # Installed pkg is all-ready downgraded by another package if pkg.action == 'do' or \ - self.queue.has_pkg_with_name_arch(pkg): - return + self.queue.has_pkg_with_name_arch(pkg): + return pkg.queued = 'do' pkg.selected = True pkg.downgrade_po = obj @@ -665,10 +667,10 @@ def add(self, pkg, action=None): action = pkg.action na = "%s.%s" % (pkg.name, pkg.arch) if not pkg in self.packages[action] and \ - not na in self._name_arch_index: - self.packages[action].append(pkg) - na = "%s.%s" % (pkg.name, pkg.arch) - self._name_arch_index[na] = 1 + not na in self._name_arch_index: + self.packages[action].append(pkg) + na = "%s.%s" % (pkg.name, pkg.arch) + self._name_arch_index[na] = 1 def remove(self, pkg, action=None): """Remove package from queue""" @@ -746,9 +748,8 @@ def get_groups(self): class QueueView(Gtk.TreeView): __gsignals__ = {'queue-refresh': (GObject.SignalFlags.RUN_FIRST, - None, - (GObject.TYPE_INT,)) - } + None, + (GObject.TYPE_INT,))} def __init__(self, queue_menu): Gtk.TreeView.__init__(self) @@ -899,7 +900,7 @@ def populate_list_downgrade(self): [str(pkg.downgrade_po), pkg.summary]) self.store.append( item, [_("Downgrade to %s ") % - str(pkg), ""]) + str(pkg), ""]) class HistoryView(Gtk.TreeView): @@ -1057,8 +1058,9 @@ def populate(self, data): for state in const.HISTORY_SORT_ORDER: if state in states: num = len(states[state]) - cat = self.model.append(None, ["%s (%i)" % - (const.HISTORY_STATE_LABLES[state], num)]) + cat = self.model.append( + None, ["%s (%i)" % + (const.HISTORY_STATE_LABLES[state], num)]) for pkg_list in states[state]: pkg_id, st, is_inst = pkg_list[0] if is_inst: diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index c6d0747..1868c65 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -115,10 +115,10 @@ class SearchBar(GObject.GObject): """Handling the search UI.""" __gsignals__ = {'search': (GObject.SignalFlags.RUN_FIRST, - None, - (GObject.TYPE_STRING, - GObject.TYPE_STRING, - GObject.TYPE_PYOBJECT,)) + None, + (GObject.TYPE_STRING, + GObject.TYPE_STRING, + GObject.TYPE_PYOBJECT,)) } FIELDS = ['name', 'summary', 'description'] @@ -261,9 +261,8 @@ class FilterSidebar(GObject.GObject): """Sidebar selector widget. """ __gsignals__ = {'sidebar-changed': (GObject.SignalFlags.RUN_FIRST, - None, - (GObject.TYPE_STRING,) - )} + None, + (GObject.TYPE_STRING,))} INDEX = {0: 'updates', 1: 'installed', 2: 'available', 3: 'all'} @@ -325,9 +324,9 @@ class Content(GObject.GObject): """Handling the content pages""" __gsignals__ = {'page-changed': (GObject.SignalFlags.RUN_FIRST, - None, - (GObject.TYPE_STRING,) - )} + None, + (GObject.TYPE_STRING,) + )} def __init__(self, win): GObject.GObject.__init__(self) @@ -470,10 +469,10 @@ def add_url(self, text, url, newline=False): if not tag: if yumex.misc.check_dark_theme(): tag = self._buffer.create_tag(text, - foreground="#4C4CFF") + foreground="#4C4CFF") else: tag = self._buffer.create_tag(text, - foreground="blue") + foreground="blue") tag.connect("event", self.on_url_event) self.url_tags.append(tag) self.url_list[text] = url @@ -564,7 +563,7 @@ def _show_description(self): tags = self.current_package.pkgtags if tags: self.write(_("Tags: %s\n") % - ", ".join(tags), "changelog-header") + ", ".join(tags), "changelog-header") desc = self.current_package.description self.write(desc) self.write('\n') @@ -594,7 +593,7 @@ def _show_updateinfo(self): self.write(_("No update information is available")) if self._is_fedora_pkg(): self.write(_("\nFedora Updates:"), "changelog-header", - newline=True) + newline=True) url = const.FEDORA_PACKAGES_URL + self._get_name_for_url() \ + "/updates" self.add_url(url, url, newline=True) @@ -669,7 +668,7 @@ def _show_changelog(self): self.write(_("No changelog information is available")) if self._is_fedora_pkg(): self.write(_("\nOnline Changelog:"), "changelog-header", - newline=True) + newline=True) url = const.FEDORA_PACKAGES_URL + self._get_name_for_url() \ + "/changelog" self.add_url(url, url, newline=True) @@ -747,9 +746,9 @@ def _on_button(self, button): class ExtraFilters(GObject.GObject): __gsignals__ = {'changed': (GObject.SignalFlags.RUN_FIRST, - None, - (GObject.TYPE_STRING, - GObject.TYPE_PYOBJECT,)) + None, + (GObject.TYPE_STRING, + GObject.TYPE_PYOBJECT,)) } def __init__(self, win): diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 87576d3..644e371 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -241,8 +241,8 @@ def check_dark_theme(): def logger_setup(logroot='yumex', - logfmt='%(asctime)s: %(message)s', - loglvl=logging.INFO): + logfmt='%(asctime)s: %(message)s', + loglvl=logging.INFO): """Setup Python logging.""" logger = logging.getLogger(logroot) logger.setLevel(loglvl) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index a001b3a..18c0f9d 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -52,7 +52,7 @@ class Notification(GObject.GObject): __gsignals__ = { 'notify-action': (GObject.SignalFlags.RUN_FIRST, None, - (str,)) + (str,)) } def __init__(self, summary, body): @@ -249,9 +249,10 @@ class UpdateApplication(Gio.Application): """Update application.""" def __init__(self): - Gio.Application.__init__(self, - application_id="dk.yumex.yumex-updater", - flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) + Gio.Application.__init__( + self, + application_id="dk.yumex.yumex-updater", + flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) self.connect("activate", self.on_activate) self.connect("command-line", self.on_command_line) From 8f45c916ed73a8b36fae76711643cab485e0baf0 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 16:14:14 +0200 Subject: [PATCH 034/133] Fix collection-related pylint warnings E713 test for membership should be 'not in' --- src/yumex/backend.py | 2 +- src/yumex/gui/views.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/yumex/backend.py b/src/yumex/backend.py index bdea9f2..7f3b9ca 100644 --- a/src/yumex/backend.py +++ b/src/yumex/backend.py @@ -167,7 +167,7 @@ def __init__(self): self._filters = {} def add(self, filter_cls): - if not filter_cls.name in self._filters: + if filter_cls.name not in self._filters: self._filters[filter_cls.name] = filter_cls def delete(self, name): diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index eb36d53..7841b43 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -666,8 +666,8 @@ def add(self, pkg, action=None): if not action: action = pkg.action na = "%s.%s" % (pkg.name, pkg.arch) - if not pkg in self.packages[action] and \ - not na in self._name_arch_index: + if pkg not in self.packages[action] and \ + na not in self._name_arch_index: self.packages[action].append(pkg) na = "%s.%s" % (pkg.name, pkg.arch) self._name_arch_index[na] = 1 @@ -693,7 +693,7 @@ def add_group(self, grp, action): ''' logger.debug('add_group : %s - %s' % (grp.id, action)) grps = self.groups[action] - if not grp.id in grps: + if grp.id not in grps: grps[grp.id] = grp grp.selected = True @@ -725,7 +725,7 @@ def remove_groups(self, group_names): new_dict = {} grps = self.groups[action] for grp in grps.values(): - if not grp.name in group_names: + if grp.name not in group_names: new_dict[grp.id] = grp # copy to new dict else: # unselect the group object grp.selected = False @@ -942,17 +942,17 @@ def populate(self, data): da, t = dt.split('T') y, m, d = da.split('-') # year - if not y in main: + if y not in main: ycat = self.model.append(None, [y, -1]) main[y] = (ycat, {}) ycat, mdict = main[y] # month - if not m in mdict: + if m not in mdict: mcat = self.model.append(ycat, [m, -1]) mdict[m] = (mcat, {}) mcat, ddict = mdict[m] # day - if not d in ddict: + if d not in ddict: dcat = self.model.append(mcat, [d, -1]) ddict[d] = dcat dcat = ddict[d] From dbc0fc626e316187d64c1cf598cc70a63e3cec02 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 16:16:41 +0200 Subject: [PATCH 035/133] Fix more indentation stuff --- src/yumex/misc.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 644e371..90e012f 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -122,13 +122,13 @@ def is_url(url): def format_block(block, indent): - ''' Format a block of text so they get the same indentation''' - spaces = " " * indent - lines = str(block).split('\n') - result = lines[0] + "\n" - for line in lines[1:]: - result += spaces + line + '\n' - return result + ''' Format a block of text so they get the same indentation''' + spaces = " " * indent + lines = str(block).split('\n') + result = lines[0] + "\n" + for line in lines[1:]: + result += spaces + line + '\n' + return result def get_style_color(widget): From 9eef4eaff5d58ea2580e87649f16b1ee4d936083 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 16:28:03 +0200 Subject: [PATCH 036/133] Fix pylint: anomalous-backslash-in-string warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ID:anomalous-backslash-in-string Anomalous backslash in string: […] String constant might be missing an r prefix. --- src/yumex/config.py | 2 +- src/yumex/const.py | 2 +- src/yumex/gui/widgets.py | 4 ++-- src/yumex/misc.py | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/yumex/config.py b/src/yumex/config.py index 3d0759d..8e5597e 100644 --- a/src/yumex/config.py +++ b/src/yumex/config.py @@ -36,7 +36,7 @@ def read_in_items_from_dot_dir(thisglob, line_as_list=True): results = [] for fname in glob.glob(thisglob): for line in open(fname): - if re.match('\s*(#|$)', line): + if re.match(r'\s*(#|$)', line): continue line = line.rstrip() # no more trailing \n's line = line.lstrip() # be nice diff --git a/src/yumex/const.py b/src/yumex/const.py index 95ab4b6..4121b0b 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -67,7 +67,7 @@ else: # use x86_64 as fallback PLATFORM_ARCH = ARCH_DICT['x86_64'] -DBUS_ERR_RE = re.compile('.*GDBus.Error:([\w\.]*): (.*)$') +DBUS_ERR_RE = re.compile(r'.*GDBus.Error:([\w\.]*): (.*)$') ICON_TRAY_ERROR = PIX_DIR + '/tray-error.png' ICON_TRAY_NO_UPDATES = PIX_DIR + '/tray-no-updates.png' diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 1868c65..de4b993 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -533,8 +533,8 @@ def update(self): def _is_url(self, url): urls = re.findall( - '^http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+~]|' - '[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url) + r'^http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+~]|' + r'[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url) if urls: return True else: diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 90e012f..88eaca9 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -113,8 +113,8 @@ def color_to_hex(color): def is_url(url): urls = re.findall( - '^http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+~]|' - '[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url) + r'^http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+~]|' + r'[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url) if urls: return True else: From 4cf00d5810004827fed11dc04cd10c793bf424c5 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 16:31:10 +0200 Subject: [PATCH 037/133] Remove duplicate function is_url() --- src/yumex/gui/widgets.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index de4b993..f19130b 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -531,18 +531,9 @@ def update(self): logger.error("Package info not found: ", self.active_filter) self.goto_top() - def _is_url(self, url): - urls = re.findall( - r'^http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+~]|' - r'[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url) - if urls: - return True - else: - return False - def _url_handler(self, url): logger.debug('URL activated: ' + url) - if self._is_url(url): # just to be sure and prevent shell injection + if yumex.misc.is_url(url): # just to be sure and prevent shell injection rc = subprocess.call("xdg-open '%s'" % url, shell=True) # failover to gtk.show_uri, if xdg-open fails or is not installed if rc != 0: From 7f16e4486b92d1860c89e9f9b05aafb17164e3fb Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 17:12:21 +0200 Subject: [PATCH 038/133] Remove unnecessary imports --- src/yumex/const.py | 2 -- src/yumex/gui/views.py | 4 +--- src/yumex/gui/widgets.py | 2 -- src/yumex/updater.py | 1 - 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/yumex/const.py b/src/yumex/const.py index 4121b0b..fb5620f 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -20,10 +20,8 @@ from __future__ import absolute_import -from gi.repository import Pango from yumex.misc import _ -import os import os.path import re import subprocess diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index 7841b43..aaa25d9 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -27,11 +27,9 @@ from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject -from gi.repository import Pango from yumex import const -from yumex.misc import _, P_, CONFIG, doGtkEvents, TimeFunction, \ - check_dark_theme +from yumex.misc import _, P_, CONFIG, doGtkEvents, TimeFunction logger = logging.getLogger('yumex.gui.views') diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index f19130b..20fcc8f 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -28,13 +28,11 @@ import datetime import hawkey import logging -import re import subprocess import urllib.parse import yumex.const as const -import yumex.gui.views import yumex.misc logger = logging.getLogger('yumex.gui.widget') diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 18c0f9d..355cd26 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -33,7 +33,6 @@ import time import yumex.misc as misc -import yumex.const as const LOG_ROOT = 'yumex.updater' From 7279b498434b1e08a9d109d0028175ce50fc32e4 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 17:13:03 +0200 Subject: [PATCH 039/133] Remove possible logging-related bugs --- src/yumex/__init__.py | 2 +- src/yumex/gui/widgets.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 001e439..fbb2050 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -1196,7 +1196,7 @@ def on_command_line(self, app, args): if self.window.can_close(): self.quit() else: - self.logger.info("Application is busy") + logger.info("Application is busy") if self.current_args.install or self.current_args.remove or \ self.current_args.updateall: self.install_mode = True diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 20fcc8f..d13d77a 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -526,7 +526,7 @@ def update(self): elif self.active_filter == 'deps': self._show_requirements() else: - logger.error("Package info not found: ", self.active_filter) + logger.error("Package info not found: %s", self.active_filter) self.goto_top() def _url_handler(self, url): From b202107308db74cb7b5de13571f460ad8bc905c1 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 17:29:14 +0200 Subject: [PATCH 040/133] Fix broken statements pylint: ID:pointless-string-statement String statement has no effect --- src/yumex/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index fbb2050..9ebc069 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -162,12 +162,12 @@ def exception_handler(self, e): err, errmsg = self._parse_error(msg) logger.debug('BASE err: [%s] - msg: %s' % (err, errmsg)) if err == 'LockedError': - errmsg = 'DNF is locked by another process.\n' - '\nYum Extender will exit' + errmsg = 'DNF is locked by another process.\n' \ + '\nYum Extender will exit' close = False elif err == 'NoReply': - errmsg = 'DNF D-Bus backend is not responding.\n' - '\nYum Extender will exit' + errmsg = 'DNF D-Bus backend is not responding.\n' \ + '\nYum Extender will exit' close = False if errmsg == '': errmsg = msg From 0c333d1bd402c3b8cdb8663022c6c01426ba4be2 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 17:31:11 +0200 Subject: [PATCH 041/133] Fix more pylint warnings related to whitespace and line length E271 multiple spaces after keyword E302 expected 2 blank lines, found 1 W292 no newline at end of file limit line length to 80 characters --- src/yumex/__init__.py | 5 +++-- src/yumex/dnf_backend.py | 5 +++-- src/yumex/gui/views.py | 1 + src/yumex/gui/widgets.py | 3 ++- src/yumex/updater.py | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 9ebc069..736303c 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -331,7 +331,7 @@ def _disable_buttons(self, state): WIDGETS_INSENSITIVE = ['left_header', 'right_header', 'package_sidebar'] for widget in WIDGETS_INSENSITIVE: - self.ui.get_object(widget).set_sensitive(state) + self.ui.get_object(widget).set_sensitive(state) def _set_busy_cursor(self, insensitive=False): """Set busy cursor in main window.""" @@ -920,7 +920,8 @@ def _process_actions(self, from_queue=True): self.set_working(False) dialogs.show_information(self, _('No pending actions in queue')) self._reset_on_cancel() - except misc.TransactionBuildError as e: # Error in building transaction + except misc.TransactionBuildError as e: + # Error in building transaction self.error_dialog.show( _('Error(s) in building transaction') + '\n'.join(e.msgs)) self._reset_on_cancel() diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 090ac24..0ea2de4 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -153,7 +153,7 @@ def updateinfo(self): @property @ExceptionHandler def requirements(self): - return self.get_attribute('requires') + return self.get_attribute('requires') @property def is_update(self): @@ -175,7 +175,8 @@ def __init__(self, frontend): self._files_to_download = 0 self._files_downloaded = 0 if self.running_api_version == const.NEEDED_DAEMON_API: - logger.debug('dnfdaemon api version (%d)', self.running_api_version) + logger.debug('dnfdaemon api version (%d)', + self.running_api_version) else: raise dnfdaemon.client.APIVersionError( _('dnfdaemon api version : %d' diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index aaa25d9..8dbc715 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -1210,6 +1210,7 @@ def select_all(self, state=True): self.store.set_value(iterator, 0, state) iterator = self.store.iter_next(iterator) + class Group: """ Object to represent a dnf group/category """ diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index d13d77a..a8af2cb 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -531,7 +531,8 @@ def update(self): def _url_handler(self, url): logger.debug('URL activated: ' + url) - if yumex.misc.is_url(url): # just to be sure and prevent shell injection + # just to be sure and prevent shell injection + if yumex.misc.is_url(url): rc = subprocess.call("xdg-open '%s'" % url, shell=True) # failover to gtk.show_uri, if xdg-open fails or is not installed if rc != 0: diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 355cd26..c6a6608 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -308,4 +308,4 @@ def on_command_line(self, app, args): return 0 def on_shutdown(self, app): - return 0 \ No newline at end of file + return 0 From 0f50fddadf3b07426c63c4169bbe31120114c7e5 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 17:41:53 +0200 Subject: [PATCH 042/133] Don't use built-in symbols as variables any more --- src/yumex/__init__.py | 16 ++++++++-------- src/yumex/gui/dialogs.py | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 736303c..b1c96f5 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -140,7 +140,7 @@ def get_root_backend(self): return self._root_backend @misc.ExceptionHandler - def release_root_backend(self, quit=False): + def release_root_backend(self, quit_dnfdaemon=False): """Release the current root backend, if it is setup and locked.""" if self._root_backend is None: return @@ -148,7 +148,7 @@ def release_root_backend(self, quit=False): logger.debug('Unlock the DNF root daemon') self._root_backend.Unlock() self._root_locked = False - if quit: + if quit_dnfdaemon: logger.debug('Exit the DNF root daemon') self._root_backend.Exit() @@ -176,7 +176,7 @@ def exception_handler(self, e): # try to exit the backends, ignore errors if close: try: - self.release_root_backend(quit=True) + self.release_root_backend(quit_dnfdaemon=True) except: pass #self.status.SetWorking(False) # reset working state @@ -301,7 +301,7 @@ def exception_handler(self, e): # try to exit the backends, ignore errors if close: try: - self.release_root_backend(quit=True) + self.release_root_backend(quit_dnfdaemon=True) except: pass Gtk.main_quit() @@ -765,8 +765,8 @@ def _check_protected(self, trans): protected = [] for action, pkgs in trans: if action == 'remove': - for id, size, replaces in pkgs: - (n, e, v, r, a, repo_id) = str(id).split(',') + for pkgid, size, replaces in pkgs: + (n, e, v, r, a, repo_id) = str(pkgid).split(',') if n in CONFIG.conf.protected: protected.append(n) return protected @@ -881,7 +881,7 @@ def _process_actions_installmode(self, action, package, always_yes, self, _('Error(s) in search for dependencies'), '\n'.join(result)) if app_quit: - self.release_root_backend(quit=True) + self.release_root_backend(quit_dnfdaemon=True) self.app.quit() @misc.ExceptionHandler @@ -1213,7 +1213,7 @@ def on_shutdown(self, app): CONFIG.conf.win_width = self.window.cur_width CONFIG.conf.win_height = self.window.cur_height CONFIG.conf.win_maximized = False - self.window.release_root_backend(quit=True) + self.window.release_root_backend(quit_dnfdaemon=True) logger.info('Saving config on exit') CONFIG.write() return 0 diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index c7ab128..964d195 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -260,8 +260,8 @@ def populate(self, pkglist, dnl_size): for sub, lvl1 in pkglist: label = "%s" % const.TRANSACTION_RESULT_TYPES[sub] level1 = model.append(None, [label, "", "", "", ""]) - for id, size, replaces in lvl1: - (n, e, v, r, a, repo_id) = str(id).split(',') + for pkgid, size, replaces in lvl1: + (n, e, v, r, a, repo_id) = str(pkgid).split(',') level2 = model.append( level1, [n, a, "%s.%s" % (v, r), repo_id, yumex.misc.format_number(size)]) From bf7b5617258bdb9f5d5afb348edde218f0419c07 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 18:02:17 +0200 Subject: [PATCH 043/133] Fix pylint info simplifiable-if-statement ID:simplifiable-if-statement The if statement can be replaced with 'return bool(test)' --- src/yumex/__init__.py | 10 ++-------- src/yumex/dnf_backend.py | 5 +---- src/yumex/misc.py | 5 +---- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index b1c96f5..78ed450 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -64,18 +64,12 @@ def _check_cache_expired(self, cache_type): last_refresh = datetime.datetime.strptime( CONFIG.conf.session_refresh, time_fmt) period = now - last_refresh - if period > refresh_period: - return True - else: - return False + return period > refresh_period elif cache_type == 'system': last_refresh = datetime.datetime.strptime( CONFIG.conf.system_refresh, time_fmt) period = now - last_refresh - if period > refresh_period: - return True - else: - return False + return period > refresh_period def _set_cache_refreshed(self, cache_type): time_fmt = '%Y-%m-%d %H:%M' diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 0ea2de4..bfd7704 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -158,10 +158,7 @@ def requirements(self): @property def is_update(self): """Package is an update/replacement to another package.""" - if self.action == 'o' or self.action == 'u': - return True - else: - return False + return self.action == 'o' or self.action == 'u' class DnfRootBackend(yumex.backend.Backend, dnfdaemon.client.Client): diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 88eaca9..27b26f8 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -115,10 +115,7 @@ def is_url(url): urls = re.findall( r'^http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+~]|' r'[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url) - if urls: - return True - else: - return False + return urls def format_block(block, indent): From 3d878a10503516a3cdb8924605201d4e91654ba3 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 18:17:05 +0200 Subject: [PATCH 044/133] resort imports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pylint: ID:wrong-import-order standard import […] comes before […] New order: 1. imports from python standard library [empty line] 2. imports from gi, hawkey, other system installed libraries [empty line] 3. imports from dnfdaemon [empty line] 4. imports from yumex modules --- setup.py | 4 ++-- src/main.py | 1 + src/update.py | 1 + src/yumex/__init__.py | 7 +++---- src/yumex/backend.py | 1 + src/yumex/config.py | 1 - src/yumex/const.py | 5 +++-- src/yumex/dnf_backend.py | 6 ++++-- src/yumex/gui/dialogs.py | 11 ++++++----- src/yumex/gui/widgets.py | 13 ++++++------- src/yumex/misc.py | 9 +++++---- src/yumex/updater.py | 13 +++++++------ 12 files changed, 39 insertions(+), 33 deletions(-) diff --git a/setup.py b/setup.py index d135d5b..f39f9f6 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,12 @@ #!/usr/bin/python3 +import os +from os.path import join, basename, split from distutils.core import setup from distutils.util import convert_path from distutils.command.build_scripts import build_scripts from distutils import log -import os -from os.path import join, basename, split RENAME_SCRIPTS = {'main.py': 'yumex-dnf', 'update.py': 'yumex-dnf-updatechecker'} diff --git a/src/main.py b/src/main.py index 65bfe99..75434ce 100755 --- a/src/main.py +++ b/src/main.py @@ -22,6 +22,7 @@ import traceback import subprocess import signal + import gi gi.require_version('Gtk', '3.0') gi.require_version('Notify', '0.7') diff --git a/src/update.py b/src/update.py index 08dd41a..ff9b4ea 100755 --- a/src/update.py +++ b/src/update.py @@ -22,6 +22,7 @@ import traceback import subprocess import signal + import gi gi.require_version('Gtk', '3.0') gi.require_version('Notify', '0.7') diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 78ed450..29198ca 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -19,10 +19,6 @@ from __future__ import absolute_import -from gi.repository import Gio, Gtk, Gdk - -from yumex.misc import _, CONFIG - import argparse import datetime import logging @@ -31,6 +27,9 @@ import subprocess import sys +from gi.repository import Gio, Gtk, Gdk + +from yumex.misc import _, CONFIG import yumex.const as const import yumex.misc as misc import yumex.dnf_backend diff --git a/src/yumex/backend.py b/src/yumex/backend.py index 7f3b9ca..3147000 100644 --- a/src/yumex/backend.py +++ b/src/yumex/backend.py @@ -20,6 +20,7 @@ from __future__ import absolute_import import logging + import yumex.const as const logger = logging.getLogger('yumex.backend') diff --git a/src/yumex/config.py b/src/yumex/config.py index 8e5597e..e884e37 100644 --- a/src/yumex/config.py +++ b/src/yumex/config.py @@ -21,7 +21,6 @@ """ from urllib.parse import urlparse - import copy import glob import re diff --git a/src/yumex/const.py b/src/yumex/const.py index fb5620f..c219f24 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -20,14 +20,15 @@ from __future__ import absolute_import -from yumex.misc import _ - import os.path import re import subprocess import sys + import hawkey +from yumex.misc import _ + VERSION = "4.3.2" NEEDED_DAEMON_API = 2 # The needed dnfdaemon API version diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index bfd7704..ee3d8f0 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -20,14 +20,16 @@ from __future__ import absolute_import -from yumex.misc import ExceptionHandler, TimeFunction, _, CONFIG +import logging + from gi.repository import Gdk import dnfdaemon.client -import logging + import yumex.backend import yumex.misc import yumex.const as const +from yumex.misc import ExceptionHandler, TimeFunction, _, CONFIG logger = logging.getLogger('yumex.yum_backend') diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 964d195..87ec8d9 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -21,16 +21,17 @@ from __future__ import absolute_import -from gi.repository import Gtk -from gi.repository import GObject -from yumex import const -from yumex.misc import _, CONFIG - import logging import os import shutil + +from gi.repository import Gtk +from gi.repository import GObject + +from yumex import const import yumex.gui.views import yumex.misc +from yumex.misc import _, CONFIG logger = logging.getLogger('yumex.gui.dialogs') diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index a8af2cb..0131f12 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -19,19 +19,18 @@ from __future__ import absolute_import -from gi.repository import Gtk, Gio, GLib -from gi.repository import Gdk -from gi.repository import GObject -from gi.repository import Pango -from yumex.misc import _, CONFIG - import datetime -import hawkey import logging import subprocess import urllib.parse +from gi.repository import Gtk, Gio, GLib +from gi.repository import Gdk +from gi.repository import GObject +from gi.repository import Pango +import hawkey +from yumex.misc import _, CONFIG import yumex.const as const import yumex.misc diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 27b26f8..5371bac 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -20,11 +20,7 @@ from __future__ import absolute_import import time - -from gi.repository import Gtk, Gdk, Notify - import configparser -import dnfdaemon.client import gettext import locale import logging @@ -32,6 +28,11 @@ import re import subprocess import sys + +from gi.repository import Gtk, Gdk, Notify + +import dnfdaemon.client + import yumex.config as config LOCALE_DIR = os.path.join(sys.prefix, 'share', 'locale') diff --git a/src/yumex/updater.py b/src/yumex/updater.py index c6a6608..0047623 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -20,18 +20,19 @@ from __future__ import absolute_import -from gi.repository import Gio, Gtk, Notify, GObject -from yumex.misc import _, CONFIG -from subprocess import Popen -from xdg import BaseDirectory - import argparse -import dnfdaemon.client import logging import os import sys import time +from subprocess import Popen +from gi.repository import Gio, Gtk, Notify, GObject +from xdg import BaseDirectory + +import dnfdaemon.client + +from yumex.misc import _, CONFIG import yumex.misc as misc LOG_ROOT = 'yumex.updater' From ce469709c3580023a2a39bc487faa59df3e84151 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 18:33:19 +0200 Subject: [PATCH 045/133] Remove old __future__ statements In python 2.x, some features were optional, which required us to mark them as required using __future__. "absolute_import" and "print_function" are available by default from 3.0 on, thus these statements are not required any more. --- src/yumex/__init__.py | 1 - src/yumex/backend.py | 2 -- src/yumex/const.py | 2 -- src/yumex/dnf_backend.py | 2 -- src/yumex/gui/dialogs.py | 2 -- src/yumex/gui/views.py | 2 -- src/yumex/gui/widgets.py | 1 - src/yumex/misc.py | 1 - src/yumex/updater.py | 1 - tools/git2cl.py | 3 +-- 10 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 29198ca..01526bb 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -17,7 +17,6 @@ # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import import argparse import datetime diff --git a/src/yumex/backend.py b/src/yumex/backend.py index 3147000..285e520 100644 --- a/src/yumex/backend.py +++ b/src/yumex/backend.py @@ -17,8 +17,6 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import - import logging import yumex.const as const diff --git a/src/yumex/const.py b/src/yumex/const.py index c219f24..d287a4e 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -18,8 +18,6 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import - import os.path import re import subprocess diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index ee3d8f0..b11f7a2 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -18,8 +18,6 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import - import logging from gi.repository import Gdk diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 87ec8d9..ce56862 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -19,8 +19,6 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import - import logging import os import shutil diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index 8dbc715..254e41a 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -18,8 +18,6 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import - import os import logging diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 0131f12..1e8e777 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -17,7 +17,6 @@ # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import import datetime import logging diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 5371bac..520d756 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -17,7 +17,6 @@ # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import import time import configparser diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 0047623..e9a6ff6 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -18,7 +18,6 @@ # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from __future__ import absolute_import import argparse import logging diff --git a/tools/git2cl.py b/tools/git2cl.py index 965d3dd..1acece0 100644 --- a/tools/git2cl.py +++ b/tools/git2cl.py @@ -2,8 +2,7 @@ # Copyright 2008 Marcus D. Hanwell # Distributed under the terms of the GNU General Public License v2 or later -from __future__ import absolute_import -from __future__ import print_function + import string, re, os # Execute git log with the desired command line options. From 2f1528f86eadea59e1991d40c5e3743756a6fb23 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 18:41:40 +0200 Subject: [PATCH 046/133] Remove empty documentation blocks --- src/yumex/gui/views.py | 73 ------------------------------------------ 1 file changed, 73 deletions(-) diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index 254e41a..7c86307 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -438,10 +438,6 @@ def deselect_all(self): self.queue_draw() def select_by_keys(self, keys): - ''' - - @param keys: - ''' iterator = self.store.get_iter_first() while iterator is not None: obj = self.store.get_value(iterator, 0) @@ -458,9 +454,6 @@ def select_by_keys(self, keys): self.queue_draw() def get_selected(self): - ''' - - ''' selected = [] for el in self.store: obj = el[0] @@ -469,9 +462,6 @@ def get_selected(self): return selected def get_notselected(self): - ''' - - ''' notselected = [] for el in self.store: obj = el[0] @@ -610,9 +600,6 @@ class PackageQueue: ''' def __init__(self): - ''' - Init the queue - ''' self.packages = {} self._setup_packages() self.groups = {} @@ -625,9 +612,6 @@ def _setup_packages(self): self.packages[key] = [] def clear(self): - ''' - - ''' del self.packages self.packages = {} self._setup_packages() @@ -637,19 +621,12 @@ def clear(self): self._name_arch_index = {} def get(self, action=None): - ''' - - @param action: - ''' if action is None: return self.packages else: return self.packages[action] def total(self): - ''' - - ''' num = 0 for key in const.QUEUE_PACKAGE_TYPES: num += len(self.packages[key]) @@ -778,9 +755,6 @@ def _setup_model(self): return model def deleteSelected(self, widget=None): - ''' - - ''' rmvlist = [] model, paths = self.get_selection().get_selected_rows() for path in paths: @@ -864,28 +838,16 @@ def refresh(self): self.emit('queue-refresh', self.queue.total()) def populate_list(self, label, pkg_list): - ''' - - @param header: - @param pkg_list: - ''' parent = self.store.append(None, [label, ""]) for pkg in pkg_list: self.store.append(parent, [str(pkg), pkg.summary]) def populate_group_list(self, label, grps): - ''' - @param label: - @param pkg_list: - ''' parent = self.store.append(None, [label, ""]) for grp in grps.values(): self.store.append(parent, [grp.name, grp.description]) def populate_list_downgrade(self): - ''' - - ''' pkg_list = self.queue.packages['do'] label = "%s" % P_( "Package to downgrade", "Packages to downgrade", len(pkg_list)) @@ -902,10 +864,6 @@ def populate_list_downgrade(self): class HistoryView(Gtk.TreeView): """ History View Class""" def __init__(self, base): - ''' - - @param widget: - ''' Gtk.TreeView.__init__(self) self.model = self.setup_view() self.base = base @@ -986,10 +944,6 @@ def get_selected(self): class HistoryPackageView(Gtk.TreeView): """ History Package View Class""" def __init__(self, base): - ''' - - @param widget: - ''' Gtk.TreeView.__init__(self) self.model = self.setup_view() self.base = base @@ -1085,10 +1039,6 @@ class RepoView(SelectionView): This class controls the repo TreeView """ def __init__(self): - ''' - - @param widget: - ''' SelectionView.__init__(self) self.headers = [_('Repository'), _('Filename')] self.store = self.setup_view() @@ -1150,13 +1100,6 @@ def populate(self, data): self.store.append([state, ident, name, gpg]) def new_pixbuf(self, column, cell, model, iterator, data): - ''' - - @param column: - @param cell: - @param model: - @param iterator: - ''' gpg = model.get_value(iterator, 3) if gpg: cell.set_property('visible', True) @@ -1164,9 +1107,6 @@ def new_pixbuf(self, column, cell, model, iterator, data): cell.set_property('visible', False) def get_selected(self): - ''' - - ''' selected = [] for elem in self.store: state = elem[0] @@ -1176,9 +1116,6 @@ def get_selected(self): return selected def get_notselected(self): - ''' - - ''' notselected = [] for elem in self.store: state = elem[0] @@ -1188,10 +1125,6 @@ def get_notselected(self): return notselected def select_by_keys(self, keys): - ''' - - @param keys: - ''' iterator = self.store.get_iter_first() while iterator is not None: repoid = self.store.get_value(iterator, 1) @@ -1222,8 +1155,6 @@ def __init__(self, grpid, grp_name, grp_desc, inst, is_category=False): class GroupView(Gtk.TreeView): - ''' - ''' __gsignals__ = {'group-changed': (GObject.SignalFlags.RUN_FIRST, None, (GObject.TYPE_STRING,))} @@ -1319,10 +1250,6 @@ def on_cursor_changed(self, widget): self.emit('group-changed', obj.id) def populate(self, data): - ''' - - @param data: - ''' self.freeze_child_notify() self.set_model(None) self.model.clear() From 7c3bb8b5e561aae76fb92f84856ce61582bc86b1 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 19:09:42 +0200 Subject: [PATCH 047/133] deduplicate _fullname() function --- src/yumex/dnf_backend.py | 12 ++---------- src/yumex/gui/dialogs.py | 8 -------- src/yumex/gui/views.py | 16 +++++----------- src/yumex/gui/widgets.py | 2 +- src/yumex/misc.py | 5 ++--- 5 files changed, 10 insertions(+), 33 deletions(-) diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index b11f7a2..d6674f5 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -62,7 +62,7 @@ def __str__(self): @property def fullname(self): - return yumex.misc.id2fullname(self.pkg_id) + return yumex.misc.pkg_id_to_full_name(self.pkg_id) @ExceptionHandler def get_attribute(self, attr): @@ -219,7 +219,7 @@ def on_RPMProgress(self, package, action, te_current, te_total, ts_current, ts_total): num = ' ( %i/%i )' % (ts_current, ts_total) if ',' in package: # this is a pkg_id - name = self._fullname(package) + name = misc.pkg_id_to_full_name(package) else: # this is just a pkg name (cleanup) name = package logger.debug('on_RPMProgress : [%s]' % package) @@ -461,11 +461,3 @@ def get_group_packages(self, grp_id, grp_flt): attrs = ['summary', 'size', 'action'] pkgs = self.GetGroupPackages(grp_id, grp_flt, attrs) return self._make_pkg_object_with_attr(pkgs) - - def _fullname(self, pkg_id): - """ Package fullname from a pkg_id """ - (n, e, v, r, a, repo_id) = str(pkg_id).split(',') - if e and e != '0': - return '%s-%s:%s-%s.%s (%s)' % (n, e, v, r, a, repo_id) - else: - return '%s-%s-%s.%s (%s)' % (n, v, r, a, repo_id) diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index ce56862..b8de0bd 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -208,14 +208,6 @@ def run(self): def clear(self): self.store.clear() - def _fullname(self, pkg_id): - ''' Package fullname ''' - (n, e, v, r, a, repo_id) = str(pkg_id).split(',') - if e and e != '0': - return "%s-%s:%s-%s.%s" % (n, e, v, r, a) - else: - return "%s-%s-%s.%s" % (n, v, r, a) - def setup_view(self, view): ''' Setup the TreeView diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index 7c86307..ea4b41c 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -28,6 +28,7 @@ from yumex import const from yumex.misc import _, P_, CONFIG, doGtkEvents, TimeFunction +import yumex.misc as misc logger = logging.getLogger('yumex.gui.views') @@ -1015,24 +1016,17 @@ def populate(self, data): pkg_id, st, is_inst = pkg_list[0] if is_inst: name = '%s' % ( - CONFIG.conf.color_install, self._fullname(pkg_id)) + CONFIG.conf.color_install, + misc.pkg_id_to_full_name(pkg_id)) else: - name = self._fullname(pkg_id) + name = misc.pkg_id_to_full_name(pkg_id) pkg_cat = self.model.append(cat, [name]) if len(pkg_list) == 2: pkg_id, st, is_inst = pkg_list[1] - name = self._fullname(pkg_id) + name = misc.pkg_id_to_full_name(pkg_id) self.model.append(pkg_cat, [name]) self.expand_all() - def _fullname(self, pkg_id): - ''' Package fullname ''' - (n, e, v, r, a, repo_id) = str(pkg_id).split(',') - if e and e != '0': - return "%s-%s:%s-%s.%s" % (n, e, v, r, a) - else: - return "%s-%s-%s.%s" % (n, v, r, a) - class RepoView(SelectionView): """ diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 1e8e777..cf9f62e 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -679,7 +679,7 @@ def _show_requirements(self): for key in reqs: self.write(key) for pkg_id in reqs[key]: - pkg = yumex.misc.id2fullname(pkg_id) + pkg = yumex.misc.pkg_id_to_full_name(pkg_id) self.write(' --> {}'.format(pkg)) self.base.set_working(False, False) diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 520d756..abb625f 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -78,11 +78,10 @@ def to_pkg_tuple(pkg_id): return (n, e, v, r, a, repo_id) -def id2fullname(pkg_id): +def pkg_id_to_full_name(pkg_id): (n, e, v, r, a, repo_id) = to_pkg_tuple(pkg_id) if e and e != '0': - return "%s-%s:%s-%s.%s" %\ - (n, e, v, r, a) + return "%s-%s:%s-%s.%s" % (n, e, v, r, a) else: return "%s-%s-%s.%s" % (n, v, r, a) From 4a51f93d6c4a589988d502183adb2a7a980f2e07 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 19:27:42 +0200 Subject: [PATCH 048/133] Fix pylint logging-not-lazy warnings ID:logging-not-lazy Specify string format arguments as logging function parameters Reason: Performance, see pylint documentation. --- src/yumex/dnf_backend.py | 14 +++++++------- src/yumex/gui/dialogs.py | 2 +- src/yumex/gui/views.py | 8 ++++---- src/yumex/misc.py | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index d6674f5..9dbc373 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -213,7 +213,7 @@ def on_TransactionEvent(self, event, data): elif event == 'end-run': self.frontend.infobar.show_progress(False) else: - logger.debug('TransactionEvent : %s' % event) + logger.debug('TransactionEvent : %s', event) def on_RPMProgress(self, package, action, te_current, te_total, ts_current, ts_total): @@ -222,7 +222,7 @@ def on_RPMProgress(self, package, action, te_current, name = misc.pkg_id_to_full_name(package) else: # this is just a pkg name (cleanup) name = package - logger.debug('on_RPMProgress : [%s]' % package) + logger.debug('on_RPMProgress : [%s]', package) self.frontend.infobar.info_sub(const.RPM_ACTIONS[action] % name) if ts_current > 0 and ts_current <= ts_total: frac = float(ts_current) / float(ts_total) @@ -231,7 +231,7 @@ def on_RPMProgress(self, package, action, te_current, def on_GPGImport(self, pkg_id, userid, hexkeyid, keyurl, timestamp): values = (pkg_id, userid, hexkeyid, keyurl, timestamp) self._gpg_confirm = values - logger.debug('received signal : GPGImport%s' % (repr(values))) + logger.debug('received signal : GPGImport %s', repr(values)) def on_DownloadStart(self, num_files, num_bytes): """Starting a new parallel download batch.""" @@ -256,15 +256,15 @@ def on_DownloadEnd(self, name, status, msg): #values = (name, status, msg) #print('on_DownloadEnd : %s' % (repr(values))) if status == -1 or status == 2: # download OK or already exists - logger.debug('Downloaded : %s' % name) + logger.debug('Downloaded : %s', name) self._files_downloaded += 1 else: - logger.debug('Download Error : %s - %s' % (name, msg)) + logger.debug('Download Error : %s - %s', name, msg) def on_RepoMetaDataProgress(self, name, frac): """Repository Metadata Download progress.""" values = (name, frac) - logger.debug('on_RepoMetaDataProgress (root): %s' % (repr(values))) + logger.debug('on_RepoMetaDataProgress (root): %s', repr(values)) if frac == 0.0: self.frontend.infobar.info_sub(name) else: @@ -311,7 +311,7 @@ def _update_config_options(self): logger.debug('clean_requirements_on_remove = %s', CONFIG.session.clean_unused) if CONFIG.session.enabled_repos: - logger.debug('root: Setting repos : %s' % + logger.debug('root: Setting repos : %s', CONFIG.session.enabled_repos) self.SetEnabledRepos(CONFIG.session.enabled_repos) diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index b8de0bd..bba451b 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -79,7 +79,7 @@ def run(self): def get_settings(self): # set boolean states for option in Preferences.FLAGS: - logger.debug("%s : %s " % (option, getattr(CONFIG.conf, option))) + logger.debug("%s : %s ", option, getattr(CONFIG.conf, option)) widget = self.base.ui.get_object('pref_' + option) widget.set_active(getattr(CONFIG.conf, option)) # cleanup installonly handler diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index ea4b41c..0a4d8f7 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -347,7 +347,7 @@ def _get_package_popup(self, pkg, path): def on_package_reinstall(self, widget, pkg): """Handler for package right click menu""" - logger.debug('reinstall: %s ' % str(pkg)) + logger.debug('reinstall: %s ', str(pkg)) pkg.queued = 'ri' pkg.selected = True self.queue.add(pkg, 'ri') @@ -357,7 +357,7 @@ def on_package_reinstall(self, widget, pkg): def on_package_downgrade(self, widget, event, pkg, do_pkg): """Downgrade package right click menu handler""" if event.button == 1: # Left Click - logger.debug('downgrade to : %s ' % str(do_pkg)) + logger.debug('downgrade to : %s ', str(do_pkg)) #pkg.action = 'do' pkg.queued = 'do' pkg.selected = True @@ -665,7 +665,7 @@ def add_group(self, grp, action): @param grp: Group object @param action: ''' - logger.debug('add_group : %s - %s' % (grp.id, action)) + logger.debug('add_group : %s - %s', grp.id, action) grps = self.groups[action] if grp.id not in grps: grps[grp.id] = grp @@ -677,7 +677,7 @@ def remove_group(self, grp, action): @param grp: Group object @param action: ''' - logger.debug('removeGroup : %s - %s' % (grp.id, action)) + logger.debug('removeGroup : %s - %s', grp.id, action) grps = self.groups[action] if grp.id in grps: del grps[grp.id] diff --git a/src/yumex/misc.py b/src/yumex/misc.py index abb625f..4f1f037 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -171,7 +171,7 @@ def newFunc(*args, **kwargs): rc = func(*args, **kwargs) t_end = time.time() name = func.__name__ - logger.debug("%s took %.2f sec" % (name, t_end - t_start)) + logger.debug("%s took %.2f sec", name, t_end - t_start) return rc newFunc.__name__ = func.__name__ @@ -320,7 +320,7 @@ def __init__(self): object.__init__(self) self.conf_dir = os.environ['HOME'] + "/.config/yumex-dnf" if not os.path.isdir(self.conf_dir): - logger.info("creating config directory : %s" % self.conf_dir) + logger.info("creating config directory : %s", self.conf_dir) os.makedirs(self.conf_dir, 0o700) self.conf_file = self.conf_dir + "/yumex.conf" self.parser = configparser.ConfigParser() @@ -331,7 +331,7 @@ def __init__(self): def read(self): first_read = False if not os.path.exists(self.conf_file): - logger.info("creating default config file : %s" % self.conf_file) + logger.info("creating default config file : %s", self.conf_file) first_read = True else: self.parser.read_file(open(self.conf_file, "r")) From fee093146968cd7f0d48d41c9844b74d0c182f19 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 19:43:17 +0200 Subject: [PATCH 049/133] Fix previously introduced error missing a module This bug was introduced by the previous commit deduplicate _fullname() function (7c3bb8b5e561aae76fb92f84856ce61582bc86b1) --- src/yumex/dnf_backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 9dbc373..fc13861 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -219,7 +219,7 @@ def on_RPMProgress(self, package, action, te_current, te_total, ts_current, ts_total): num = ' ( %i/%i )' % (ts_current, ts_total) if ',' in package: # this is a pkg_id - name = misc.pkg_id_to_full_name(package) + name = yumex.misc.pkg_id_to_full_name(package) else: # this is just a pkg name (cleanup) name = package logger.debug('on_RPMProgress : [%s]', package) From 8953f01b6bf716411673eaad22cf08e667fa8aaa Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 21:00:47 +0200 Subject: [PATCH 050/133] Improve error message markup Before this change, there was a space missing after the first string and all packages were tried to print on one line. --- src/yumex/__init__.py | 3 ++- src/yumex/misc.py | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 01526bb..8b91bc8 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -897,7 +897,8 @@ def _process_actions(self, from_queue=True): check = self._check_protected(result) if check: self.error_dialog.show( - _("Can't remove protected package(s)") + '\n'.join(check)) + _("Can't remove protected package(s):") + + misc.list_to_string(check, "\n ", ",\n ")) self._reset_on_cancel() return # transaction confirmation dialog diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 4f1f037..a28bfe4 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -78,6 +78,14 @@ def to_pkg_tuple(pkg_id): return (n, e, v, r, a, repo_id) +def list_to_string(pkg_list, first_delimitier, delimiter): + """Creates a multiline string from a list of packages""" + string = first_delimitier + for pkg_name in pkg_list: + string = string + pkg_name + delimiter + return string + + def pkg_id_to_full_name(pkg_id): (n, e, v, r, a, repo_id) = to_pkg_tuple(pkg_id) if e and e != '0': From 1fac5f22c2f7d66992a49c7fc6a2e92e6c96cf3c Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 23 May 2016 23:48:21 +0200 Subject: [PATCH 051/133] Add a LICENSE file for GPLv2 Conforms with https://github.com/timlau/yumex-dnf/blob/develop/src/main.py#L6 --- LICENSE | 339 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..23cb790 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. From 6b68be9a92a63a2c179ed6c9c4516f2fdbf91178 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 25 May 2016 11:10:54 +0200 Subject: [PATCH 052/133] fix traceback if there is no pkg reqs (rhbz #1327830) --- src/yumex/gui/widgets.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index cf9f62e..0b9f6e4 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -676,11 +676,12 @@ def _show_filelist(self): def _show_requirements(self): self.base.set_working(True, False) reqs = self.current_package.requirements - for key in reqs: - self.write(key) - for pkg_id in reqs[key]: - pkg = yumex.misc.pkg_id_to_full_name(pkg_id) - self.write(' --> {}'.format(pkg)) + if reqs: + for key in reqs: + self.write(key) + for pkg_id in reqs[key]: + pkg = yumex.misc.pkg_id_to_full_name(pkg_id) + self.write(' --> {}'.format(pkg)) self.base.set_working(False, False) From d8154909c3407d27ef5433bc15c394111c1ab8e2 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 25 May 2016 13:14:41 +0200 Subject: [PATCH 053/133] make the update check lock handling better --- src/yumex/updater.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index e9a6ff6..06b39f2 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -143,13 +143,16 @@ def __init__(self): def get_updates(self, *args): logger.debug('Checking for updates') try: - self.backend.Lock() - pkgs = self.backend.GetPackages('updates') - rc = len(pkgs) - logger.debug('# of updates : %d' % rc) - self.backend.Unlock() - except: # Get locking errors - logger.debug('Error getting the dnfdaemon lock') + if self.backend.Lock(): + pkgs = self.backend.GetPackages('updates') + rc = len(pkgs) + logger.debug('# of updates : %d' % rc) + self.backend.Unlock() + else: + logger.debug('Error getting the dnfdaemon lock') + rc = -1 + except: # catch backend exception + logger.debug('Error in getting updates') rc = -1 if rc > 0: if self.mute_count < 1: From 7870454451d1396be742a0a4e7d5f334b2827831 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Thu, 26 May 2016 13:06:03 +0200 Subject: [PATCH 054/133] fix issues with changing packages in the view very rapid (#118) --- src/yumex/gui/widgets.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 0b9f6e4..1850473 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -502,7 +502,9 @@ def set_package(self, pkg): :param pkg: package to set as active package ''' self.current_package = pkg + self.win.set_working(True, True) self.update() + self.win.set_working(False) def update(self): ''' From 6b47f90185785ab097a3d459298c7133655264e0 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 20:58:01 +0200 Subject: [PATCH 055/133] More phytonic exception handling Don't catch exception to ignore it afterwards. --- src/update.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/update.py b/src/update.py index ff9b4ea..511dafc 100755 --- a/src/update.py +++ b/src/update.py @@ -53,6 +53,5 @@ '/usr/bin/dbus-send --system --print-reply ' '--dest=org.baseurl.DnfSystem / org.baseurl.DnfSystem.Exit', shell=True) - except: - pass -sys.exit(1) + finally: + sys.exit(1) From b06f4dd988dc64f58c203789928de1e7234cd718 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 21:26:00 +0200 Subject: [PATCH 056/133] Reduce visibility Purpose: prevent unintended usage, make it simpler for interpreter/pylint to find unused code. --- src/yumex/updater.py | 175 ++++++++++++++++++++++--------------------- 1 file changed, 88 insertions(+), 87 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 06b39f2..e365ff6 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -48,7 +48,7 @@ DELAYED_START = 5 * 60 # Seconds before first check -class Notification(GObject.GObject): +class _Notification(GObject.GObject): __gsignals__ = { 'notify-action': (GObject.SignalFlags.RUN_FIRST, None, (str,)) @@ -58,20 +58,21 @@ def __init__(self, summary, body): GObject.GObject.__init__(self) Notify.init('Yum Extender') icon = "yumex-dnf" - self.notification = Notify.Notification.new(summary, body, icon) - self.notification.set_timeout(10000) # timeout 10s - self.notification.add_action('later', _('Not Now'), - self.callback) - self.notification.add_action('show', _('Show Updates'), self.callback) - self.notification.connect('closed', self.on_closed) + self.__notification = Notify.Notification.new(summary, body, icon) + self.__notification.set_timeout(10000) # timeout 10s + self.__notification.add_action('later', _('Not Now'), + self.__callback) + self.__notification.add_action('show', _('Show Updates'), + self.__callback) + self.__notification.connect('closed', self.__on_closed) def show(self): - self.notification.show() + self.__notification.show() - def callback(self, widget, action): + def __callback(self, widget, action): self.emit('notify-action', action) - def on_closed(self, widget): + def __on_closed(self, widget): self.emit('notify-action', 'closed') @@ -83,15 +84,15 @@ def error_notify(summary, body): notification.show() -class UpdateTimestamp: +class _UpdateTimestamp: ''' a persistent timestamp. eg for storing the last update check ''' def __init__(self, file_name=TIMESTAMP_FILE): - self.time_file = file_name - self.last_time = -1 + self.__time_file = file_name + self.__last_time = -1 def get_last_time_diff(self): ''' @@ -99,55 +100,55 @@ def get_last_time_diff(self): ''' try: t = int(time.time()) - if self.last_time == -1: - f = open(self.time_file, 'r') + if self.__last_time == -1: + f = open(self.__time_file, 'r') t_old = int(f.read()) f.close() - self.last_time = t_old - if self.last_time > t: + self.__last_time = t_old + if self.__last_time > t: return -1 - return t - self.last_time + return t - self.__last_time except: pass return -1 def store_current_time(self): t = int(time.time()) - f = open(self.time_file, 'w') + f = open(self.__time_file, 'w') f.write(str(t)) f.close() - self.last_time = t + self.__last_time = t -class Updater: +class _Updater: def __init__(self): # update checking - self.update_timer_id = -1 - self.update_timestamp = UpdateTimestamp() - self.next_update = 0 - self.last_timestamp = 0 - self.muted = False - self.mute_count = 0 - self.last_num_updates = 0 + self.__update_timer_id = -1 + self.__update_timestamp = _UpdateTimestamp() + self.__next_update = 0 + self.__last_timestamp = 0 + self.__muted = False + self.__mute_count = 0 + self.__last_num_updates = 0 # dnfdaemon client setup try: - self.backend = dnfdaemon.client.Client() + self.__backend = dnfdaemon.client.Client() except dnfdaemon.client.DaemonError as e: msg = str(e) logger.debug('Error starting dnfdaemon service: [%s]', msg) error_notify('Error starting dnfdaemon service\n\n%s' % msg, msg) sys.exit(1) - def get_updates(self, *args): + def __get_updates(self, *args): logger.debug('Checking for updates') try: - if self.backend.Lock(): - pkgs = self.backend.GetPackages('updates') + if self.__backend.Lock(): + pkgs = self.__backend.GetPackages('updates') rc = len(pkgs) logger.debug('# of updates : %d' % rc) - self.backend.Unlock() + self.__backend.Unlock() else: logger.debug('Error getting the dnfdaemon lock') rc = -1 @@ -155,43 +156,43 @@ def get_updates(self, *args): logger.debug('Error in getting updates') rc = -1 if rc > 0: - if self.mute_count < 1: + if self.__mute_count < 1: # Only show the same notification once # until the user closes the notification - if rc != self.last_num_updates: + if rc != self.__last_num_updates: logger.debug('notification opened : # updates = %d', rc) - notify = Notification(_('New Updates'), + notify = _Notification(_('New Updates'), _('%s available updates') % rc) - notify.connect('notify-action', self.on_notify_action) + notify.connect('notify-action', self.__on_notify_action) notify.show() - self.last_num_updates = rc + self.__last_num_updates = rc else: logger.debug('skipping notification (same # of updates)') else: - self.mute_count -= 1 + self.__mute_count -= 1 logger.debug('skipping notification : mute_count = %s', - self.mute_count) - self.update_timestamp.store_current_time() + self.__mute_count) + self.__update_timestamp.store_current_time() self.start_update_timer() # restart update timer if necessary return rc #========================================================================= # Callbacks #========================================================================= - def on_notify_action(self, widget, action): + def __on_notify_action(self, widget, action): """Handle notification actions. """ logger.debug('notify-action: %s', action) if action == 'later': logger.debug('setting mute_count = 10') - self.mute_count = 10 + self.__mute_count = 10 elif action == 'show': - self.run_yumex() + self.__run_yumex() elif action == 'closed': # reset the last number of updates notified # so we will get a new notification at next check - self.last_num_updates = 0 + self.__last_num_updates = 0 - def run_yumex(self, param=[]): + def __run_yumex(self, param=[]): logger.debug('run yumex') cmd = [YUMEX_BIN] cmd.extend(param) @@ -208,11 +209,11 @@ def start_update_timer(self): """ start or restart the update timer: check when the last update was done """ - if self.update_timer_id != -1: - GObject.source_remove(self.update_timer_id) + if self.__update_timer_id != -1: + GObject.source_remove(self.__update_timer_id) # in seconds - time_diff = self.update_timestamp.get_last_time_diff() + time_diff = self.__update_timestamp.get_last_time_diff() delay = CONFIG.conf.update_interval - int(time_diff / 60) if time_diff == -1 or delay < 0: delay = 0 @@ -220,30 +221,30 @@ def start_update_timer(self): logger.debug( 'Starting update timer with a ' 'delay of {0} min (time_diff={1})'.format(delay, time_diff)) - self.next_update = delay - self.last_timestamp = int(time.time()) - self.update_timer_id = GObject.timeout_add_seconds( - 1, self.update_timeout) + self.__next_update = delay + self.__last_timestamp = int(time.time()) + self.__update_timer_id = GObject.timeout_add_seconds( + 1, self.__update_timeout) return False - def update_timeout(self): - self.next_update = self.next_update - 1 - self.update_timer_id = -1 - if self.next_update < 0: + def __update_timeout(self): + self.__next_update = self.__next_update - 1 + self.__update_timer_id = -1 + if self.__next_update < 0: # check for updates: this will automatically restart the # timer - self.get_updates() + self.__get_updates() else: cur_timestamp = int(time.time()) - if cur_timestamp - self.last_timestamp > 60 * 2: + if cur_timestamp - self.__last_timestamp > 60 * 2: # this can happen on hibernation/suspend # or when the system time changes logger.debug('Time changed: restarting update timer') self.start_update_timer() else: - self.update_timer_id = GObject.timeout_add_seconds( - 60, self.update_timeout) - self.last_timestamp = cur_timestamp + self.__update_timer_id = GObject.timeout_add_seconds( + 60, self.__update_timeout) + self.__last_timestamp = cur_timestamp return False @@ -256,25 +257,25 @@ def __init__(self): application_id="dk.yumex.yumex-updater", flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) - self.connect("activate", self.on_activate) - self.connect("command-line", self.on_command_line) - self.connect("shutdown", self.on_shutdown) - self.running = False - self.args = None - self.updater = None - - def on_activate(self, app): - self.running = True - self.updater = Updater() - if not self.args.delay: - self.updater.startup_init_update_timer() + self.connect("activate", self.__on_activate) + self.connect("command-line", self.__on_command_line) + self.connect("shutdown", self.__on_shutdown) + self.__running = False + self.__args = None + self.__updater = None + + def __on_activate(self, app): + self.__running = True + self.__updater = _Updater() + if not self.__args.delay: + self.__updater.startup_init_update_timer() else: - self.updater.start_update_timer() + self.__updater.start_update_timer() Gtk.main() return 0 - def _log_setup(self): - if self.args.debug: + def __log_setup(self): + if self.__args.debug: misc.logger_setup( logroot='yumex.updater', logfmt='%(asctime)s: [%(name)s] - %(message)s', @@ -282,33 +283,33 @@ def _log_setup(self): else: misc.logger_setup() - def on_command_line(self, app, args): + def __on_command_line(self, app, args): parser = argparse.ArgumentParser(prog='app') parser.add_argument('-d', '--debug', action='store_true') parser.add_argument('--exit', action='store_true') parser.add_argument('--delay', type=int) - if not self.running: + if not self.__running: # First run - self.args = parser.parse_args(args.get_arguments()[1:]) - self._log_setup() - if self.args.delay: - CONFIG.conf.update_interval = self.args.delay + self.__args = parser.parse_args(args.get_arguments()[1:]) + self.__log_setup() + if self.__args.delay: + CONFIG.conf.update_interval = self.__args.delay logger.debug('first run') else: logger.debug('second run') # Second Run # parse cmdline in a non quitting way - self.current_args = \ + self.__current_args = \ parser.parse_known_args(args.get_arguments()[1:])[0] - if self.current_args.exit: + if self.__current_args.exit: logger.debug('quitting') self.quit() sys.exit(0) - if self.args.exit: # kill dnf daemon and quit + if self.__args.exit: # kill dnf daemon and quit misc.dbus_dnfsystem('Exit') sys.exit(0) self.activate() return 0 - def on_shutdown(self, app): + def __on_shutdown(self, app): return 0 From ad1114df1da376ba0c35696d54aa291545b1d8d5 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 21:30:30 +0200 Subject: [PATCH 057/133] Add/improve comments --- src/yumex/updater.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index e365ff6..3d832e2 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -49,6 +49,8 @@ class _Notification(GObject.GObject): + """Used to notify users of available updates""" + __gsignals__ = { 'notify-action': (GObject.SignalFlags.RUN_FIRST, None, (str,)) @@ -67,6 +69,7 @@ def __init__(self, summary, body): self.__notification.connect('closed', self.__on_closed) def show(self): + """Show the notification. This call does not block.""" self.__notification.show() def __callback(self, widget, action): @@ -87,7 +90,7 @@ def error_notify(summary, body): class _UpdateTimestamp: ''' - a persistent timestamp. eg for storing the last update check + a persistent timestamp. e.g. for storing the last update check ''' def __init__(self, file_name=TIMESTAMP_FILE): @@ -113,6 +116,7 @@ def get_last_time_diff(self): return -1 def store_current_time(self): + """Save current time stamp permanently.""" t = int(time.time()) f = open(self.__time_file, 'w') f.write(str(t)) @@ -200,8 +204,7 @@ def __run_yumex(self, param=[]): Popen(cmd).pid def startup_init_update_timer(self): - """ start the update timer with a delayed startup - """ + """ start the update timer with a delayed startup. """ logger.debug('Starting delayed update timer') GObject.timeout_add_seconds(DELAYED_START, self.start_update_timer) From 7bb123bc1d602e535c1646ccbfeb9918e09a081a Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 21:34:48 +0200 Subject: [PATCH 058/133] Use Gio to start yumex-dnf Detach the child process. Prevents these border cases: * If yumex-dnf dies before updater does, it does not get cleaned up remaining as zombie unless we handle SIGCLD * If the updater exits before yumex-dnf, it will kill its child yumex-dnf as a result --- src/yumex/updater.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 3d832e2..fa1936f 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -190,19 +190,16 @@ def __on_notify_action(self, widget, action): logger.debug('setting mute_count = 10') self.__mute_count = 10 elif action == 'show': - self.__run_yumex() + logger.debug('Starting: %s', YUMEX_BIN) + flags = Gio.AppInfoCreateFlags.NONE + yumex_app = Gio.AppInfo.create_from_commandline( + YUMEX_BIN, YUMEX_BIN, flags) + yumex_app.launch(None, None) elif action == 'closed': # reset the last number of updates notified # so we will get a new notification at next check self.__last_num_updates = 0 - def __run_yumex(self, param=[]): - logger.debug('run yumex') - cmd = [YUMEX_BIN] - cmd.extend(param) - logger.debug('Starting: %s' % " ".join(cmd)) - Popen(cmd).pid - def startup_init_update_timer(self): """ start the update timer with a delayed startup. """ logger.debug('Starting delayed update timer') From 7ddf7f4f86d61df890e21ae3cdea9d2258019e10 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 21:42:11 +0200 Subject: [PATCH 059/133] Remove unused argument --- src/yumex/updater.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index fa1936f..2a89f00 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -145,7 +145,7 @@ def __init__(self): error_notify('Error starting dnfdaemon service\n\n%s' % msg, msg) sys.exit(1) - def __get_updates(self, *args): + def __get_updates(self): logger.debug('Checking for updates') try: if self.__backend.Lock(): From 849fb5d4f2622968bff86d5145463509031ec86d Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 21:49:13 +0200 Subject: [PATCH 060/133] Rename variables to make names more helpful --- src/yumex/updater.py | 48 +++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 2a89f00..ad29c7e 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -102,26 +102,26 @@ def get_last_time_diff(self): returns time difference to last check in seconds >=0 or -1 on error ''' try: - t = int(time.time()) + now = int(time.time()) if self.__last_time == -1: - f = open(self.__time_file, 'r') - t_old = int(f.read()) - f.close() + file = open(self.__time_file, 'r') + t_old = int(file.read()) + file.close() self.__last_time = t_old - if self.__last_time > t: + if self.__last_time > now: return -1 - return t - self.__last_time + return now - self.__last_time except: pass return -1 def store_current_time(self): """Save current time stamp permanently.""" - t = int(time.time()) - f = open(self.__time_file, 'w') - f.write(str(t)) - f.close() - self.__last_time = t + now = int(time.time()) + file = open(self.__time_file, 'w') + file.write(str(now)) + file.close() + self.__last_time = now class _Updater: @@ -139,8 +139,8 @@ def __init__(self): # dnfdaemon client setup try: self.__backend = dnfdaemon.client.Client() - except dnfdaemon.client.DaemonError as e: - msg = str(e) + except dnfdaemon.client.DaemonError as error: + msg = str(error) logger.debug('Error starting dnfdaemon service: [%s]', msg) error_notify('Error starting dnfdaemon service\n\n%s' % msg, msg) sys.exit(1) @@ -150,26 +150,28 @@ def __get_updates(self): try: if self.__backend.Lock(): pkgs = self.__backend.GetPackages('updates') - rc = len(pkgs) - logger.debug('# of updates : %d' % rc) + update_count = len(pkgs) + logger.debug('# of updates : %d' % update_count) self.__backend.Unlock() else: logger.debug('Error getting the dnfdaemon lock') - rc = -1 + update_count = -1 except: # catch backend exception logger.debug('Error in getting updates') - rc = -1 - if rc > 0: + update_count = -1 + if update_count > 0: if self.__mute_count < 1: # Only show the same notification once # until the user closes the notification - if rc != self.__last_num_updates: - logger.debug('notification opened : # updates = %d', rc) + if update_count != self.__last_num_updates: + logger.debug('notification opened : # updates = %d', + update_count) notify = _Notification(_('New Updates'), - _('%s available updates') % rc) + _('%s available updates') + % update_count) notify.connect('notify-action', self.__on_notify_action) notify.show() - self.__last_num_updates = rc + self.__last_num_updates = update_count else: logger.debug('skipping notification (same # of updates)') else: @@ -178,7 +180,7 @@ def __get_updates(self): self.__mute_count) self.__update_timestamp.store_current_time() self.start_update_timer() # restart update timer if necessary - return rc + return update_count #========================================================================= # Callbacks From c17d8532c4e4d3f1bb2ad73401634654036d2e1e Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 21:53:50 +0200 Subject: [PATCH 061/133] Deduplicate code --- src/yumex/updater.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index ad29c7e..ff8dd05 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -79,14 +79,6 @@ def __on_closed(self, widget): self.emit('notify-action', 'closed') -def error_notify(summary, body): - Notify.init('Yum Extender') - icon = "yumex-dnf" - notification = Notify.Notification.new(summary, body, icon) - notification.set_timeout(5000) # timeout 5s - notification.show() - - class _UpdateTimestamp: ''' @@ -142,7 +134,7 @@ def __init__(self): except dnfdaemon.client.DaemonError as error: msg = str(error) logger.debug('Error starting dnfdaemon service: [%s]', msg) - error_notify('Error starting dnfdaemon service\n\n%s' % msg, msg) + misc.notify('Error starting dnfdaemon service\n\n%s' % msg, msg) sys.exit(1) def __get_updates(self): From fd8c4082c9b945ede5c960365c93dab8f683ed5f Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 22:03:55 +0200 Subject: [PATCH 062/133] More meaningful names for parameters --- src/yumex/updater.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index ff8dd05..ee141c3 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -72,10 +72,10 @@ def show(self): """Show the notification. This call does not block.""" self.__notification.show() - def __callback(self, widget, action): + def __callback(self, notification, action): self.emit('notify-action', action) - def __on_closed(self, widget): + def __on_closed(self, notification): self.emit('notify-action', 'closed') @@ -177,7 +177,7 @@ def __get_updates(self): #========================================================================= # Callbacks #========================================================================= - def __on_notify_action(self, widget, action): + def __on_notify_action(self, notification, action): """Handle notification actions. """ logger.debug('notify-action: %s', action) if action == 'later': From ce4fc944460068a25289a3eed1f9e562a525d12b Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 22:05:44 +0200 Subject: [PATCH 063/133] Read config file more robustly --- src/yumex/updater.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index ee141c3..9110cbb 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -93,19 +93,21 @@ def get_last_time_diff(self): ''' returns time difference to last check in seconds >=0 or -1 on error ''' - try: - now = int(time.time()) - if self.__last_time == -1: + now = int(time.time()) + if self.__last_time == -1: + try: file = open(self.__time_file, 'r') t_old = int(file.read()) file.close() self.__last_time = t_old - if self.__last_time > now: - return -1 - return now - self.__last_time - except: - pass - return -1 + except OSError as ose: + # File has not been written yet, this might happen on first run + logger.info('Error reading last timestamp from file: %s', + ose.strerror) + self.__last_time = 0 + if self.__last_time > now: + return -1 + return now - self.__last_time def store_current_time(self): """Save current time stamp permanently.""" From d2ec24a32a66016bd4bd2a523df2f37ebfd502e8 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 22:06:47 +0200 Subject: [PATCH 064/133] pass dnfdaemon exceptions through In case dnfdaemon has serious issues, they will probably repeat on every call to __get_updates(). To prevent looping through tracebacks, rather pass those exceptions through which will terminate the updater. --- src/yumex/updater.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 9110cbb..181a6e1 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -141,17 +141,13 @@ def __init__(self): def __get_updates(self): logger.debug('Checking for updates') - try: - if self.__backend.Lock(): - pkgs = self.__backend.GetPackages('updates') - update_count = len(pkgs) - logger.debug('# of updates : %d' % update_count) - self.__backend.Unlock() - else: - logger.debug('Error getting the dnfdaemon lock') - update_count = -1 - except: # catch backend exception - logger.debug('Error in getting updates') + if self.__backend.Lock(): + pkgs = self.__backend.GetPackages('updates') + update_count = len(pkgs) + self.__backend.Unlock() + logger.debug('#Number of updates : %d', update_count) + else: + logger.debug('Could not get the dnfdaemon lock') update_count = -1 if update_count > 0: if self.__mute_count < 1: From c90968a01275d0d896b9249a5aba73de7b15d1e1 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 22:15:20 +0200 Subject: [PATCH 065/133] Use GMainLoop instead of Gtk.main() Updater is headless, there is no need to utilize Gtk. --- src/yumex/updater.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 181a6e1..69d7ced 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -26,7 +26,7 @@ import time from subprocess import Popen -from gi.repository import Gio, Gtk, Notify, GObject +from gi.repository import Gio, Notify, GObject, GLib from xdg import BaseDirectory import dnfdaemon.client @@ -251,20 +251,22 @@ def __init__(self): self.connect("activate", self.__on_activate) self.connect("command-line", self.__on_command_line) - self.connect("shutdown", self.__on_shutdown) - self.__running = False self.__args = None self.__updater = None + self.__main_loop = GLib.MainLoop.new(GLib.MainContext.default(), False) def __on_activate(self, app): - self.__running = True self.__updater = _Updater() if not self.__args.delay: self.__updater.startup_init_update_timer() else: self.__updater.start_update_timer() - Gtk.main() - return 0 + self.__main_loop.run() + + def __cleanup_and_quit(self): + # all of UpdateApplication is running in main loop, so this is easy + misc.dbus_dnfsystem('Exit') + self.__main_loop.quit() def __log_setup(self): if self.__args.debug: @@ -275,12 +277,13 @@ def __log_setup(self): else: misc.logger_setup() - def __on_command_line(self, app, args): + def __on_command_line(self, new_cli): parser = argparse.ArgumentParser(prog='app') parser.add_argument('-d', '--debug', action='store_true') parser.add_argument('--exit', action='store_true') parser.add_argument('--delay', type=int) - if not self.__running: + + if new_cli.get_is_remote(): # second instance # First run self.__args = parser.parse_args(args.get_arguments()[1:]) self.__log_setup() @@ -302,6 +305,3 @@ def __on_command_line(self, app, args): sys.exit(0) self.activate() return 0 - - def __on_shutdown(self, app): - return 0 From e9c78cfbc0a7ce233aef00771faa0e9c8a9685bf Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 22:18:38 +0200 Subject: [PATCH 066/133] Add signal handler to cleanly exit on SIGTERM and Ctrl+C --- src/yumex/updater.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 69d7ced..645876a 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -17,6 +17,7 @@ # along with this program; if not, write to # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +from _signal import SIGINT, SIGTERM, SIGHUP import argparse @@ -261,8 +262,16 @@ def __on_activate(self, app): self.__updater.startup_init_update_timer() else: self.__updater.start_update_timer() + signals = [SIGINT, SIGTERM, SIGHUP] + for signal in signals: + GLib.unix_signal_add_full(GLib.PRIORITY_HIGH, signal, + self.__on_unix_signal) self.__main_loop.run() + def __on_unix_signal(self): + self.__cleanup_and_quit() + return GLib.SOURCE_REMOVE + def __cleanup_and_quit(self): # all of UpdateApplication is running in main loop, so this is easy misc.dbus_dnfsystem('Exit') From cead3d33229ed5856a8e06d654a316c674f2957d Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 22:20:26 +0200 Subject: [PATCH 067/133] Use OptionEntry instead of argparse OptionEntry is designed in a way that, it can handle GApplication command line flags in a multi process environment correctly. With argparse, running `updater.py --help` while another updater instance is running will make the first instance print the help message and terminate. Both is not intended but can barely be worked around. Using GLib code is able to fix this. --- src/yumex/updater.py | 92 ++++++++++++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 29 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 645876a..714f7e2 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -19,8 +19,6 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA from _signal import SIGINT, SIGTERM, SIGHUP - -import argparse import logging import os import sys @@ -252,13 +250,26 @@ def __init__(self): self.connect("activate", self.__on_activate) self.connect("command-line", self.__on_command_line) - self.__args = None self.__updater = None self.__main_loop = GLib.MainLoop.new(GLib.MainContext.default(), False) + self.add_main_option( + "debug", ord('d'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, + "Enable advanced debug output", None) + self.__debug = False + self.add_main_option( + "exit", 0, GLib.OptionFlags.NONE, GLib.OptionArg.NONE, + "Quit other updater instance", None) + self.add_main_option( + "delay", 0, GLib.OptionFlags.NONE, GLib.OptionArg.INT, + "Specify delay between update notifications, in seconds. " + "If omitted, the value will be read from configuration files.", + "timeout") + self.__delay = None + def __on_activate(self, app): self.__updater = _Updater() - if not self.__args.delay: + if not self.__delay: self.__updater.startup_init_update_timer() else: self.__updater.start_update_timer() @@ -278,7 +289,7 @@ def __cleanup_and_quit(self): self.__main_loop.quit() def __log_setup(self): - if self.__args.debug: + if self.__debug: misc.logger_setup( logroot='yumex.updater', logfmt='%(asctime)s: [%(name)s] - %(message)s', @@ -287,30 +298,53 @@ def __log_setup(self): misc.logger_setup() def __on_command_line(self, new_cli): - parser = argparse.ArgumentParser(prog='app') - parser.add_argument('-d', '--debug', action='store_true') - parser.add_argument('--exit', action='store_true') - parser.add_argument('--delay', type=int) + options = new_cli.get_options_dict() + debug = options.contains('debug') + do_exit = options.contains('exit') + if options.contains('delay'): + delay = options.lookup_value('delay', GLib.VariantType("i")) \ + .get_int32() + if not delay > 0: + Gio.ApplicationCommandLine.do_printerr_literal( + new_cli, "Delay must be a number greater than 0.\n") + return 2 + else: + delay = False + + exit_status = 0 if new_cli.get_is_remote(): # second instance - # First run - self.__args = parser.parse_args(args.get_arguments()[1:]) - self.__log_setup() - if self.__args.delay: - CONFIG.conf.update_interval = self.__args.delay - logger.debug('first run') + logger.debug('Successive run. Remote arguments: %s', + new_cli.get_arguments()) + # --debug + if self.__debug: + Gio.ApplicationCommandLine.do_printerr_literal( + new_cli, "Can't change debug level of remote updater.\n") + exit_status = 1 + # --delay + if delay: + logger.debug('Changing delay from remote command') + self.__delay = delay + # TODO restart timer + CONFIG.conf.update_interval = delay + # --exit + if do_exit: # kill dnf daemon and quit + logger.debug('quitting from remote command') + self.__cleanup_and_quit() + return exit_status # return status of second instance else: - logger.debug('second run') - # Second Run - # parse cmdline in a non quitting way - self.__current_args = \ - parser.parse_known_args(args.get_arguments()[1:])[0] - if self.__current_args.exit: - logger.debug('quitting') - self.quit() - sys.exit(0) - if self.__args.exit: # kill dnf daemon and quit - misc.dbus_dnfsystem('Exit') - sys.exit(0) - self.activate() - return 0 + # --debug + self.__debug = debug + self.__log_setup() + logger.debug('First run') + # --delay + if delay: + self.__delay = delay + CONFIG.conf.update_interval = delay + # --exit + if do_exit: + print("Updater was not running") + exit_status = 1 + # run + self.activate() + return exit_status From 57ae00f5f8c19242f93400db4b6772db06061aca Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 22:27:31 +0200 Subject: [PATCH 068/133] Minor changes * improved documentation * removed unnecessary import * removed unnecessary field * improved logging --- src/yumex/updater.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 714f7e2..602099d 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -1,4 +1,10 @@ -#!/usr/bin/python3 +""" + Anything needed to provide update notifications for users by a headless + background process. + + This module is intended to be called by instantiating UpdateApplication + from src/yumex/update.py. +""" # -*- coding: iso-8859-1 -*- # Yum Exteder (yumex) - A GUI for yum # Copyright (C) 2015 Tim Lauridsen < timlaufedoraprojectorg > @@ -23,7 +29,6 @@ import os import sys import time -from subprocess import Popen from gi.repository import Gio, Notify, GObject, GLib from xdg import BaseDirectory @@ -51,8 +56,7 @@ class _Notification(GObject.GObject): """Used to notify users of available updates""" __gsignals__ = { - 'notify-action': (GObject.SignalFlags.RUN_FIRST, None, - (str,)) + 'notify-action': (GObject.SignalFlags.RUN_FIRST, None, (str,)) } def __init__(self, summary, body): @@ -79,7 +83,6 @@ def __on_closed(self, notification): class _UpdateTimestamp: - ''' a persistent timestamp. e.g. for storing the last update check ''' @@ -125,7 +128,6 @@ def __init__(self): self.__update_timestamp = _UpdateTimestamp() self.__next_update = 0 self.__last_timestamp = 0 - self.__muted = False self.__mute_count = 0 self.__last_num_updates = 0 @@ -171,9 +173,6 @@ def __get_updates(self): self.start_update_timer() # restart update timer if necessary return update_count -#========================================================================= -# Callbacks -#========================================================================= def __on_notify_action(self, notification, action): """Handle notification actions. """ logger.debug('notify-action: %s', action) @@ -209,9 +208,8 @@ def start_update_timer(self): if time_diff == -1 or delay < 0: delay = 0 - logger.debug( - 'Starting update timer with a ' - 'delay of {0} min (time_diff={1})'.format(delay, time_diff)) + logger.debug('Starting update timer with a delay of %i min' + ' (time_diff=%i)', delay, time_diff) self.__next_update = delay self.__last_timestamp = int(time.time()) self.__update_timer_id = GObject.timeout_add_seconds( @@ -268,6 +266,7 @@ def __init__(self): self.__delay = None def __on_activate(self, app): + logger.debug("UpdateApplication activated") self.__updater = _Updater() if not self.__delay: self.__updater.startup_init_update_timer() From 5eada588a68f6d3b02a24254e57a604d5cbee919 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 27 May 2016 22:39:52 +0200 Subject: [PATCH 069/133] Fix bug Fix a previously introduced bug --- src/yumex/updater.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 602099d..deb3db4 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -247,7 +247,7 @@ def __init__(self): flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE) self.connect("activate", self.__on_activate) - self.connect("command-line", self.__on_command_line) + self.connect("command-line", UpdateApplication.__on_command_line) self.__updater = None self.__main_loop = GLib.MainLoop.new(GLib.MainContext.default(), False) From b7421205d7789da1d67864cc283cfe2dad011442 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Sat, 28 May 2016 18:21:04 +0200 Subject: [PATCH 070/133] Fix some typos in faq.rst --- docs/faq.rst | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/docs/faq.rst b/docs/faq.rst index 72b46e6..67fa08d 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -2,17 +2,17 @@ Yum Extender FAQ ================ -Generel +Main ============= -What does the package colors mean +What do the package colors mean ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * **red** is an available update * **green** is an installed package * **blue** is an obsoleting package (a package replacing one/more packages) * **black** is an available package in a repository. -This is the default colors, they can be configured in the preferences. +These are default colors, they can be configured in the preferences. How to select all updates ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -23,10 +23,10 @@ Click on the **+** in the header column to select/deselect all updates Configuration ============= -How do it setup yumex, to not ask for password on start +How do I setup yumex to not ask for a password on start ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -run the follow as root, to create a PolicyKit rule to run DnfSystem dbus commands without asking for password +Run the following command as root to create a PolicyKit rule to run DnfSystem dbus commands without asking for password :: @@ -90,8 +90,3 @@ You can open an issue here_ for any problem found .. _here: https://github.com/timlau/yumex-dnf/issues - - - - - From 30a6cc9a33c6dda7a4a1b66f59186f29370374d9 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Sat, 28 May 2016 18:51:48 +0200 Subject: [PATCH 071/133] Fixed: Output for secondary instance printed on primary Thanks to Neil Muller [1] who pointed this out to me. [1] https://mail.gnome.org/archives/python-hackers-list/2016-May/msg00009.html --- src/yumex/updater.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yumex/updater.py b/src/yumex/updater.py index deb3db4..362c531 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -304,7 +304,7 @@ def __on_command_line(self, new_cli): delay = options.lookup_value('delay', GLib.VariantType("i")) \ .get_int32() if not delay > 0: - Gio.ApplicationCommandLine.do_printerr_literal( + new_cli.do_printerr_literal( new_cli, "Delay must be a number greater than 0.\n") return 2 else: @@ -314,10 +314,10 @@ def __on_command_line(self, new_cli): if new_cli.get_is_remote(): # second instance logger.debug('Successive run. Remote arguments: %s', - new_cli.get_arguments()) + " ".join(new_cli.get_arguments())) # --debug if self.__debug: - Gio.ApplicationCommandLine.do_printerr_literal( + new_cli.do_printerr_literal( new_cli, "Can't change debug level of remote updater.\n") exit_status = 1 # --delay From 564b9f6906be0a9ab7411de385bf3b2143d61a2d Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 30 May 2016 06:57:50 +0200 Subject: [PATCH 072/133] Remove leftovers Package colors are different now. Tray icon support has gone. --- src/yumex/const.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/yumex/const.py b/src/yumex/const.py index d287a4e..9eccf29 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -66,12 +66,6 @@ DBUS_ERR_RE = re.compile(r'.*GDBus.Error:([\w\.]*): (.*)$') -ICON_TRAY_ERROR = PIX_DIR + '/tray-error.png' -ICON_TRAY_NO_UPDATES = PIX_DIR + '/tray-no-updates.png' -ICON_TRAY_UPDATES = PIX_DIR + '/tray-updates.png' -ICON_TRAY_WORKING = PIX_DIR + '/tray-working.png' -ICON_TRAY_INFO = PIX_DIR + '/tray-info.png' - # Constants # Main UI stack names @@ -88,18 +82,6 @@ 'obsoletes': 'o', 'downgrade': 'do', 'reinstall': 'ri', 'localinstall': 'li', 'updates_all': 'u'} - -PACKAGE_COLORS = { - 'i': 'black', - 'u': 'red', - 'r': 'darkgreen', - 'o': 'blue', - 'ri': 'red', - 'do': 'goldenrod', - 'li': 'black' - -} - BACKEND_ACTIONS = {'update': 'u', 'install': 'i', 'remove': 'r', 'obsolete': 'o', 'downgrade': 'do'} From ca6415f55ab5534b69a4d0a426f776daeea157e1 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Fri, 10 Jun 2016 21:31:45 +0200 Subject: [PATCH 073/133] deduplicate: LICENSE is in COPYING already In commit 1fac5f22c2f7d66992a49c7fc6a2e92e6c96cf3c I added another file for GPLv2 which is not needed, because COPYING already exists. --- LICENSE | 339 -------------------------------------------------------- 1 file changed, 339 deletions(-) delete mode 100644 LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 23cb790..0000000 --- a/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {description} - Copyright (C) {year} {fullname} - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. From c241cd4741f5b92ed15512a5274d72737e1bafb0 Mon Sep 17 00:00:00 2001 From: Woi Date: Mon, 15 Aug 2016 18:31:41 +0200 Subject: [PATCH 074/133] Complete and improve german translation * Add missing translations * Improve some existing translation strings --- po/de.po | 103 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/po/de.po b/po/de.po index 0809765..67d7274 100644 --- a/po/de.po +++ b/po/de.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Marco Woitschitzky, 2016 # Christian Stadelmann, 2015 # Mario Blättermann , 2014 msgid "" @@ -10,8 +11,8 @@ msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" -"Last-Translator: Tim Lauridsen \n" +"PO-Revision-Date: 2016-08-15 16:49+0000\n" +"Last-Translator: Marco Woitschitzky\n" "Language-Team: German (http://www.transifex.com/timlau/yumex/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,13 +26,13 @@ msgstr "Paketquellen-Metadaten werden aktualisiert" #: ../src/yumex/__init__.py:119 ../src/yumex/old_init.py:144 msgid "Could not refresh the DNF cache (root)" -msgstr "Dnf-Zwischenspeicher konnte nicht aktualisiert werden (Root)" +msgstr "DNF-Zwischenspeicher konnte nicht aktualisiert werden (root)" #: ../src/yumex/__init__.py:124 ../src/yumex/old_init.py:149 msgid "" "DNF root backend was not authorized.\n" "Yum Extender will exit" -msgstr "Das Root-Backend von Dnf wurde nicht autorisiert.\nYum Extender wird beendet." +msgstr "Das Root-Backend von DNF wurde nicht autorisiert.\nYum Extender wird beendet." #: ../src/yumex/__init__.py:129 ../src/yumex/old_init.py:154 msgid "" @@ -42,7 +43,7 @@ msgstr "DNF wird von einem anderen Prozess gesperrt.\n\nYum Extender wird beende #: ../src/yumex/__init__.py:623 msgid "Reloading package information..." -msgstr "" +msgstr "Neu laden der Paketinformationen..." #: ../src/yumex/__init__.py:746 ../src/yumex/__init__.py:829 #: ../src/yumex/old_init.py:266 ../src/yumex/old_init.py:1047 @@ -81,25 +82,25 @@ msgstr "Installiere Paket %s" #: ../src/yumex/__init__.py:815 #, python-format msgid "%s was installed successfully" -msgstr "" +msgstr "%s wurde erfolgreich installiert" #: ../src/yumex/__init__.py:820 ../src/yumex/old_init.py:259 #, python-format msgid "Removing package: %s" -msgstr "Entferne Paket %s" +msgstr "Entferne Paket: %s" #: ../src/yumex/__init__.py:821 #, python-format msgid "%s was removed successfully" -msgstr "" +msgstr "%s wurde erfolgreich entfernt" #: ../src/yumex/__init__.py:826 ../src/yumex/old_init.py:264 msgid "Updating all available updates" -msgstr "" +msgstr "Update alle verfügbaren Aktualisierungen" #: ../src/yumex/__init__.py:827 msgid "Available updates was applied successfully" -msgstr "" +msgstr "Verfügbare Aktualisierungen wurden erfolgreich installiert" #: ../src/yumex/__init__.py:846 ../src/yumex/__init__.py:896 #: ../src/yumex/old_init.py:286 ../src/yumex/old_init.py:1149 @@ -128,7 +129,7 @@ msgstr "Pakete werden zur Ansicht hinzugefügt" #: ../src/yumex/__init__.py:1064 ../src/yumex/old_init.py:728 msgid "Error in undo history transaction" -msgstr "" +msgstr "Fehler beim Zurückrollen der Transaktion" #: ../src/yumex/dnf_backend.py:181 #, python-format @@ -136,7 +137,7 @@ msgid "" "dnfdaemon api version : %d\n" "don't match\n" "needed api version : %d" -msgstr "" +msgstr "dnfdaemon API-Version: %d\npasst nicht\nbenötigte API-Version: %d" #: ../src/yumex/dnf_backend.py:191 msgid "Downloading packages" @@ -153,7 +154,7 @@ msgstr "Überprüfung der Änderungen am System" #: ../src/yumex/dnf_backend.py:246 #, python-format msgid "Downloading %d files (%sB)..." -msgstr "" +msgstr "Lade %d Dateien herunter (%sB)..." #: ../src/yumex/const.py:129 msgid "Getting installed packages" @@ -236,7 +237,7 @@ msgstr "Installiere %s" #: ../src/yumex/const.py:167 #, python-format msgid "Reinstalling: %s" -msgstr "" +msgstr "Reinstalliere %s" #: ../src/yumex/const.py:168 #, python-format @@ -288,28 +289,28 @@ msgid "" "\n" "\n" "Yum Extender will close" -msgstr "" +msgstr "\n\nYum Extender wird beendet" #: ../src/yumex/old_init.py:1307 msgid "Error in starting notification icon" -msgstr "Fehler beim Starten des Symbols in der Statusleiste" +msgstr "Fehler beim Starten des Benachrichtigungssymbols" #: ../src/yumex/old_init.py:1331 msgid "Yum Extender will close" -msgstr "Yum Extender wird geschlossen" +msgstr "Yum Extender wird beendet" #: ../src/yumex/old_init.py:1333 msgid "Error in locking notification icon" -msgstr "" +msgstr "Fehler beim sperren des Benachrichtigungssymbols" #. timeout 10s #: ../src/yumex/updater.py:68 msgid "Not Now" -msgstr "" +msgstr "Später" #: ../src/yumex/updater.py:70 msgid "Show Updates" -msgstr "" +msgstr "Aktualisierungen anzeigen" #: ../src/yumex/updater.py:165 msgid "New Updates" @@ -413,7 +414,7 @@ msgstr "Version" #: ../src/yumex/gui/dialogs.py:251 msgid "replacing {}" -msgstr "" +msgstr "ersetze {}" #: ../src/yumex/gui/dialogs.py:287 #, python-format @@ -447,7 +448,7 @@ msgstr "Keine Information über Aktualisierungen des Paketes verfügbar" msgid "" "\n" "Fedora Updates:" -msgstr "" +msgstr "Fedora Aktualisierungen:" #: ../src/yumex/gui/widgets.py:661 msgid "Release" @@ -468,13 +469,13 @@ msgstr "Beschreibung" #: ../src/yumex/gui/widgets.py:724 msgid "No changelog information is available" -msgstr "Keine Informationen über die Aktualisierungen dieses Pakets verfügbar." +msgstr "Keine Informationen über die Änderungshistorie dieses Pakets verfügbar." #: ../src/yumex/gui/widgets.py:726 msgid "" "\n" "Online Changelog:" -msgstr "" +msgstr "Online Änderungshistorie:" #: ../src/yumex/gui/widgets.py:741 msgid "No filelist information is available" @@ -482,31 +483,31 @@ msgstr "Keine Liste der bereitgestellten Pakete vorhanden" #: ../src/yumex/gui/widgets.py:771 msgid "Newest only" -msgstr "" +msgstr "Nur die Neusten" #: ../src/yumex/gui/widgets.py:772 msgid "Erase unused requirements" -msgstr "" +msgstr "Lösche unbenutzte Abhängigkeiten" #: ../src/yumex/gui/widgets.py:774 msgid "Cleanup old instonly packages " -msgstr "" +msgstr "Entferne alte »Installonly«-Pakete" #: ../src/yumex/gui/widgets.py:776 msgid "Options" -msgstr "" +msgstr "Optionen" #: ../src/yumex/gui/widgets.py:778 msgid "About" -msgstr "" +msgstr "Über" #: ../src/yumex/gui/widgets.py:779 msgid "Documentation" -msgstr "" +msgstr "Dokumentation" #: ../src/yumex/gui/widgets.py:780 msgid "Help" -msgstr "" +msgstr "Hilfe" #: ../src/yumex/gui/widgets.py:782 ../src/yumex.ui.h:1 msgid "Preferences" @@ -514,7 +515,7 @@ msgstr "Einstellungen" #: ../src/yumex/gui/widgets.py:783 msgid "Quit" -msgstr "" +msgstr "Beenden" #: ../misc/yumex-dnf-local.desktop.in.h:1 msgid "Yumex Package Installer" @@ -649,7 +650,7 @@ msgstr "Alle verfügbaren Aktualisierungen beim Start auswählen" msgid "" "The interval in hour, when the DNF cache will be expired and updated (0 = " "disabled)" -msgstr "" +msgstr "Interval in Stunden, nachdem der DNF-Zwischenspeicher als veraltet markiert und aktualisiert wird (0 = deaktiviert)" #: ../src/yumex.ui.h:22 msgid "Cache expire interval (hours)" @@ -677,23 +678,23 @@ msgstr "Einstellungen" #: ../src/yumex.ui.h:28 msgid "Autostart the Yum Extender update checker at user login" -msgstr "" +msgstr "Lade Yum Extender bei der Benutzeranmeldung für die Hintergrundsuche nach Aktualisierungen" #: ../src/yumex.ui.h:29 msgid "Start update checker at user login" -msgstr "" +msgstr "Lade Hintergrundsuche nach Aktualisierungen bei der Benutzeranmeldung" #: ../src/yumex.ui.h:30 msgid "How often the update checker will run" -msgstr "Das Intervall, in nach Updates gesucht wird" +msgstr "Häufigkeit mit der nach Aktualisierungen gesucht wird" #: ../src/yumex.ui.h:31 msgid "Update check interval (minutes)" -msgstr "Intervall zur Prüfung auf Aktualisierungen (Minuten)" +msgstr "Intervall zur Suche nach Aktualisierungen (Minuten)" #: ../src/yumex.ui.h:32 msgid "Update Checker" -msgstr "" +msgstr "Aktualisierungssuche" #: ../src/yumex.ui.h:33 msgid "Color for installed packages" @@ -744,7 +745,7 @@ msgstr "Label" #: ../src/yumex.ui.h:46 msgid "Show available updates" -msgstr "" +msgstr "Zeige verfügbare Aktualisierungen" #: ../src/yumex.ui.h:47 msgid "Updates" @@ -752,7 +753,7 @@ msgstr "Aktualisierungen" #: ../src/yumex.ui.h:48 msgid "Show installed packages" -msgstr "" +msgstr "Zeige installierte Pakete" #: ../src/yumex.ui.h:49 msgid "Installed" @@ -760,7 +761,7 @@ msgstr "Installiert" #: ../src/yumex.ui.h:50 msgid "Show available packages" -msgstr "" +msgstr "Zeige verfügbare Pakete" #: ../src/yumex.ui.h:51 msgid "Available" @@ -768,7 +769,7 @@ msgstr "Verfügbar" #: ../src/yumex.ui.h:52 msgid "Show all packages" -msgstr "" +msgstr "Zeige alle Pakete" #: ../src/yumex.ui.h:53 msgid "All" @@ -804,15 +805,15 @@ msgstr "Dateiliste des Pakets" #: ../src/yumex.ui.h:62 msgid "Package Requirements" -msgstr "benötigte Abhängigkeiten von diesem Paket" +msgstr "Abhängigkeiten des Pakets" #: ../src/yumex.ui.h:63 msgid "Search (show/hide)" -msgstr "" +msgstr "Suche (zeigen/verbergen)" #: ../src/yumex.ui.h:64 msgid "Apply pending actions" -msgstr "" +msgstr "Auststehende Aktionen anwenden" #: ../src/yumex.ui.h:65 msgid "Prefix" @@ -820,7 +821,7 @@ msgstr "Präfix des Paketnamens" #: ../src/yumex.ui.h:66 msgid "Package names starting with search key" -msgstr "" +msgstr "Paketnamen die mit Suchwort beginnen" #: ../src/yumex.ui.h:67 msgid "Keyword" @@ -828,7 +829,7 @@ msgstr "Schlüsselwort" #: ../src/yumex.ui.h:68 msgid "Package names containing search key" -msgstr "" +msgstr "Paketnamen die Suchwort enthalten" #: ../src/yumex.ui.h:69 msgid "Fields" @@ -836,19 +837,19 @@ msgstr "Felder" #: ../src/yumex.ui.h:70 msgid "Specified package fields containing search keys." -msgstr "" +msgstr "Ausgewählte Paketfelder die Suchwörter enthalten" #: ../src/yumex.ui.h:72 msgid "Package name" -msgstr "" +msgstr "Paketname" #: ../src/yumex.ui.h:74 msgid "Package summary" -msgstr "" +msgstr "Paketzusammenfassung" #: ../src/yumex.ui.h:76 msgid "Package description" -msgstr "" +msgstr "Paketbeschreibung" #: ../src/yumex.ui.h:77 msgid "Package actions to perform" From aebbcc807ecb33dd6aa8910bc7512103d0a92562 Mon Sep 17 00:00:00 2001 From: Woi Date: Mon, 15 Aug 2016 18:42:22 +0200 Subject: [PATCH 075/133] Fix wrong version number. Adjust version number reported in "About" to RPM version number. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f39f9f6..69cab13 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ def run(self): os.rename(outfile, newfile) setup(name="yumex-dnf", - version="4.3.2", + version="4.3.3", description="Graphical package management tool", long_description="", author="Tim Lauridsen", From cde25cee2767314b03360c8f9dc6563c3b745421 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 15 Aug 2016 19:25:52 +0200 Subject: [PATCH 076/133] Add info for contributing to yumex-dnf Add some info so contributors have a chance of knowing how and where to help out. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 4f9dd3e..3c4030b 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,7 @@ Use this to enable it. ``` sudo dnf copr enable timlau/yumex-dnf ``` + +Contributing +============ +Please [report bugs](https://github.com/timlau/yumex-dnf/issues) if you find some. In case you want to [propose changes](https://github.com/timlau/yumex-dnf/pulls), please do so on Github after [testing](https://github.com/timlau/yumex-dnf/wiki/Testing-yumex-for-developing) them. If you want to contribute translations, please do so on [Transifex](https://www.transifex.com/timlau/yumex/). From 4fe3860c82a3971045852a26db5beee653090fb4 Mon Sep 17 00:00:00 2001 From: Woi Date: Tue, 16 Aug 2016 09:26:25 +0200 Subject: [PATCH 077/133] Incorporate feedback from review Thanks to Christian Stadelmann (genodeftest) for review and suggestions. --- po/de.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/po/de.po b/po/de.po index 67d7274..ab96388 100644 --- a/po/de.po +++ b/po/de.po @@ -96,7 +96,7 @@ msgstr "%s wurde erfolgreich entfernt" #: ../src/yumex/__init__.py:826 ../src/yumex/old_init.py:264 msgid "Updating all available updates" -msgstr "Update alle verfügbaren Aktualisierungen" +msgstr "Installiere alle verfügbaren Aktualisierungen" #: ../src/yumex/__init__.py:827 msgid "Available updates was applied successfully" @@ -129,7 +129,7 @@ msgstr "Pakete werden zur Ansicht hinzugefügt" #: ../src/yumex/__init__.py:1064 ../src/yumex/old_init.py:728 msgid "Error in undo history transaction" -msgstr "Fehler beim Zurückrollen der Transaktion" +msgstr "Fehler beim Rückgängig machen der Transaktion" #: ../src/yumex/dnf_backend.py:181 #, python-format @@ -650,7 +650,7 @@ msgstr "Alle verfügbaren Aktualisierungen beim Start auswählen" msgid "" "The interval in hour, when the DNF cache will be expired and updated (0 = " "disabled)" -msgstr "Interval in Stunden, nachdem der DNF-Zwischenspeicher als veraltet markiert und aktualisiert wird (0 = deaktiviert)" +msgstr "Intervall in Stunden, nachdem der DNF-Zwischenspeicher als veraltet markiert und aktualisiert wird (0 = deaktiviert)" #: ../src/yumex.ui.h:22 msgid "Cache expire interval (hours)" @@ -821,7 +821,7 @@ msgstr "Präfix des Paketnamens" #: ../src/yumex.ui.h:66 msgid "Package names starting with search key" -msgstr "Paketnamen die mit Suchwort beginnen" +msgstr "Paketnamen die mit Suchbegriff beginnen" #: ../src/yumex.ui.h:67 msgid "Keyword" @@ -829,7 +829,7 @@ msgstr "Schlüsselwort" #: ../src/yumex.ui.h:68 msgid "Package names containing search key" -msgstr "Paketnamen die Suchwort enthalten" +msgstr "Paketnamen die den Suchbegriff enthalten" #: ../src/yumex.ui.h:69 msgid "Fields" From 033689d558d74c61f6eefea2c88a69539eca2583 Mon Sep 17 00:00:00 2001 From: Vaughan Agrez Date: Sun, 28 Aug 2016 23:05:00 +0800 Subject: [PATCH 078/133] Fix armv7hl packages not showing on arm releases Under current Fedora armv7hl releases, '/usr/bin/rpm --eval %_arch' evaluates to 'arm' (refer /usr/lib/rpm/platform/armv7hl-linux/macros). As ARCH=arm and is not found in ARCH_DICT, code falls back to setting PLATFORM_ARCH as x86_64 (and obviously there are no x86_64 packages to be found in the arm repositories). This results in armv7hl packages not showing (only noarch packages will be displayed). --- src/yumex/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yumex/const.py b/src/yumex/const.py index 9eccf29..51fecbd 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -55,7 +55,7 @@ ARCH_DICT = { "x86_64": set(['x86_64', 'i686', 'i386', 'noarch']), "i386": set(['i686', 'i386', 'noarch']), - "armhfp": set(['armv7hl', 'noarch']) + "arm": set(['armv7hl', 'noarch']) } # arch for this platform From c110fa1efee9582f98da752db28ec59f10596fe4 Mon Sep 17 00:00:00 2001 From: Vaughan Agrez Date: Mon, 29 Aug 2016 12:49:34 +0800 Subject: [PATCH 079/133] Release version should be 4.3.3 --- setup.py | 2 +- src/yumex/const.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index f39f9f6..69cab13 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ def run(self): os.rename(outfile, newfile) setup(name="yumex-dnf", - version="4.3.2", + version="4.3.3", description="Graphical package management tool", long_description="", author="Tim Lauridsen", diff --git a/src/yumex/const.py b/src/yumex/const.py index 51fecbd..ce8cdb6 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -27,7 +27,7 @@ from yumex.misc import _ -VERSION = "4.3.2" +VERSION = "4.3.3" NEEDED_DAEMON_API = 2 # The needed dnfdaemon API version From 8992fec7987ca3be5cdbd4cd89aaaba7c8d26aa5 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Mon, 5 Sep 2016 20:17:44 +0200 Subject: [PATCH 080/133] gui/widgets.py: select first item in info_list by default Without this fix, no element in info_list is selected by default, leaving the UI in an unexpected (inconsistent) state. Fixes (parts of) bug #135. --- src/yumex/gui/widgets.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 1850473..9e89ae1 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -373,6 +373,7 @@ def __init__(self, win, url_handler=None): self.url_tags = [] self.underlined_url = False self.url_list = {} + self._listbox.select_row(self.win.get_ui('list_desc')) def show(self, show=True): if show: From 123d12b3c3edff1e3ebfc11c488a3fcb249932ff Mon Sep 17 00:00:00 2001 From: Rafal Luzynski Date: Fri, 18 Nov 2016 10:38:32 +0100 Subject: [PATCH 081/133] Internationalization: Plurals fixed All occurrences of "P_" replaced with "ngettext" which is correctly understood by gettext tools. Also ngettext() applied to few more messages where it seemed to be necessary to distinguish between plural and singular. At the same time, a reference to no longer existing old_init.py removed from POTFILES.in. Closes #139 --- po/POTFILES.in | 1 - src/yumex/__init__.py | 24 +++++++++++++++++------- src/yumex/dnf_backend.py | 9 +++++++-- src/yumex/gui/views.py | 20 ++++++++++---------- src/yumex/misc.py | 2 +- src/yumex/updater.py | 7 +++++-- 6 files changed, 40 insertions(+), 23 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 49feccd..acd5c87 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -6,7 +6,6 @@ src/yumex/backend.py src/yumex/dnf_backend.py src/yumex/misc.py src/yumex/const.py -src/yumex/old_init.py src/yumex/updater.py src/yumex/gui/views.py src/yumex/gui/__init__.py diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 8b91bc8..745b1b7 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -28,7 +28,7 @@ from gi.repository import Gio, Gtk, Gdk -from yumex.misc import _, CONFIG +from yumex.misc import _, ngettext, CONFIG import yumex.const as const import yumex.misc as misc import yumex.dnf_backend @@ -817,13 +817,17 @@ def _run_transaction(self): if rc == 4: # Download errors dialogs.show_information( - self, _('Downloading error(s)\n'), + self, + ngettext('Downloading error\n', + 'Downloading errors\n', len(result)), '\n'.join(result)) self._reset_on_cancel() return elif rc != 0: # other transaction errors dialogs.show_information( - self, _('Error in transaction\n'), + self, + ngettext('Error in transaction\n', + 'Errors in transaction\n', len(result)), '\n'.join(result)) self._reset() return @@ -870,7 +874,9 @@ def _process_actions_installmode(self, action, package, always_yes, misc.notify('Yum Extender', exit_msg) else: dialogs.show_information( - self, _('Error(s) in search for dependencies'), + self, + ngettext('Error in search for dependencies', + 'Errors in search for dependencies', len(result)), '\n'.join(result)) if app_quit: self.release_root_backend(quit_dnfdaemon=True) @@ -897,7 +903,8 @@ def _process_actions(self, from_queue=True): check = self._check_protected(result) if check: self.error_dialog.show( - _("Can't remove protected package(s):") + + ngettext("Can't remove protected package:", + "Can't remove protected packages:", len(check)) + misc.list_to_string(check, "\n ", ",\n ")) self._reset_on_cancel() return @@ -916,11 +923,14 @@ def _process_actions(self, from_queue=True): except misc.TransactionBuildError as e: # Error in building transaction self.error_dialog.show( - _('Error(s) in building transaction') + '\n'.join(e.msgs)) + ngettext('Error in building transaction', + 'Errors in building transaction', len(e.msgs)) + + '\n'.join(e.msgs)) self._reset_on_cancel() except misc.TransactionSolveError as e: self.error_dialog.show( - _('Error(s) in search for dependencies') + + ngettext('Error in search for dependencies', + 'Errors in search for dependencies', len(e.msgs)) + '\n'.join(e.msgs)) self._reset_on_error() diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index fc13861..895d350 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -27,7 +27,7 @@ import yumex.backend import yumex.misc import yumex.const as const -from yumex.misc import ExceptionHandler, TimeFunction, _, CONFIG +from yumex.misc import ExceptionHandler, TimeFunction, _, ngettext, CONFIG logger = logging.getLogger('yumex.yum_backend') @@ -241,7 +241,12 @@ def on_DownloadStart(self, num_files, num_bytes): self._files_downloaded = 0 self.frontend.infobar.set_progress(0.0) self.frontend.infobar.info_sub( - _('Downloading %d files (%sB)...') % + # Translators: %d will be replaced with the number of files + # to download; %s will be replaced with the preformatted + # number of bytes to download + the prefix (k, M, etc.) + # Note that 'B' for 'bytes' is already here, it must be preserved. + ngettext('Downloading %d file (%sB)...', + 'Downloading %d files (%sB)...', num_files) % (num_files, yumex.misc.format_number(num_bytes))) def on_DownloadProgress(self, name, frac, total_frac, total_files): diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index 0a4d8f7..c65d868 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -27,7 +27,7 @@ from gi.repository import GObject from yumex import const -from yumex.misc import _, P_, CONFIG, doGtkEvents, TimeFunction +from yumex.misc import _, ngettext, CONFIG, doGtkEvents, TimeFunction import yumex.misc as misc logger = logging.getLogger('yumex.gui.views') @@ -800,38 +800,38 @@ def refresh(self): """ Populate view with data from queue """ self.store.clear() pkg_list = self.queue.packages['u'] + self.queue.packages['o'] - label = "%s" % P_( + label = "%s" % ngettext( "Package to update", "Packages to update", len(pkg_list)) if len(pkg_list) > 0: self.populate_list(label, pkg_list) pkg_list = self.queue.packages['i'] - label = "%s" % P_( + label = "%s" % ngettext( "Package to install", "Packages to install", len(pkg_list)) if len(pkg_list) > 0: self.populate_list(label, pkg_list) pkg_list = self.queue.packages['r'] - label = "%s" % P_( + label = "%s" % ngettext( "Package to remove", "Packages to remove", len(pkg_list)) if len(pkg_list) > 0: self.populate_list(label, pkg_list) pkg_list = self.queue.packages['ri'] - label = "%s" % P_( + label = "%s" % ngettext( "Package to reinstall", "Packages to reinstall", len(pkg_list)) if len(pkg_list) > 0: self.populate_list(label, pkg_list) pkg_list = self.queue.packages['li'] - label = "%s" % P_( + label = "%s" % ngettext( "RPM file to install", "RPM files to install", len(pkg_list)) if len(pkg_list) > 0: self.populate_list(label, pkg_list) grps = self.queue.groups['i'] - label = "%s" % P_( + label = "%s" % ngettext( "Group to install", "Groups to install", len(pkg_list)) if len(grps) > 0: self.populate_group_list(label, grps) grps = self.queue.groups['r'] - label = "%s" % P_( - "Group to remove", "Groups files to remove", len(pkg_list)) + label = "%s" % ngettext( + "Group to remove", "Groups to remove", len(pkg_list)) if len(grps) > 0: self.populate_group_list(label, grps) self.populate_list_downgrade() @@ -850,7 +850,7 @@ def populate_group_list(self, label, grps): def populate_list_downgrade(self): pkg_list = self.queue.packages['do'] - label = "%s" % P_( + label = "%s" % ngettext( "Package to downgrade", "Packages to downgrade", len(pkg_list)) if len(pkg_list) > 0: parent = self.store.append(None, [label, ""]) diff --git a/src/yumex/misc.py b/src/yumex/misc.py index a28bfe4..c0c291a 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -40,7 +40,7 @@ gettext.bindtextdomain('yumex-dnf', LOCALE_DIR) gettext.textdomain('yumex-dnf') _ = gettext.gettext -P_ = gettext.ngettext +ngettext = gettext.ngettext logger = logging.getLogger('yumex.misc') diff --git a/src/yumex/updater.py b/src/yumex/updater.py index 362c531..ef8f81c 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -35,7 +35,7 @@ import dnfdaemon.client -from yumex.misc import _, CONFIG +from yumex.misc import _, ngettext, CONFIG import yumex.misc as misc LOG_ROOT = 'yumex.updater' @@ -158,7 +158,10 @@ def __get_updates(self): logger.debug('notification opened : # updates = %d', update_count) notify = _Notification(_('New Updates'), - _('%s available updates') + # Translators: %d is a number of available updates + ngettext('%d available update', + '%d available updates', + update_count) % update_count) notify.connect('notify-action', self.__on_notify_action) notify.show() From d3623810f35510df88e939459780990b40a859d2 Mon Sep 17 00:00:00 2001 From: Rafal Luzynski Date: Fri, 25 Nov 2016 10:01:56 +0100 Subject: [PATCH 082/133] Polish some labels and tooltips 1. There is no need to label a label "label" and make it translatable. 2. Keyboard shortcuts in tooltips should be like "Ctrl+n" rather than "Ctrl - n". --- src/yumex.ui | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 7054716..1de832a 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -912,7 +912,6 @@ start Yum Extender 10 6 10 - label @@ -945,7 +944,6 @@ start Yum Extender 10 20 10 - label @@ -1126,7 +1124,7 @@ start Yum Extender True True - Show available updates (Ctrl - 1) + Show available updates (Ctrl+1) 6 6 @@ -1143,7 +1141,7 @@ start Yum Extender True True - Show installed packages (Ctrl - 2) + Show installed packages (Ctrl+2) 6 6 @@ -1160,7 +1158,7 @@ start Yum Extender True True - Show available packages (Ctrl - 3) + Show available packages (Ctrl+3) 6 6 @@ -1177,7 +1175,7 @@ start Yum Extender True True - Show all packages (Ctrl - 4) + Show all packages (Ctrl+4) 6 6 From c89061dbdb7b2742a3c6e672c1c9c22d25a94cab Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 22 Mar 2017 11:36:19 +0100 Subject: [PATCH 083/133] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 3c4030b..aa2605d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +23-03-2017 +========== +yumex-dnf if no longer under active development + Yum Extender (yumex-dnf) ========================= From ae76f792c0e171f87fe10e4387859e7b09b548bb Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 22 Mar 2017 11:37:03 +0100 Subject: [PATCH 084/133] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index aa2605d..38dcf10 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -23-03-2017 -========== -yumex-dnf if no longer under active development +23-03-2017: yumex-dnf if no longer under active development +============================================================ + Yum Extender (yumex-dnf) ========================= From 53b3951deba1aad806e9675c4286aedfd772e914 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 22 Mar 2017 11:39:42 +0100 Subject: [PATCH 085/133] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38dcf10..93b455b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -23-03-2017: yumex-dnf if no longer under active development +23-03-2017: yumex-dnf is no longer under active development ============================================================ From cbc845647cc28906fd4ce5e0b37b335910f7f018 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sun, 1 Sep 2019 10:57:19 +0200 Subject: [PATCH 086/133] Fix colors to look better ona dark theme --- src/yumex.ui | 94 +++++++++++++++++++++------------------- src/yumex/gui/widgets.py | 4 +- src/yumex/misc.py | 19 +++++--- 3 files changed, 64 insertions(+), 53 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 1de832a..68f69d8 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -1,5 +1,5 @@ - + @@ -28,6 +28,41 @@ False dialog + + + True + False + + + + + + True + False + 6 + 6 + vertical + start + + + True + False + pref_stack + + + True + True + 0 + + + + + + + + pref_ok + pref_cancel + False @@ -635,41 +670,6 @@ start Yum Extender pref_ok pref_cancel - - - True - False - - - - - - True - False - 6 - 6 - vertical - start - - - True - False - pref_stack - - - True - True - 0 - - - - - - - - pref_ok - pref_cancel - True @@ -685,6 +685,9 @@ start Yum Extender 260 True dialog + + + False @@ -788,7 +791,7 @@ start Yum Extender description - midnight blue + #3584e4 Normal Monospace 0.90000000000000002 @@ -797,7 +800,7 @@ start Yum Extender changelog-header - dark red + #e01b24 Normal Monospace 0.90000000000000002 @@ -806,7 +809,7 @@ start Yum Extender changelog-header_dark - #A23232 + #e01b24 Normal Monospace 0.90000000000000002 @@ -815,7 +818,7 @@ start Yum Extender changelog_dark - #6E6EDF + #3584e4 Normal Monospace 0.90000000000000002 @@ -824,7 +827,7 @@ start Yum Extender changelog - midnight blue + #3584e4 Normal Monospace 0.90000000000000002 @@ -833,7 +836,7 @@ start Yum Extender filelist_dark - DarkOrchid4 + #3584e4 Normal Monospace 0.90000000000000002 @@ -842,7 +845,7 @@ start Yum Extender filelist - DarkOrchid4 + #3584e4 Normal Monospace 0.90000000000000002 @@ -851,7 +854,7 @@ start Yum Extender description_dark - #6E6EDF + #3584e4 Normal Monospace 0.90000000000000002 @@ -1863,6 +1866,9 @@ start Yum Extender 260 True dialog + + + False diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 9e89ae1..2e54518 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -466,10 +466,10 @@ def add_url(self, text, url, newline=False): if not tag: if yumex.misc.check_dark_theme(): tag = self._buffer.create_tag(text, - foreground="#4C4CFF") + foreground="#ff7800") else: tag = self._buffer.create_tag(text, - foreground="blue") + foreground="#ff7800") tag.connect("event", self.on_url_event) self.url_tags.append(tag) self.url_list[text] = url diff --git a/src/yumex/misc.py b/src/yumex/misc.py index c0c291a..08bd2a1 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -267,15 +267,20 @@ class YumexConf(config.BaseConfig): debug = config.BoolOption(False) autostart = config.BoolOption(False) - color_install = config.Option('#4E9A06') - color_update = config.Option('#CC0000') - color_downgrade = config.Option('#C17D11') - color_normal = config.Option('#000000') - if check_dark_theme(): - color_obsolete = config.Option('#3481A4') + print("Dark Theme") + color_install = config.Option('#0044aa') # Dark Blue + color_update = config.Option('#008000') # Dark Green + color_downgrade = config.Option('#aa4400') # Dark Brown + color_normal = config.Option('#ffffff') # White + color_obsolete = config.Option('#800080') # Dark Purple else: - color_obsolete = config.Option('#3465A4') + print("light Theme") + color_install = config.Option('#2ad4ff') # Light Blue + color_update = config.Option('#00ff00') # Light Green + color_downgrade = config.Option('#Cff6600') # Light Brown + color_normal = config.Option('#000000') # Black + color_obsolete = config.Option('#ff00ff') # Light Purple history_days = config.IntOption(180) newest_only = config.BoolOption(True) From fa7a597905ac6c040c15bec1e06ed13d679543e7 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sun, 1 Sep 2019 14:01:16 +0200 Subject: [PATCH 087/133] better handling of RPM Progress events --- src/yumex/const.py | 3 ++- src/yumex/dnf_backend.py | 6 +++++- src/yumex/misc.py | 1 - 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/yumex/const.py b/src/yumex/const.py index ce8cdb6..a3d8f88 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -27,7 +27,7 @@ from yumex.misc import _ -VERSION = "4.3.3" +VERSION = "4.4.0" NEEDED_DAEMON_API = 2 # The needed dnfdaemon API version @@ -149,6 +149,7 @@ 'obsolete': _("Obsoleting: %s"), 'downgrade': _("Downgrading: %s"), 'verify': _("Verifying: %s"), + 'scriptlet' : _("Running scriptlet for: %s") } WIDGETS_INSENSITIVE = ["header_menu", "header_filters", diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 895d350..07400b4 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -223,7 +223,11 @@ def on_RPMProgress(self, package, action, te_current, else: # this is just a pkg name (cleanup) name = package logger.debug('on_RPMProgress : [%s]', package) - self.frontend.infobar.info_sub(const.RPM_ACTIONS[action] % name) + action_msg = const.RPM_ACTIONS.get(action,None) + if action_msg: + self.frontend.infobar.info_sub( action_msg % name) + else: + logger.info("RPM Progress: Undefinded action {}".format(action)) if ts_current > 0 and ts_current <= ts_total: frac = float(ts_current) / float(ts_total) self.frontend.infobar.set_progress(frac, label=num) diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 08bd2a1..9ddc63c 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -44,7 +44,6 @@ logger = logging.getLogger('yumex.misc') - class QueueEmptyError(Exception): def __init__(self): From 6203fe819fb8c0679bbecb0bd06c4b752edb5e57 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sun, 1 Sep 2019 15:14:21 +0200 Subject: [PATCH 088/133] better package list colors --- src/yumex/misc.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 9ddc63c..b769f30 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -266,20 +266,11 @@ class YumexConf(config.BaseConfig): debug = config.BoolOption(False) autostart = config.BoolOption(False) - if check_dark_theme(): - print("Dark Theme") - color_install = config.Option('#0044aa') # Dark Blue - color_update = config.Option('#008000') # Dark Green - color_downgrade = config.Option('#aa4400') # Dark Brown - color_normal = config.Option('#ffffff') # White - color_obsolete = config.Option('#800080') # Dark Purple - else: - print("light Theme") - color_install = config.Option('#2ad4ff') # Light Blue - color_update = config.Option('#00ff00') # Light Green - color_downgrade = config.Option('#Cff6600') # Light Brown - color_normal = config.Option('#000000') # Black - color_obsolete = config.Option('#ff00ff') # Light Purple + color_install = config.Option('#3584e4') + color_update = config.Option('#e01b24') + color_downgrade = config.Option('#ff7800') + color_normal = config.Option('#000000') + color_obsolete = config.Option('#ff7800') history_days = config.IntOption(180) newest_only = config.BoolOption(True) From 18c9704d88c48830a61c612b1a269d1e0597cf7a Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 17 May 2021 15:10:53 +0200 Subject: [PATCH 089/133] disable history undo, history undo is broken in dnfdaemon --- src/yumex/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 745b1b7..564fe4f 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -574,6 +574,9 @@ def _setup_history_page(self): right_sw.add(self.history_view.pkg_view) # setup history buttons undo = self.get_ui('history_undo') + # FIXME: History undo is broken in dnfdaemon, because of changes in private API + # so disable the botton + undo.set_sensitive(False) undo.connect('clicked', self.on_history_undo) ############################################################################### From eb033a8a556cdb237fa40100b6b3310f32db56c7 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 17 May 2021 15:12:06 +0200 Subject: [PATCH 090/133] Add support for the rpm transaction tag: updated --- src/yumex/const.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yumex/const.py b/src/yumex/const.py index a3d8f88..cc74261 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -142,6 +142,7 @@ RPM_ACTIONS = { 'update': _("Updating: %s"), + 'updated': _("Updated: %s"), 'install': _("Installing: %s"), 'reinstall': _("Reinstalling: %s"), 'cleanup': _("Cleanup: %s"), From a6a56faa263046ac9de58951afbee36442e328c7 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 17 May 2021 15:24:00 +0200 Subject: [PATCH 091/133] Transfix pull, *.po update --- po/ar.po | 2 +- po/bg.po | 4 +- po/ca.po | 16 +-- po/cs.po | 2 +- po/da.po | 2 +- po/de.po | 97 ++++++++--------- po/es.po | 9 +- po/fa.po | 2 +- po/fr.po | 83 +++++++------- po/hu.po | 309 ++++++++++++++++++++++++++-------------------------- po/ja.po | 157 +++++++++++++------------- po/ko.po | 4 +- po/nl.po | 2 +- po/pl.po | 58 +++++----- po/pt_BR.po | 4 +- po/sk.po | 8 +- po/tr_TR.po | 2 +- po/uk.po | 4 +- po/zh_CN.po | 2 +- 19 files changed, 386 insertions(+), 381 deletions(-) diff --git a/po/ar.po b/po/ar.po index b200a5f..0dfa687 100644 --- a/po/ar.po +++ b/po/ar.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" +"PO-Revision-Date: 2017-09-23 19:38+0000\n" "Last-Translator: Tim Lauridsen \n" "Language-Team: Arabic (http://www.transifex.com/timlau/yumex/language/ar/)\n" "MIME-Version: 1.0\n" diff --git a/po/bg.po b/po/bg.po index 6323ab3..d901128 100644 --- a/po/bg.po +++ b/po/bg.po @@ -3,13 +3,13 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Valentin Laskov , 2014-2015 +# Valentin Laskov , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" "Last-Translator: Tim Lauridsen \n" "Language-Team: Bulgarian (http://www.transifex.com/timlau/yumex/language/bg/)\n" "MIME-Version: 1.0\n" diff --git a/po/ca.po b/po/ca.po index f62bc13..5cfe6eb 100644 --- a/po/ca.po +++ b/po/ca.po @@ -3,14 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Robert Antoni Buj i Gelonch , 2015 +# Robert Antoni Buj Gelonch , 2015-2016 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-05 09:14+0000\n" -"Last-Translator: Robert Antoni Buj i Gelonch \n" +"PO-Revision-Date: 2017-09-22 18:09+0000\n" +"Last-Translator: Robert Antoni Buj Gelonch \n" "Language-Team: Catalan (http://www.transifex.com/timlau/yumex/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -127,7 +127,7 @@ msgstr "Afegiment dels paquets a la vista" #: ../src/yumex/__init__.py:1064 ../src/yumex/old_init.py:728 msgid "Error in undo history transaction" -msgstr "Error en desfer la transacció de l'històric" +msgstr "Error en desfer la transacció de l'historial" #: ../src/yumex/dnf_backend.py:181 #, python-format @@ -375,11 +375,11 @@ msgstr "Reverteix a %s " #: ../src/yumex/gui/views.py:917 msgid "History (Date/Time)" -msgstr "Històric (data/hora)" +msgstr "Historial (data/hora)" #: ../src/yumex/gui/views.py:994 msgid "History Packages" -msgstr "Paquets de l'històric" +msgstr "Paquets de l'historial" #. Setup reponame & repofile column's #: ../src/yumex/gui/views.py:1082 ../src/yumex/gui/views.py:1129 @@ -570,7 +570,7 @@ msgstr "Cerca paquets per nom, resum i descripció" #: ../misc/yumex-dnf.appdata.xml.in.h:8 msgid "Watch the history of package action on your system" -msgstr "Observa l'històric d'accions de paquet al vostre sistema" +msgstr "Observa l'historial d'accions de paquet al vostre sistema" #: ../misc/yumex-dnf.appdata.xml.in.h:9 msgid "Browse and install/remove package groups" @@ -783,7 +783,7 @@ msgstr "Desfés" #: ../src/yumex.ui.h:57 msgid "History" -msgstr "Històric" +msgstr "Historial" #: ../src/yumex.ui.h:58 msgid "Pending Actions" diff --git a/po/cs.po b/po/cs.po index ac81b4e..de5a16e 100644 --- a/po/cs.po +++ b/po/cs.po @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" diff --git a/po/da.po b/po/da.po index ff74c63..7deb4af 100644 --- a/po/da.po +++ b/po/da.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" "Last-Translator: Tim Lauridsen \n" "Language-Team: Danish (http://www.transifex.com/timlau/yumex/language/da/)\n" "MIME-Version: 1.0\n" diff --git a/po/de.po b/po/de.po index ab96388..f794ec5 100644 --- a/po/de.po +++ b/po/de.po @@ -3,16 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Marco Woitschitzky, 2016 -# Christian Stadelmann, 2015 -# Mario Blättermann , 2014 +# 45403005f243ceb65fbd5f43eb20670e, 2015 +# Mario Blättermann , 2014-2016 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2016-08-15 16:49+0000\n" -"Last-Translator: Marco Woitschitzky\n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" +"Last-Translator: Mario Blättermann \n" "Language-Team: German (http://www.transifex.com/timlau/yumex/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,13 +25,13 @@ msgstr "Paketquellen-Metadaten werden aktualisiert" #: ../src/yumex/__init__.py:119 ../src/yumex/old_init.py:144 msgid "Could not refresh the DNF cache (root)" -msgstr "DNF-Zwischenspeicher konnte nicht aktualisiert werden (root)" +msgstr "Dnf-Zwischenspeicher konnte nicht aktualisiert werden (Root)" #: ../src/yumex/__init__.py:124 ../src/yumex/old_init.py:149 msgid "" "DNF root backend was not authorized.\n" "Yum Extender will exit" -msgstr "Das Root-Backend von DNF wurde nicht autorisiert.\nYum Extender wird beendet." +msgstr "Das Root-Backend von Dnf wurde nicht autorisiert.\nYum Extender wird beendet." #: ../src/yumex/__init__.py:129 ../src/yumex/old_init.py:154 msgid "" @@ -43,7 +42,7 @@ msgstr "DNF wird von einem anderen Prozess gesperrt.\n\nYum Extender wird beende #: ../src/yumex/__init__.py:623 msgid "Reloading package information..." -msgstr "Neu laden der Paketinformationen..." +msgstr "Paketinformationen werden neu geladen …" #: ../src/yumex/__init__.py:746 ../src/yumex/__init__.py:829 #: ../src/yumex/old_init.py:266 ../src/yumex/old_init.py:1047 @@ -87,7 +86,7 @@ msgstr "%s wurde erfolgreich installiert" #: ../src/yumex/__init__.py:820 ../src/yumex/old_init.py:259 #, python-format msgid "Removing package: %s" -msgstr "Entferne Paket: %s" +msgstr "Entferne Paket %s" #: ../src/yumex/__init__.py:821 #, python-format @@ -96,11 +95,11 @@ msgstr "%s wurde erfolgreich entfernt" #: ../src/yumex/__init__.py:826 ../src/yumex/old_init.py:264 msgid "Updating all available updates" -msgstr "Installiere alle verfügbaren Aktualisierungen" +msgstr "Alle verfügbaren Aktualisierungen werden verarbeitet" #: ../src/yumex/__init__.py:827 msgid "Available updates was applied successfully" -msgstr "Verfügbare Aktualisierungen wurden erfolgreich installiert" +msgstr "Verfügbare Aktualisierungen wurden erfolgreich angewendet" #: ../src/yumex/__init__.py:846 ../src/yumex/__init__.py:896 #: ../src/yumex/old_init.py:286 ../src/yumex/old_init.py:1149 @@ -129,7 +128,7 @@ msgstr "Pakete werden zur Ansicht hinzugefügt" #: ../src/yumex/__init__.py:1064 ../src/yumex/old_init.py:728 msgid "Error in undo history transaction" -msgstr "Fehler beim Rückgängig machen der Transaktion" +msgstr "Fehler beim Zurücknehmen der Chronik-Transaktion" #: ../src/yumex/dnf_backend.py:181 #, python-format @@ -137,7 +136,7 @@ msgid "" "dnfdaemon api version : %d\n" "don't match\n" "needed api version : %d" -msgstr "dnfdaemon API-Version: %d\npasst nicht\nbenötigte API-Version: %d" +msgstr "dnfdaemon API-Version : %d\nentspricht nicht der\nbenötigten API-Version : %d" #: ../src/yumex/dnf_backend.py:191 msgid "Downloading packages" @@ -154,7 +153,7 @@ msgstr "Überprüfung der Änderungen am System" #: ../src/yumex/dnf_backend.py:246 #, python-format msgid "Downloading %d files (%sB)..." -msgstr "Lade %d Dateien herunter (%sB)..." +msgstr "%d Dateien werden heruntergeladen (%sB) …" #: ../src/yumex/const.py:129 msgid "Getting installed packages" @@ -237,7 +236,7 @@ msgstr "Installiere %s" #: ../src/yumex/const.py:167 #, python-format msgid "Reinstalling: %s" -msgstr "Reinstalliere %s" +msgstr "Wird erneut installiert: %s" #: ../src/yumex/const.py:168 #, python-format @@ -252,7 +251,7 @@ msgstr "Entferne %s" #: ../src/yumex/const.py:170 #, python-format msgid "Obsoleting: %s" -msgstr "" +msgstr "Als veraltet markieren: %s" #: ../src/yumex/const.py:171 #, python-format @@ -289,24 +288,24 @@ msgid "" "\n" "\n" "Yum Extender will close" -msgstr "\n\nYum Extender wird beendet" +msgstr "\n\nYum Extender wird geschlossen" #: ../src/yumex/old_init.py:1307 msgid "Error in starting notification icon" -msgstr "Fehler beim Starten des Benachrichtigungssymbols" +msgstr "Fehler beim Starten des Symbols in der Statusleiste" #: ../src/yumex/old_init.py:1331 msgid "Yum Extender will close" -msgstr "Yum Extender wird beendet" +msgstr "Yum Extender wird geschlossen" #: ../src/yumex/old_init.py:1333 msgid "Error in locking notification icon" -msgstr "Fehler beim sperren des Benachrichtigungssymbols" +msgstr "Fehler beim Sperren des Benachrichtigungssymbols" #. timeout 10s #: ../src/yumex/updater.py:68 msgid "Not Now" -msgstr "Später" +msgstr "Nicht jetzt" #: ../src/yumex/updater.py:70 msgid "Show Updates" @@ -414,7 +413,7 @@ msgstr "Version" #: ../src/yumex/gui/dialogs.py:251 msgid "replacing {}" -msgstr "ersetze {}" +msgstr "" #: ../src/yumex/gui/dialogs.py:287 #, python-format @@ -448,7 +447,7 @@ msgstr "Keine Information über Aktualisierungen des Paketes verfügbar" msgid "" "\n" "Fedora Updates:" -msgstr "Fedora Aktualisierungen:" +msgstr "\nFedora-Aktualisierungen:" #: ../src/yumex/gui/widgets.py:661 msgid "Release" @@ -469,13 +468,13 @@ msgstr "Beschreibung" #: ../src/yumex/gui/widgets.py:724 msgid "No changelog information is available" -msgstr "Keine Informationen über die Änderungshistorie dieses Pakets verfügbar." +msgstr "Keine Informationen über die Aktualisierungen dieses Pakets verfügbar." #: ../src/yumex/gui/widgets.py:726 msgid "" "\n" "Online Changelog:" -msgstr "Online Änderungshistorie:" +msgstr "\nOnline-Changelog:" #: ../src/yumex/gui/widgets.py:741 msgid "No filelist information is available" @@ -483,15 +482,15 @@ msgstr "Keine Liste der bereitgestellten Pakete vorhanden" #: ../src/yumex/gui/widgets.py:771 msgid "Newest only" -msgstr "Nur die Neusten" +msgstr "Nur neueste" #: ../src/yumex/gui/widgets.py:772 msgid "Erase unused requirements" -msgstr "Lösche unbenutzte Abhängigkeiten" +msgstr "Nicht mehr benötigte Abhängigkeiten entfernen" #: ../src/yumex/gui/widgets.py:774 msgid "Cleanup old instonly packages " -msgstr "Entferne alte »Installonly«-Pakete" +msgstr "" #: ../src/yumex/gui/widgets.py:776 msgid "Options" @@ -499,7 +498,7 @@ msgstr "Optionen" #: ../src/yumex/gui/widgets.py:778 msgid "About" -msgstr "Über" +msgstr "Info" #: ../src/yumex/gui/widgets.py:779 msgid "Documentation" @@ -650,7 +649,7 @@ msgstr "Alle verfügbaren Aktualisierungen beim Start auswählen" msgid "" "The interval in hour, when the DNF cache will be expired and updated (0 = " "disabled)" -msgstr "Intervall in Stunden, nachdem der DNF-Zwischenspeicher als veraltet markiert und aktualisiert wird (0 = deaktiviert)" +msgstr "Das Intervall in Stunden bis zum Ablauf und zur Aktualisierung des DNF-Zwischenspeichers (0 = deaktiviert)" #: ../src/yumex.ui.h:22 msgid "Cache expire interval (hours)" @@ -658,7 +657,7 @@ msgstr "Intervall, nachdem der Zwischenspeicher verfällt (in Stunden)" #: ../src/yumex.ui.h:23 msgid "12" -msgstr "" +msgstr "12" #: ../src/yumex.ui.h:24 msgid "Default: Cleanup Old Installonly packages" @@ -670,7 +669,7 @@ msgstr "Anzahl der »Installonly«-Pakete, die behalten werden" #: ../src/yumex.ui.h:26 msgid "3" -msgstr "" +msgstr "3" #: ../src/yumex.ui.h:27 msgid "Settings" @@ -678,23 +677,23 @@ msgstr "Einstellungen" #: ../src/yumex.ui.h:28 msgid "Autostart the Yum Extender update checker at user login" -msgstr "Lade Yum Extender bei der Benutzeranmeldung für die Hintergrundsuche nach Aktualisierungen" +msgstr "Aktualisierungsüberprüfung beim Anmelden des Benutzers automatisch starten" #: ../src/yumex.ui.h:29 msgid "Start update checker at user login" -msgstr "Lade Hintergrundsuche nach Aktualisierungen bei der Benutzeranmeldung" +msgstr "Aktualisierungsüberprüfung bei Anmeldung starten" #: ../src/yumex.ui.h:30 msgid "How often the update checker will run" -msgstr "Häufigkeit mit der nach Aktualisierungen gesucht wird" +msgstr "Das Intervall, in nach Updates gesucht wird" #: ../src/yumex.ui.h:31 msgid "Update check interval (minutes)" -msgstr "Intervall zur Suche nach Aktualisierungen (Minuten)" +msgstr "Intervall zur Prüfung auf Aktualisierungen (Minuten)" #: ../src/yumex.ui.h:32 msgid "Update Checker" -msgstr "Aktualisierungssuche" +msgstr "Aktualisierungsüberprüfung" #: ../src/yumex.ui.h:33 msgid "Color for installed packages" @@ -745,7 +744,7 @@ msgstr "Label" #: ../src/yumex.ui.h:46 msgid "Show available updates" -msgstr "Zeige verfügbare Aktualisierungen" +msgstr "Verfügbare Aktualisierungen anzeigen" #: ../src/yumex.ui.h:47 msgid "Updates" @@ -753,7 +752,7 @@ msgstr "Aktualisierungen" #: ../src/yumex.ui.h:48 msgid "Show installed packages" -msgstr "Zeige installierte Pakete" +msgstr "Installierte Pakete anzeigen" #: ../src/yumex.ui.h:49 msgid "Installed" @@ -761,7 +760,7 @@ msgstr "Installiert" #: ../src/yumex.ui.h:50 msgid "Show available packages" -msgstr "Zeige verfügbare Pakete" +msgstr "Verfügbare Pakete anzeigen" #: ../src/yumex.ui.h:51 msgid "Available" @@ -769,7 +768,7 @@ msgstr "Verfügbar" #: ../src/yumex.ui.h:52 msgid "Show all packages" -msgstr "Zeige alle Pakete" +msgstr "Alle Pakete anzeigen" #: ../src/yumex.ui.h:53 msgid "All" @@ -805,15 +804,15 @@ msgstr "Dateiliste des Pakets" #: ../src/yumex.ui.h:62 msgid "Package Requirements" -msgstr "Abhängigkeiten des Pakets" +msgstr "benötigte Abhängigkeiten von diesem Paket" #: ../src/yumex.ui.h:63 msgid "Search (show/hide)" -msgstr "Suche (zeigen/verbergen)" +msgstr "Suchen (anzeigen/verbergen)" #: ../src/yumex.ui.h:64 msgid "Apply pending actions" -msgstr "Auststehende Aktionen anwenden" +msgstr "Ausstehende Aktionen anwenden" #: ../src/yumex.ui.h:65 msgid "Prefix" @@ -821,7 +820,7 @@ msgstr "Präfix des Paketnamens" #: ../src/yumex.ui.h:66 msgid "Package names starting with search key" -msgstr "Paketnamen die mit Suchbegriff beginnen" +msgstr "Paketnamen, die mit dem Suchbegriff beginnen" #: ../src/yumex.ui.h:67 msgid "Keyword" @@ -829,7 +828,7 @@ msgstr "Schlüsselwort" #: ../src/yumex.ui.h:68 msgid "Package names containing search key" -msgstr "Paketnamen die den Suchbegriff enthalten" +msgstr "Paketnamen, die den Suchbegriff enthalten" #: ../src/yumex.ui.h:69 msgid "Fields" @@ -837,7 +836,7 @@ msgstr "Felder" #: ../src/yumex.ui.h:70 msgid "Specified package fields containing search keys." -msgstr "Ausgewählte Paketfelder die Suchwörter enthalten" +msgstr "" #: ../src/yumex.ui.h:72 msgid "Package name" @@ -845,11 +844,11 @@ msgstr "Paketname" #: ../src/yumex.ui.h:74 msgid "Package summary" -msgstr "Paketzusammenfassung" +msgstr "Zusammenfassung" #: ../src/yumex.ui.h:76 msgid "Package description" -msgstr "Paketbeschreibung" +msgstr "Beschreibung" #: ../src/yumex.ui.h:77 msgid "Package actions to perform" diff --git a/po/es.po b/po/es.po index 119c827..fefc8a8 100644 --- a/po/es.po +++ b/po/es.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jose G. Jimenez S. , 2015 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" -"Last-Translator: Tim Lauridsen \n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" +"Last-Translator: Jose G. Jimenez S. \n" "Language-Team: Spanish (http://www.transifex.com/timlau/yumex/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,11 +20,11 @@ msgstr "" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" -msgstr "" +msgstr "Refrescando repositorio de metadatos" #: ../src/yumex/__init__.py:119 ../src/yumex/old_init.py:144 msgid "Could not refresh the DNF cache (root)" -msgstr "" +msgstr "No se pudo actualizar la caché DNF (root)" #: ../src/yumex/__init__.py:124 ../src/yumex/old_init.py:149 msgid "" diff --git a/po/fa.po b/po/fa.po index 2b1b0fd..dde06aa 100644 --- a/po/fa.po +++ b/po/fa.po @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" diff --git a/po/fr.po b/po/fr.po index 030bbbb..1f09d1c 100644 --- a/po/fr.po +++ b/po/fr.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# dominique bribanick , 2014-2015 +# dominique bribanick , 2014-2016 +# Marcel Bariou , 2016 # Tim Lauridsen , 2014 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" -"Last-Translator: Tim Lauridsen \n" +"PO-Revision-Date: 2017-09-23 19:38+0000\n" +"Last-Translator: dominique bribanick \n" "Language-Team: French (http://www.transifex.com/timlau/yumex/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,7 +43,7 @@ msgstr "DNF est verrouillé par un autre processus\n\nYum Extender va s'arrêter #: ../src/yumex/__init__.py:623 msgid "Reloading package information..." -msgstr "" +msgstr "Rechargement des informations de paquet" #: ../src/yumex/__init__.py:746 ../src/yumex/__init__.py:829 #: ../src/yumex/old_init.py:266 ../src/yumex/old_init.py:1047 @@ -81,7 +82,7 @@ msgstr "Installation du paquet : %s" #: ../src/yumex/__init__.py:815 #, python-format msgid "%s was installed successfully" -msgstr "" +msgstr "%s a été installé correctement" #: ../src/yumex/__init__.py:820 ../src/yumex/old_init.py:259 #, python-format @@ -91,7 +92,7 @@ msgstr "Suppression du paquet : %s" #: ../src/yumex/__init__.py:821 #, python-format msgid "%s was removed successfully" -msgstr "" +msgstr "%s a été retiré correctement" #: ../src/yumex/__init__.py:826 ../src/yumex/old_init.py:264 msgid "Updating all available updates" @@ -99,7 +100,7 @@ msgstr "Effectuer toutes les mises à jour disponibles" #: ../src/yumex/__init__.py:827 msgid "Available updates was applied successfully" -msgstr "" +msgstr "Les mises à jour disponibles ont été appliquées correctement" #: ../src/yumex/__init__.py:846 ../src/yumex/__init__.py:896 #: ../src/yumex/old_init.py:286 ../src/yumex/old_init.py:1149 @@ -136,7 +137,7 @@ msgid "" "dnfdaemon api version : %d\n" "don't match\n" "needed api version : %d" -msgstr "" +msgstr "l'API dnfdaemon version : %d\nne correspond pas\nà la version attendue de l'API : %d" #: ../src/yumex/dnf_backend.py:191 msgid "Downloading packages" @@ -153,7 +154,7 @@ msgstr "Vérification des modifications apportées au système" #: ../src/yumex/dnf_backend.py:246 #, python-format msgid "Downloading %d files (%sB)..." -msgstr "" +msgstr "Téléchargement de %d fichiers (%sB)..." #: ../src/yumex/const.py:129 msgid "Getting installed packages" @@ -236,7 +237,7 @@ msgstr "Installation : %s" #: ../src/yumex/const.py:167 #, python-format msgid "Reinstalling: %s" -msgstr "" +msgstr "Ré-installation: %s" #: ../src/yumex/const.py:168 #, python-format @@ -288,7 +289,7 @@ msgid "" "\n" "\n" "Yum Extender will close" -msgstr "" +msgstr "\n\nL'extension YUM, YUMEX, fermera" #: ../src/yumex/old_init.py:1307 msgid "Error in starting notification icon" @@ -305,11 +306,11 @@ msgstr "Erreur lors du démarrage de l'icône de notification" #. timeout 10s #: ../src/yumex/updater.py:68 msgid "Not Now" -msgstr "" +msgstr "Pas maintenant" #: ../src/yumex/updater.py:70 msgid "Show Updates" -msgstr "" +msgstr "Afficher les mises à jour" #: ../src/yumex/updater.py:165 msgid "New Updates" @@ -482,31 +483,31 @@ msgstr "Pas d'information disponible sur la liste de fichiers" #: ../src/yumex/gui/widgets.py:771 msgid "Newest only" -msgstr "" +msgstr "Seulement les plus récents" #: ../src/yumex/gui/widgets.py:772 msgid "Erase unused requirements" -msgstr "" +msgstr "Supprimer les exigences non nécessaires" #: ../src/yumex/gui/widgets.py:774 msgid "Cleanup old instonly packages " -msgstr "" +msgstr "Nettoyer les seules installations des anciens paquetages" #: ../src/yumex/gui/widgets.py:776 msgid "Options" -msgstr "" +msgstr "Options" #: ../src/yumex/gui/widgets.py:778 msgid "About" -msgstr "" +msgstr "À propos" #: ../src/yumex/gui/widgets.py:779 msgid "Documentation" -msgstr "" +msgstr "Documentation " #: ../src/yumex/gui/widgets.py:780 msgid "Help" -msgstr "" +msgstr "Aide" #: ../src/yumex/gui/widgets.py:782 ../src/yumex.ui.h:1 msgid "Preferences" @@ -514,7 +515,7 @@ msgstr "Préférences" #: ../src/yumex/gui/widgets.py:783 msgid "Quit" -msgstr "" +msgstr "Quitter" #: ../misc/yumex-dnf-local.desktop.in.h:1 msgid "Yumex Package Installer" @@ -649,7 +650,7 @@ msgstr "Sélectionner les mises à jour au démarrage" msgid "" "The interval in hour, when the DNF cache will be expired and updated (0 = " "disabled)" -msgstr "" +msgstr "Laps de temps, en heures, au bout duquel le cache de dnf est périmé et remis à jour (0= non validé)" #: ../src/yumex.ui.h:22 msgid "Cache expire interval (hours)" @@ -657,19 +658,19 @@ msgstr "Délai de péremption du cache (en heures)" #: ../src/yumex.ui.h:23 msgid "12" -msgstr "" +msgstr "12" #: ../src/yumex.ui.h:24 msgid "Default: Cleanup Old Installonly packages" -msgstr "" +msgstr "Par défaut : nettoyer les seules installations des anciens paquetages" #: ../src/yumex.ui.h:25 msgid "Number of installonly packages to keep" -msgstr "" +msgstr "Nombre de paquets installés seuls à garder" #: ../src/yumex.ui.h:26 msgid "3" -msgstr "" +msgstr "3" #: ../src/yumex.ui.h:27 msgid "Settings" @@ -677,11 +678,11 @@ msgstr "Configurations" #: ../src/yumex.ui.h:28 msgid "Autostart the Yum Extender update checker at user login" -msgstr "" +msgstr "Démarrage automatique de la vérification des mises à jour à l'ouverture de session" #: ../src/yumex.ui.h:29 msgid "Start update checker at user login" -msgstr "" +msgstr "Démarrez la vérification des mises à jour à l'ouverture de session" #: ../src/yumex.ui.h:30 msgid "How often the update checker will run" @@ -693,7 +694,7 @@ msgstr "Intervalle de vérification des mise à jour (minutes)" #: ../src/yumex.ui.h:32 msgid "Update Checker" -msgstr "" +msgstr "Vérification des mises à jour" #: ../src/yumex.ui.h:33 msgid "Color for installed packages" @@ -744,7 +745,7 @@ msgstr "étiquette" #: ../src/yumex.ui.h:46 msgid "Show available updates" -msgstr "" +msgstr "Afficher les mises à jour disponibles" #: ../src/yumex.ui.h:47 msgid "Updates" @@ -752,7 +753,7 @@ msgstr "Mises à jour" #: ../src/yumex.ui.h:48 msgid "Show installed packages" -msgstr "" +msgstr "Afficher les paquets installés" #: ../src/yumex.ui.h:49 msgid "Installed" @@ -760,7 +761,7 @@ msgstr "Installés" #: ../src/yumex.ui.h:50 msgid "Show available packages" -msgstr "" +msgstr "Afficher les paquets disponibles" #: ../src/yumex.ui.h:51 msgid "Available" @@ -768,7 +769,7 @@ msgstr "Disponibles" #: ../src/yumex.ui.h:52 msgid "Show all packages" -msgstr "" +msgstr "Afficher tous les paquets" #: ../src/yumex.ui.h:53 msgid "All" @@ -808,11 +809,11 @@ msgstr "Dépendances du paquet" #: ../src/yumex.ui.h:63 msgid "Search (show/hide)" -msgstr "" +msgstr "Rechercher (afficher / masquer)" #: ../src/yumex.ui.h:64 msgid "Apply pending actions" -msgstr "" +msgstr "Appliquer les actions en attente" #: ../src/yumex.ui.h:65 msgid "Prefix" @@ -820,7 +821,7 @@ msgstr "Préfixe" #: ../src/yumex.ui.h:66 msgid "Package names starting with search key" -msgstr "" +msgstr "Nom du paquet commençant par la clé recherchée" #: ../src/yumex.ui.h:67 msgid "Keyword" @@ -828,7 +829,7 @@ msgstr "Mot-clé" #: ../src/yumex.ui.h:68 msgid "Package names containing search key" -msgstr "" +msgstr "Nom du paquet contenant la clé recherchée" #: ../src/yumex.ui.h:69 msgid "Fields" @@ -836,19 +837,19 @@ msgstr "Champs" #: ../src/yumex.ui.h:70 msgid "Specified package fields containing search keys." -msgstr "" +msgstr "Champ du paquet contenant la clé recherchée" #: ../src/yumex.ui.h:72 msgid "Package name" -msgstr "" +msgstr "Nom du paquet" #: ../src/yumex.ui.h:74 msgid "Package summary" -msgstr "" +msgstr "Résumé du paquet" #: ../src/yumex.ui.h:76 msgid "Package description" -msgstr "" +msgstr "Description du paquet" #: ../src/yumex.ui.h:77 msgid "Package actions to perform" diff --git a/po/hu.po b/po/hu.po index 89515d0..291d244 100644 --- a/po/hu.po +++ b/po/hu.po @@ -3,13 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# dabzse , 2015 +# c5c74d5c0e928622070863d16011fda8_265b1fe, 2015 +# Tim Lauridsen , 2011 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" -"Last-Translator: Tim Lauridsen \n" +"PO-Revision-Date: 2017-09-23 19:38+0000\n" +"Last-Translator: c5c74d5c0e928622070863d16011fda8_265b1fe\n" "Language-Team: Hungarian (http://www.transifex.com/timlau/yumex/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,110 +22,110 @@ msgstr "" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" -msgstr "" +msgstr "Tároló metaadatok frissítése" #: ../src/yumex/__init__.py:119 ../src/yumex/old_init.py:144 msgid "Could not refresh the DNF cache (root)" -msgstr "" +msgstr "Nem sikerült frissíteni a DNF gyorsítótárat (root)" #: ../src/yumex/__init__.py:124 ../src/yumex/old_init.py:149 msgid "" "DNF root backend was not authorized.\n" "Yum Extender will exit" -msgstr "" +msgstr "A DNF gyökér háttértár nincs hitelesítve.\nA Yum Extender kilép" #: ../src/yumex/__init__.py:129 ../src/yumex/old_init.py:154 msgid "" "DNF is locked by another process.\n" "\n" "Yum Extender will exit" -msgstr "" +msgstr "A DNF zárolva. Egy másik folyamat használja.\n\nA Yum Extender kilép" #: ../src/yumex/__init__.py:623 msgid "Reloading package information..." -msgstr "" +msgstr "Csomag információk újratöltése..." #: ../src/yumex/__init__.py:746 ../src/yumex/__init__.py:829 #: ../src/yumex/old_init.py:266 ../src/yumex/old_init.py:1047 msgid "Searching for dependencies" -msgstr "" +msgstr "Függőségek keresése" #: ../src/yumex/__init__.py:748 ../src/yumex/__init__.py:831 #: ../src/yumex/old_init.py:268 ../src/yumex/old_init.py:1049 msgid "Dependencies resolved" -msgstr "" +msgstr "A függőségfeloldás meghiúsult" #. Ok pressed #: ../src/yumex/__init__.py:762 ../src/yumex/__init__.py:839 #: ../src/yumex/dnf_backend.py:206 ../src/yumex/old_init.py:276 #: ../src/yumex/old_init.py:1063 msgid "Applying changes to the system" -msgstr "" +msgstr "Változások alkalmazása a rendszeren" #: ../src/yumex/__init__.py:787 ../src/yumex/old_init.py:1088 msgid "Error checking package signatures\n" -msgstr "" +msgstr "Hiba a csomag aláírásának ellenőrzése közben\n" #: ../src/yumex/__init__.py:793 ../src/yumex/old_init.py:1094 msgid "Downloading error(s)\n" -msgstr "" +msgstr "Letöltési hiba(ák)\n" #: ../src/yumex/__init__.py:799 ../src/yumex/old_init.py:1100 msgid "Error in transaction\n" -msgstr "" +msgstr "Hiba a tranzakcióban\n" #: ../src/yumex/__init__.py:814 ../src/yumex/old_init.py:254 #, python-format msgid "Installing package: %s" -msgstr "" +msgstr "Csomag telepítés: %s" #: ../src/yumex/__init__.py:815 #, python-format msgid "%s was installed successfully" -msgstr "" +msgstr "%s telepítésre került" #: ../src/yumex/__init__.py:820 ../src/yumex/old_init.py:259 #, python-format msgid "Removing package: %s" -msgstr "" +msgstr "Csomag törlés: %s" #: ../src/yumex/__init__.py:821 #, python-format msgid "%s was removed successfully" -msgstr "" +msgstr "%s csomag törlésre került" #: ../src/yumex/__init__.py:826 ../src/yumex/old_init.py:264 msgid "Updating all available updates" -msgstr "" +msgstr "Összes elérhető csomag frissítése" #: ../src/yumex/__init__.py:827 msgid "Available updates was applied successfully" -msgstr "" +msgstr "Az elérhető frissítések sikeresen alkalmazásra kerültek" #: ../src/yumex/__init__.py:846 ../src/yumex/__init__.py:896 #: ../src/yumex/old_init.py:286 ../src/yumex/old_init.py:1149 msgid "Error(s) in search for dependencies" -msgstr "" +msgstr "Hiba a függőség(ek) keresése közben" #: ../src/yumex/__init__.py:862 ../src/yumex/old_init.py:1115 msgid "Preparing system for applying changes" -msgstr "" +msgstr "Felkészülés a rendszer változások alkalmazására" #: ../src/yumex/__init__.py:873 ../src/yumex/old_init.py:1126 msgid "Can't remove protected package(s)" -msgstr "" +msgstr "Nem lehet eltávolítani a védett csomag(okat)" #: ../src/yumex/__init__.py:887 ../src/yumex/old_init.py:1140 msgid "No pending actions in queue" -msgstr "" +msgstr "Nincsenek függőben lévő műveletek" #: ../src/yumex/__init__.py:891 ../src/yumex/old_init.py:1144 msgid "Error(s) in building transaction" -msgstr "" +msgstr "Hiba(ák) a tranzakció építése közben" #: ../src/yumex/__init__.py:1013 ../src/yumex/old_init.py:789 msgid "Adding packages to view" -msgstr "" +msgstr "Hozzáadandó csomagok megtekintése" #: ../src/yumex/__init__.py:1064 ../src/yumex/old_init.py:728 msgid "Error in undo history transaction" @@ -138,257 +141,257 @@ msgstr "" #: ../src/yumex/dnf_backend.py:191 msgid "Downloading packages" -msgstr "" +msgstr "Csomagok letöltése" #: ../src/yumex/dnf_backend.py:197 msgid "Checking package signatures" -msgstr "" +msgstr "Csomag aláírások ellenörzése" #: ../src/yumex/dnf_backend.py:210 msgid "Verify changes on the system" -msgstr "" +msgstr "Változások alkalmazása a rendszeren" #: ../src/yumex/dnf_backend.py:246 #, python-format msgid "Downloading %d files (%sB)..." -msgstr "" +msgstr "%d fájl letöltése (%sB)..." #: ../src/yumex/const.py:129 msgid "Getting installed packages" -msgstr "" +msgstr "Telepített csomagok lekérése" #: ../src/yumex/const.py:130 msgid "Getting available packages" -msgstr "" +msgstr "Elérhető csomagok lekérése" #: ../src/yumex/const.py:131 msgid "Getting available updates" -msgstr "" +msgstr "Frissítési csomagok lekérése" #: ../src/yumex/const.py:132 msgid "Getting all packages" -msgstr "" +msgstr "Minden csomag lekérése" #: ../src/yumex/const.py:145 msgid "Updated packages" -msgstr "" +msgstr "Frissített csomagok" #: ../src/yumex/const.py:146 msgid "Downgraded packages" -msgstr "" +msgstr "Leminősített csomagok" #: ../src/yumex/const.py:147 msgid "Obsoleting packages" -msgstr "" +msgstr "Csomagok butítása" #: ../src/yumex/const.py:148 msgid "Obsoleted packages" -msgstr "" +msgstr "Elavult csomagok" #: ../src/yumex/const.py:149 msgid "Erased packages" -msgstr "" +msgstr "Törölt csomagok" #: ../src/yumex/const.py:150 ../src/yumex/const.py:151 msgid "Installed packages" -msgstr "" +msgstr "Telepített csomagok" #: ../src/yumex/const.py:152 msgid "Installed for dependencies" -msgstr "" +msgstr "Telepített függőségek" #: ../src/yumex/const.py:153 msgid "Reinstalled packages" -msgstr "" +msgstr "Újratelepített csomagok" #: ../src/yumex/const.py:157 msgid "Installing" -msgstr "" +msgstr "Telepítés" #: ../src/yumex/const.py:158 msgid "Updating" -msgstr "" +msgstr "Frissítés" #: ../src/yumex/const.py:159 msgid "Removing" -msgstr "" +msgstr "Törlés" #: ../src/yumex/const.py:160 msgid "Downgrading" -msgstr "" +msgstr "Visszíminősítés" #: ../src/yumex/const.py:161 msgid "Replacing" -msgstr "" +msgstr "Javítás" #: ../src/yumex/const.py:165 #, python-format msgid "Updating: %s" -msgstr "" +msgstr "Frissítés: %s" #: ../src/yumex/const.py:166 #, python-format msgid "Installing: %s" -msgstr "" +msgstr "Telepítés: %s" #: ../src/yumex/const.py:167 #, python-format msgid "Reinstalling: %s" -msgstr "" +msgstr "Újratelepítés: %s" #: ../src/yumex/const.py:168 #, python-format msgid "Cleanup: %s" -msgstr "" +msgstr "Tisztítás: %s" #: ../src/yumex/const.py:169 #, python-format msgid "Removing: %s" -msgstr "" +msgstr "Törlés: %s" #: ../src/yumex/const.py:170 #, python-format msgid "Obsoleting: %s" -msgstr "" +msgstr "Butítás: %s" #: ../src/yumex/const.py:171 #, python-format msgid "Downgrading: %s" -msgstr "" +msgstr "Visszíminősítés: %s" #: ../src/yumex/const.py:172 #, python-format msgid "Verifying: %s" -msgstr "" +msgstr "Ellenőrzés: %s" #: ../src/yumex/const.py:182 msgid "Bugfix" -msgstr "" +msgstr "Hibajavítás" #: ../src/yumex/const.py:183 msgid "New Package" -msgstr "" +msgstr "Új csomag" #: ../src/yumex/const.py:184 msgid "Security" -msgstr "" +msgstr "Biztonság" #: ../src/yumex/const.py:185 msgid "Enhancement" -msgstr "" +msgstr "Kiemelés" #: ../src/yumex/old_init.py:283 msgid "Changes was successfully applied to the system" -msgstr "" +msgstr "A változások sikeresen alkalmazásra kerültek a rendszeren" #: ../src/yumex/old_init.py:1305 msgid "" "\n" "\n" "Yum Extender will close" -msgstr "" +msgstr "\n\nYum Extender kilép" #: ../src/yumex/old_init.py:1307 msgid "Error in starting notification icon" -msgstr "" +msgstr "Hiba a kezdő értesítési ikonban" #: ../src/yumex/old_init.py:1331 msgid "Yum Extender will close" -msgstr "" +msgstr "Yum Extender kilép" #: ../src/yumex/old_init.py:1333 msgid "Error in locking notification icon" -msgstr "" +msgstr "Hiba a záró értesítési ikonban" #. timeout 10s #: ../src/yumex/updater.py:68 msgid "Not Now" -msgstr "" +msgstr "Most nem" #: ../src/yumex/updater.py:70 msgid "Show Updates" -msgstr "" +msgstr "Frissítések mutatása" #: ../src/yumex/updater.py:165 msgid "New Updates" -msgstr "" +msgstr "Új frissítések" #: ../src/yumex/updater.py:166 #, python-format msgid "%s available updates" -msgstr "" +msgstr "%s elérhető frissítés" #: ../src/yumex/gui/views.py:256 msgid "Click to install all/remove all" -msgstr "" +msgstr "Kattintsunk ide az összes telepítéséhez/eltávolításához" #: ../src/yumex/gui/views.py:261 msgid "Click to select/deselect all" -msgstr "" +msgstr "Kattintsunk ide az összes kiválasztásához/kiválasztás eltávolításához" #: ../src/yumex/gui/views.py:273 msgid "Package" -msgstr "" +msgstr "Csomag" #: ../src/yumex/gui/views.py:275 msgid "Ver." -msgstr "" +msgstr "Ver." #: ../src/yumex/gui/views.py:277 msgid "Arch." -msgstr "" +msgstr "Arch." #: ../src/yumex/gui/views.py:279 msgid "click to filter archs" -msgstr "" +msgstr "kattintsunk ide és szűrjünk architektúra szerint" #: ../src/yumex/gui/views.py:280 ../src/yumex/gui/views.py:769 #: ../src/yumex.ui.h:73 msgid "Summary" -msgstr "" +msgstr "Összegzés" #: ../src/yumex/gui/views.py:281 msgid "Repo." -msgstr "" +msgstr "Tároló." #: ../src/yumex/gui/views.py:282 ../src/yumex/gui/dialogs.py:210 msgid "Size" -msgstr "" +msgstr "Méret" #: ../src/yumex/gui/views.py:321 msgid "Reinstall Package" -msgstr "" +msgstr "Csomag újratelepítése" #: ../src/yumex/gui/views.py:336 msgid "Downgrade Package" -msgstr "" +msgstr "Csomag lebutítása" #: ../src/yumex/gui/views.py:764 ../src/yumex.ui.h:54 msgid "Packages" -msgstr "" +msgstr "Csomagok" #: ../src/yumex/gui/views.py:894 #, python-format msgid "Downgrade to %s " -msgstr "" +msgstr "Leminősítés erre %s" #: ../src/yumex/gui/views.py:917 msgid "History (Date/Time)" -msgstr "" +msgstr "Előzmények (Dátum/Idő)" #: ../src/yumex/gui/views.py:994 msgid "History Packages" -msgstr "" +msgstr "Csomag előzmények" #. Setup reponame & repofile column's #: ../src/yumex/gui/views.py:1082 ../src/yumex/gui/views.py:1129 #: ../src/yumex/gui/dialogs.py:209 msgid "Repository" -msgstr "" +msgstr "Tároló" #: ../src/yumex/gui/views.py:1082 msgid "Filename" -msgstr "" +msgstr "Fájlnév" #: ../src/yumex/gui/views.py:1113 msgid "" @@ -399,19 +402,19 @@ msgstr "" #: ../src/yumex/gui/views.py:1130 ../src/yumex/gui/dialogs.py:206 #: ../src/yumex.ui.h:71 msgid "Name" -msgstr "" +msgstr "Név" #: ../src/yumex/gui/dialogs.py:207 msgid "Arch" -msgstr "" +msgstr "Arch" #: ../src/yumex/gui/dialogs.py:208 msgid "Ver" -msgstr "" +msgstr "Ver" #: ../src/yumex/gui/dialogs.py:251 msgid "replacing {}" -msgstr "" +msgstr "javítás {}" #: ../src/yumex/gui/dialogs.py:287 #, python-format @@ -431,56 +434,56 @@ msgstr "" #: ../src/yumex/gui/widgets.py:621 #, python-format msgid "Tags: %s\n" -msgstr "" +msgstr "Címkék: %s\n" #: ../src/yumex/gui/widgets.py:626 msgid "Links: " -msgstr "" +msgstr "Hivatkozások:" #: ../src/yumex/gui/widgets.py:649 msgid "No update information is available" -msgstr "" +msgstr "Nincs elérhető információ a frissítésekről" #: ../src/yumex/gui/widgets.py:651 msgid "" "\n" "Fedora Updates:" -msgstr "" +msgstr "\nFedora frissítések:" #: ../src/yumex/gui/widgets.py:661 msgid "Release" -msgstr "" +msgstr "Kiadás" #: ../src/yumex/gui/widgets.py:662 msgid "Type" -msgstr "" +msgstr "Típus" #. head += ("%14s " % _("Status")) + ": %(status)s\n" #: ../src/yumex/gui/widgets.py:665 msgid "Issued" -msgstr "" +msgstr "Kiadva" #: ../src/yumex/gui/widgets.py:702 ../src/yumex.ui.h:75 msgid "Description" -msgstr "" +msgstr "Leírás" #: ../src/yumex/gui/widgets.py:724 msgid "No changelog information is available" -msgstr "" +msgstr "Nem érhető el változásnapló" #: ../src/yumex/gui/widgets.py:726 msgid "" "\n" "Online Changelog:" -msgstr "" +msgstr "\nElérhető változásnapló:" #: ../src/yumex/gui/widgets.py:741 msgid "No filelist information is available" -msgstr "" +msgstr "Nincs elérhető információ a fájllistáról" #: ../src/yumex/gui/widgets.py:771 msgid "Newest only" -msgstr "" +msgstr "Csak újak" #: ../src/yumex/gui/widgets.py:772 msgid "Erase unused requirements" @@ -492,51 +495,51 @@ msgstr "" #: ../src/yumex/gui/widgets.py:776 msgid "Options" -msgstr "" +msgstr "Beállítások" #: ../src/yumex/gui/widgets.py:778 msgid "About" -msgstr "" +msgstr "Névjegy" #: ../src/yumex/gui/widgets.py:779 msgid "Documentation" -msgstr "" +msgstr "Dokumentáció" #: ../src/yumex/gui/widgets.py:780 msgid "Help" -msgstr "" +msgstr "Súgó" #: ../src/yumex/gui/widgets.py:782 ../src/yumex.ui.h:1 msgid "Preferences" -msgstr "" +msgstr "Beállítások" #: ../src/yumex/gui/widgets.py:783 msgid "Quit" -msgstr "" +msgstr "Kilépés" #: ../misc/yumex-dnf-local.desktop.in.h:1 msgid "Yumex Package Installer" -msgstr "" +msgstr "Yumex csomagtelepítő" #: ../misc/yumex-dnf-local.desktop.in.h:2 msgid "Install local packages on system" -msgstr "" +msgstr "Helyi csomagok telepítése a rendszerről" #: ../misc/yumex-dnf.desktop.in.h:1 msgid "Yum Extender (DNF)" -msgstr "" +msgstr "Yum Extender (DNF)" #: ../misc/yumex-dnf.desktop.in.h:2 msgid "Install, update and remove applications" -msgstr "" +msgstr "Alkalmazások telepítése, frissítése és eltávolítása" #: ../misc/yumex-dnf.desktop.in.h:3 msgid "Software Installer" -msgstr "" +msgstr "Szoftver telepítő" #: ../misc/yumex-dnf.appdata.xml.in.h:1 msgid "Graphical package manager" -msgstr "" +msgstr "Grafikus csomagkezelő" #: ../misc/yumex-dnf.appdata.xml.in.h:2 msgid "" @@ -553,7 +556,7 @@ msgstr "" #: ../misc/yumex-dnf.appdata.xml.in.h:4 msgid "Features:" -msgstr "" +msgstr "Részletek:" #: ../misc/yumex-dnf.appdata.xml.in.h:5 msgid "Browse packages available for installation or update" @@ -585,11 +588,11 @@ msgstr "" #: ../src/yumex.ui.h:2 msgid "OK" -msgstr "" +msgstr "OK" #: ../src/yumex.ui.h:3 msgid "Cancel" -msgstr "" +msgstr "Mégsem" #: ../src/yumex.ui.h:4 msgid "" @@ -655,7 +658,7 @@ msgstr "" #: ../src/yumex.ui.h:23 msgid "12" -msgstr "" +msgstr "12" #: ../src/yumex.ui.h:24 msgid "Default: Cleanup Old Installonly packages" @@ -667,11 +670,11 @@ msgstr "" #: ../src/yumex.ui.h:26 msgid "3" -msgstr "" +msgstr "3" #: ../src/yumex.ui.h:27 msgid "Settings" -msgstr "" +msgstr "Beállítások" #: ../src/yumex.ui.h:28 msgid "Autostart the Yum Extender update checker at user login" @@ -691,23 +694,23 @@ msgstr "" #: ../src/yumex.ui.h:32 msgid "Update Checker" -msgstr "" +msgstr "Frissítés kereső" #: ../src/yumex.ui.h:33 msgid "Color for installed packages" -msgstr "" +msgstr "Telepített csomagok színe" #: ../src/yumex.ui.h:34 msgid "Color for available updates" -msgstr "" +msgstr "Elérhető frissítések színe" #: ../src/yumex.ui.h:35 msgid "Color for available packages" -msgstr "" +msgstr "Elérhető csomagok színe" #: ../src/yumex.ui.h:36 msgid "Color for obsoleted packages" -msgstr "" +msgstr "Elavult csomagok színe" #: ../src/yumex.ui.h:37 msgid "Color for available downgrades" @@ -715,7 +718,7 @@ msgstr "" #: ../src/yumex.ui.h:38 msgid "Advanced" -msgstr "" +msgstr "Haladó" #: ../src/yumex.ui.h:39 msgid "Repositories used in current session" @@ -730,99 +733,99 @@ msgstr "" #: ../src/yumex.ui.h:43 msgid "Save selected repositories" -msgstr "" +msgstr "Kiválasztott tárolók mentése" #: ../src/yumex.ui.h:44 msgid "Repositories" -msgstr "" +msgstr "Tárolók" #: ../src/yumex.ui.h:45 msgid "label" -msgstr "" +msgstr "címke" #: ../src/yumex.ui.h:46 msgid "Show available updates" -msgstr "" +msgstr "Elérhető frissítések mutatása" #: ../src/yumex.ui.h:47 msgid "Updates" -msgstr "" +msgstr "Frissítések" #: ../src/yumex.ui.h:48 msgid "Show installed packages" -msgstr "" +msgstr "Telepített csomagok megjelenítése" #: ../src/yumex.ui.h:49 msgid "Installed" -msgstr "" +msgstr "Telepített" #: ../src/yumex.ui.h:50 msgid "Show available packages" -msgstr "" +msgstr "Elérhető csomagok megjelenítése" #: ../src/yumex.ui.h:51 msgid "Available" -msgstr "" +msgstr "Elérhető" #: ../src/yumex.ui.h:52 msgid "Show all packages" -msgstr "" +msgstr "Összes csomag" #: ../src/yumex.ui.h:53 msgid "All" -msgstr "" +msgstr "Összes" #: ../src/yumex.ui.h:55 msgid "Groups" -msgstr "" +msgstr "Csoportok" #: ../src/yumex.ui.h:56 msgid "Undo" -msgstr "" +msgstr "Kibontás" #: ../src/yumex.ui.h:57 msgid "History" -msgstr "" +msgstr "Előzmény" #: ../src/yumex.ui.h:58 msgid "Pending Actions" -msgstr "" +msgstr "Függő műveletek" #: ../src/yumex.ui.h:59 msgid "Package Description" -msgstr "" +msgstr "Csomag leírás" #: ../src/yumex.ui.h:60 msgid "Package Update Information" -msgstr "" +msgstr "Csomag frissítés információ" #: ../src/yumex.ui.h:61 msgid "Package Filelist" -msgstr "" +msgstr "Csomag fájl-lista" #: ../src/yumex.ui.h:62 msgid "Package Requirements" -msgstr "" +msgstr "Csomag követelmények" #: ../src/yumex.ui.h:63 msgid "Search (show/hide)" -msgstr "" +msgstr "Keresés (megjelenítés/elrejtés)" #: ../src/yumex.ui.h:64 msgid "Apply pending actions" -msgstr "" +msgstr "Függőben lévő műveletek alkalmazása" #: ../src/yumex.ui.h:65 msgid "Prefix" -msgstr "" +msgstr "Előtag" #: ../src/yumex.ui.h:66 msgid "Package names starting with search key" -msgstr "" +msgstr "Csomag nevének gépelése a kereséshez" #: ../src/yumex.ui.h:67 msgid "Keyword" -msgstr "" +msgstr "Kulcsszó" #: ../src/yumex.ui.h:68 msgid "Package names containing search key" @@ -830,7 +833,7 @@ msgstr "" #: ../src/yumex.ui.h:69 msgid "Fields" -msgstr "" +msgstr "Mezők" #: ../src/yumex.ui.h:70 msgid "Specified package fields containing search keys." @@ -838,15 +841,15 @@ msgstr "" #: ../src/yumex.ui.h:72 msgid "Package name" -msgstr "" +msgstr "Csomag név" #: ../src/yumex.ui.h:74 msgid "Package summary" -msgstr "" +msgstr "Csomag összegzés" #: ../src/yumex.ui.h:76 msgid "Package description" -msgstr "" +msgstr "Csomag leírás" #: ../src/yumex.ui.h:77 msgid "Package actions to perform" @@ -854,4 +857,4 @@ msgstr "" #: ../src/yumex.ui.h:78 msgid "Size:" -msgstr "" +msgstr "Méret:" diff --git a/po/ja.po b/po/ja.po index 7060c10..8fa7984 100644 --- a/po/ja.po +++ b/po/ja.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Ooyama Yosiyuki , 2015 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" -"Last-Translator: Tim Lauridsen \n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" +"Last-Translator: Ooyama Yosiyuki \n" "Language-Team: Japanese (http://www.transifex.com/timlau/yumex/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" -msgstr "" +msgstr "リポジトリのメタデータをリフレッシュ" #: ../src/yumex/__init__.py:119 ../src/yumex/old_init.py:144 msgid "Could not refresh the DNF cache (root)" @@ -50,14 +51,14 @@ msgstr "" #: ../src/yumex/__init__.py:748 ../src/yumex/__init__.py:831 #: ../src/yumex/old_init.py:268 ../src/yumex/old_init.py:1049 msgid "Dependencies resolved" -msgstr "" +msgstr "依存性が解決しました" #. Ok pressed #: ../src/yumex/__init__.py:762 ../src/yumex/__init__.py:839 #: ../src/yumex/dnf_backend.py:206 ../src/yumex/old_init.py:276 #: ../src/yumex/old_init.py:1063 msgid "Applying changes to the system" -msgstr "" +msgstr "システムに変更を適用中" #: ../src/yumex/__init__.py:787 ../src/yumex/old_init.py:1088 msgid "Error checking package signatures\n" @@ -69,12 +70,12 @@ msgstr "" #: ../src/yumex/__init__.py:799 ../src/yumex/old_init.py:1100 msgid "Error in transaction\n" -msgstr "" +msgstr "トランザクション中にエラー\n" #: ../src/yumex/__init__.py:814 ../src/yumex/old_init.py:254 #, python-format msgid "Installing package: %s" -msgstr "" +msgstr "パッケージをインストール中: %s" #: ../src/yumex/__init__.py:815 #, python-format @@ -84,7 +85,7 @@ msgstr "" #: ../src/yumex/__init__.py:820 ../src/yumex/old_init.py:259 #, python-format msgid "Removing package: %s" -msgstr "" +msgstr "削除されるパッケージ: %s" #: ../src/yumex/__init__.py:821 #, python-format @@ -114,7 +115,7 @@ msgstr "" #: ../src/yumex/__init__.py:887 ../src/yumex/old_init.py:1140 msgid "No pending actions in queue" -msgstr "" +msgstr "キューに保留中のアクション無し" #: ../src/yumex/__init__.py:891 ../src/yumex/old_init.py:1144 msgid "Error(s) in building transaction" @@ -122,7 +123,7 @@ msgstr "" #: ../src/yumex/__init__.py:1013 ../src/yumex/old_init.py:789 msgid "Adding packages to view" -msgstr "" +msgstr "パッケージを表示に追加しています" #: ../src/yumex/__init__.py:1064 ../src/yumex/old_init.py:728 msgid "Error in undo history transaction" @@ -138,7 +139,7 @@ msgstr "" #: ../src/yumex/dnf_backend.py:191 msgid "Downloading packages" -msgstr "" +msgstr "パッケージをダウンロードしています" #: ../src/yumex/dnf_backend.py:197 msgid "Checking package signatures" @@ -146,7 +147,7 @@ msgstr "" #: ../src/yumex/dnf_backend.py:210 msgid "Verify changes on the system" -msgstr "" +msgstr "システムの変更を検証中" #: ../src/yumex/dnf_backend.py:246 #, python-format @@ -159,15 +160,15 @@ msgstr "" #: ../src/yumex/const.py:130 msgid "Getting available packages" -msgstr "" +msgstr "利用できるパッケージを取得しています" #: ../src/yumex/const.py:131 msgid "Getting available updates" -msgstr "" +msgstr "利用できる更新情報を取得しています" #: ../src/yumex/const.py:132 msgid "Getting all packages" -msgstr "" +msgstr "全パッケージを取得しています" #: ../src/yumex/const.py:145 msgid "Updated packages" @@ -203,75 +204,75 @@ msgstr "" #: ../src/yumex/const.py:157 msgid "Installing" -msgstr "" +msgstr "インストール" #: ../src/yumex/const.py:158 msgid "Updating" -msgstr "" +msgstr "更新" #: ../src/yumex/const.py:159 msgid "Removing" -msgstr "" +msgstr "削除" #: ../src/yumex/const.py:160 msgid "Downgrading" -msgstr "" +msgstr "ダウングレード" #: ../src/yumex/const.py:161 msgid "Replacing" -msgstr "" +msgstr "置き換え" #: ../src/yumex/const.py:165 #, python-format msgid "Updating: %s" -msgstr "" +msgstr "更新: %s" #: ../src/yumex/const.py:166 #, python-format msgid "Installing: %s" -msgstr "" +msgstr "インストール: %s" #: ../src/yumex/const.py:167 #, python-format msgid "Reinstalling: %s" -msgstr "" +msgstr "再インストール: %s" #: ../src/yumex/const.py:168 #, python-format msgid "Cleanup: %s" -msgstr "" +msgstr "掃除: %s" #: ../src/yumex/const.py:169 #, python-format msgid "Removing: %s" -msgstr "" +msgstr "削除: %s" #: ../src/yumex/const.py:170 #, python-format msgid "Obsoleting: %s" -msgstr "" +msgstr "廃止: %s" #: ../src/yumex/const.py:171 #, python-format msgid "Downgrading: %s" -msgstr "" +msgstr "ダウングレード: %s" #: ../src/yumex/const.py:172 #, python-format msgid "Verifying: %s" -msgstr "" +msgstr "検証: %s" #: ../src/yumex/const.py:182 msgid "Bugfix" -msgstr "" +msgstr "バグ修正" #: ../src/yumex/const.py:183 msgid "New Package" -msgstr "" +msgstr "新パッケージ" #: ../src/yumex/const.py:184 msgid "Security" -msgstr "" +msgstr "セキュリティ" #: ../src/yumex/const.py:185 msgid "Enhancement" @@ -303,7 +304,7 @@ msgstr "" #. timeout 10s #: ../src/yumex/updater.py:68 msgid "Not Now" -msgstr "" +msgstr "あとで" #: ../src/yumex/updater.py:70 msgid "Show Updates" @@ -328,15 +329,15 @@ msgstr "" #: ../src/yumex/gui/views.py:273 msgid "Package" -msgstr "" +msgstr "パッケージ" #: ../src/yumex/gui/views.py:275 msgid "Ver." -msgstr "" +msgstr "Ver." #: ../src/yumex/gui/views.py:277 msgid "Arch." -msgstr "" +msgstr "Arch." #: ../src/yumex/gui/views.py:279 msgid "click to filter archs" @@ -345,15 +346,15 @@ msgstr "" #: ../src/yumex/gui/views.py:280 ../src/yumex/gui/views.py:769 #: ../src/yumex.ui.h:73 msgid "Summary" -msgstr "" +msgstr "要約" #: ../src/yumex/gui/views.py:281 msgid "Repo." -msgstr "" +msgstr "Repo." #: ../src/yumex/gui/views.py:282 ../src/yumex/gui/dialogs.py:210 msgid "Size" -msgstr "" +msgstr "サイズ" #: ../src/yumex/gui/views.py:321 msgid "Reinstall Package" @@ -365,7 +366,7 @@ msgstr "" #: ../src/yumex/gui/views.py:764 ../src/yumex.ui.h:54 msgid "Packages" -msgstr "" +msgstr "パッケージ" #: ../src/yumex/gui/views.py:894 #, python-format @@ -384,11 +385,11 @@ msgstr "" #: ../src/yumex/gui/views.py:1082 ../src/yumex/gui/views.py:1129 #: ../src/yumex/gui/dialogs.py:209 msgid "Repository" -msgstr "" +msgstr "リポジトリー" #: ../src/yumex/gui/views.py:1082 msgid "Filename" -msgstr "" +msgstr "ファイル名" #: ../src/yumex/gui/views.py:1113 msgid "" @@ -399,15 +400,15 @@ msgstr "" #: ../src/yumex/gui/views.py:1130 ../src/yumex/gui/dialogs.py:206 #: ../src/yumex.ui.h:71 msgid "Name" -msgstr "" +msgstr "名前" #: ../src/yumex/gui/dialogs.py:207 msgid "Arch" -msgstr "" +msgstr "Arch" #: ../src/yumex/gui/dialogs.py:208 msgid "Ver" -msgstr "" +msgstr "Ver" #: ../src/yumex/gui/dialogs.py:251 msgid "replacing {}" @@ -435,7 +436,7 @@ msgstr "" #: ../src/yumex/gui/widgets.py:626 msgid "Links: " -msgstr "" +msgstr "リンク: " #: ../src/yumex/gui/widgets.py:649 msgid "No update information is available" @@ -445,7 +446,7 @@ msgstr "" msgid "" "\n" "Fedora Updates:" -msgstr "" +msgstr "\nFedora Updates:" #: ../src/yumex/gui/widgets.py:661 msgid "Release" @@ -462,7 +463,7 @@ msgstr "" #: ../src/yumex/gui/widgets.py:702 ../src/yumex.ui.h:75 msgid "Description" -msgstr "" +msgstr "説明" #: ../src/yumex/gui/widgets.py:724 msgid "No changelog information is available" @@ -492,7 +493,7 @@ msgstr "" #: ../src/yumex/gui/widgets.py:776 msgid "Options" -msgstr "" +msgstr "オプション" #: ../src/yumex/gui/widgets.py:778 msgid "About" @@ -500,19 +501,19 @@ msgstr "" #: ../src/yumex/gui/widgets.py:779 msgid "Documentation" -msgstr "" +msgstr "ドキュメント" #: ../src/yumex/gui/widgets.py:780 msgid "Help" -msgstr "" +msgstr "ヘルプ" #: ../src/yumex/gui/widgets.py:782 ../src/yumex.ui.h:1 msgid "Preferences" -msgstr "" +msgstr "設定" #: ../src/yumex/gui/widgets.py:783 msgid "Quit" -msgstr "" +msgstr "終了" #: ../misc/yumex-dnf-local.desktop.in.h:1 msgid "Yumex Package Installer" @@ -524,7 +525,7 @@ msgstr "" #: ../misc/yumex-dnf.desktop.in.h:1 msgid "Yum Extender (DNF)" -msgstr "" +msgstr "Yum Extender (DNF)" #: ../misc/yumex-dnf.desktop.in.h:2 msgid "Install, update and remove applications" @@ -585,11 +586,11 @@ msgstr "" #: ../src/yumex.ui.h:2 msgid "OK" -msgstr "" +msgstr "OK" #: ../src/yumex.ui.h:3 msgid "Cancel" -msgstr "" +msgstr "取り消す" #: ../src/yumex.ui.h:4 msgid "" @@ -734,19 +735,19 @@ msgstr "" #: ../src/yumex.ui.h:44 msgid "Repositories" -msgstr "" +msgstr "リポジトリー" #: ../src/yumex.ui.h:45 msgid "label" -msgstr "" +msgstr "ラベル" #: ../src/yumex.ui.h:46 msgid "Show available updates" -msgstr "" +msgstr "利用可能なパッケージを表示します" #: ../src/yumex.ui.h:47 msgid "Updates" -msgstr "" +msgstr "更新" #: ../src/yumex.ui.h:48 msgid "Show installed packages" @@ -754,47 +755,47 @@ msgstr "" #: ../src/yumex.ui.h:49 msgid "Installed" -msgstr "" +msgstr "インストール済み" #: ../src/yumex.ui.h:50 msgid "Show available packages" -msgstr "" +msgstr "利用可能なパッケージを表示" #: ../src/yumex.ui.h:51 msgid "Available" -msgstr "" +msgstr "利用可能" #: ../src/yumex.ui.h:52 msgid "Show all packages" -msgstr "" +msgstr "全パッケージを表示する" #: ../src/yumex.ui.h:53 msgid "All" -msgstr "" +msgstr "すべて" #: ../src/yumex.ui.h:55 msgid "Groups" -msgstr "" +msgstr "グループ" #: ../src/yumex.ui.h:56 msgid "Undo" -msgstr "" +msgstr "戻す" #: ../src/yumex.ui.h:57 msgid "History" -msgstr "" +msgstr "履歴" #: ../src/yumex.ui.h:58 msgid "Pending Actions" -msgstr "" +msgstr "保留している操作" #: ../src/yumex.ui.h:59 msgid "Package Description" -msgstr "" +msgstr "パッケージの説明" #: ../src/yumex.ui.h:60 msgid "Package Update Information" -msgstr "" +msgstr "パッケージ更新情報" #: ../src/yumex.ui.h:61 msgid "Package Filelist" @@ -810,11 +811,11 @@ msgstr "" #: ../src/yumex.ui.h:64 msgid "Apply pending actions" -msgstr "" +msgstr "保留している操作を適用" #: ../src/yumex.ui.h:65 msgid "Prefix" -msgstr "" +msgstr "接頭辞" #: ../src/yumex.ui.h:66 msgid "Package names starting with search key" @@ -822,7 +823,7 @@ msgstr "" #: ../src/yumex.ui.h:67 msgid "Keyword" -msgstr "" +msgstr "キーワード" #: ../src/yumex.ui.h:68 msgid "Package names containing search key" @@ -838,20 +839,20 @@ msgstr "" #: ../src/yumex.ui.h:72 msgid "Package name" -msgstr "" +msgstr "パッケージ名" #: ../src/yumex.ui.h:74 msgid "Package summary" -msgstr "" +msgstr "パッケージの要約" #: ../src/yumex.ui.h:76 msgid "Package description" -msgstr "" +msgstr "パッケージの説明" #: ../src/yumex.ui.h:77 msgid "Package actions to perform" -msgstr "" +msgstr "行われるパッケージ操作" #: ../src/yumex.ui.h:78 msgid "Size:" -msgstr "" +msgstr "サイズ:" diff --git a/po/ko.po b/po/ko.po index d387a68..0723bf0 100644 --- a/po/ko.po +++ b/po/ko.po @@ -3,13 +3,13 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# woosuk park , 2015 +# Woosuk Park, 2015 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" +"PO-Revision-Date: 2017-09-20 01:04+0000\n" "Last-Translator: Tim Lauridsen \n" "Language-Team: Korean (http://www.transifex.com/timlau/yumex/language/ko/)\n" "MIME-Version: 1.0\n" diff --git a/po/nl.po b/po/nl.po index 6946b79..4b91834 100644 --- a/po/nl.po +++ b/po/nl.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" "Last-Translator: Tim Lauridsen \n" "Language-Team: Dutch (http://www.transifex.com/timlau/yumex/language/nl/)\n" "MIME-Version: 1.0\n" diff --git a/po/pl.po b/po/pl.po index 943b238..acc0a47 100644 --- a/po/pl.po +++ b/po/pl.po @@ -3,21 +3,21 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Piotr Drąg , 2014-2015 +# Piotr Drąg , 2014-2017 # Tim Lauridsen , 2011 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 20:58+0000\n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish (http://www.transifex.com/timlau/yumex/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" @@ -42,7 +42,7 @@ msgstr "Program DNF jest zablokowany przez inny proces.\n\nProgram Yum Extender #: ../src/yumex/__init__.py:623 msgid "Reloading package information..." -msgstr "Ponowne wczytywanie informacji o pakiecie…" +msgstr "Ponowne wczytywanie informacji o pakiecie…" #: ../src/yumex/__init__.py:746 ../src/yumex/__init__.py:829 #: ../src/yumex/old_init.py:266 ../src/yumex/old_init.py:1047 @@ -59,7 +59,7 @@ msgstr "Rozwiązano zależności" #: ../src/yumex/dnf_backend.py:206 ../src/yumex/old_init.py:276 #: ../src/yumex/old_init.py:1063 msgid "Applying changes to the system" -msgstr "Zastosowywanie zmian w systemie" +msgstr "Zastosowywanie zmian w systemie" #: ../src/yumex/__init__.py:787 ../src/yumex/old_init.py:1088 msgid "Error checking package signatures\n" @@ -116,7 +116,7 @@ msgstr "Nie można usunąć chronionych pakietów" #: ../src/yumex/__init__.py:887 ../src/yumex/old_init.py:1140 msgid "No pending actions in queue" -msgstr "Brak działań oczekujących w kolejce" +msgstr "Brak działań oczekujących w kolejce" #: ../src/yumex/__init__.py:891 ../src/yumex/old_init.py:1144 msgid "Error(s) in building transaction" @@ -136,7 +136,7 @@ msgid "" "dnfdaemon api version : %d\n" "don't match\n" "needed api version : %d" -msgstr "wersja API dnfdaemon: %d\nnie zgadza się z\nwymaganą wersją API: %d" +msgstr "wersja API dnfdaemon: %d\nnie zgadza się\nz wymaganą wersją API: %d" #: ../src/yumex/dnf_backend.py:191 msgid "Downloading packages" @@ -148,12 +148,12 @@ msgstr "Sprawdzanie podpisów pakietów" #: ../src/yumex/dnf_backend.py:210 msgid "Verify changes on the system" -msgstr "Sprawdza poprawność zmian w systemie" +msgstr "Sprawdza poprawność zmian w systemie" #: ../src/yumex/dnf_backend.py:246 #, python-format msgid "Downloading %d files (%sB)..." -msgstr "Pobieranie plików: %d (%s B)…" +msgstr "Pobieranie plików: %d (%s B)…" #: ../src/yumex/const.py:129 msgid "Getting installed packages" @@ -281,7 +281,7 @@ msgstr "Ulepszenia" #: ../src/yumex/old_init.py:283 msgid "Changes was successfully applied to the system" -msgstr "Pomyślnie zastosowany zmiany w systemie" +msgstr "Pomyślnie zastosowany zmiany w systemie" #: ../src/yumex/old_init.py:1305 msgid "" @@ -441,7 +441,7 @@ msgstr "Odnośniki: " #: ../src/yumex/gui/widgets.py:649 msgid "No update information is available" -msgstr "Brak dostępnych informacji o aktualizacji" +msgstr "Brak dostępnych informacji o aktualizacji" #: ../src/yumex/gui/widgets.py:651 msgid "" @@ -468,17 +468,17 @@ msgstr "Opis" #: ../src/yumex/gui/widgets.py:724 msgid "No changelog information is available" -msgstr "Brak dostępnych informacji o zmianach" +msgstr "Brak dostępnych informacji o zmianach" #: ../src/yumex/gui/widgets.py:726 msgid "" "\n" "Online Changelog:" -msgstr "\nDziennik zmian w sieci:" +msgstr "\nDziennik zmian w sieci:" #: ../src/yumex/gui/widgets.py:741 msgid "No filelist information is available" -msgstr "Brak dostępnych informacji o liście plików" +msgstr "Brak dostępnych informacji o liście plików" #: ../src/yumex/gui/widgets.py:771 msgid "Newest only" @@ -498,7 +498,7 @@ msgstr "Opcje" #: ../src/yumex/gui/widgets.py:778 msgid "About" -msgstr "O programie" +msgstr "O programie" #: ../src/yumex/gui/widgets.py:779 msgid "Documentation" @@ -522,7 +522,7 @@ msgstr "Instalator pakietów Yumex" #: ../misc/yumex-dnf-local.desktop.in.h:2 msgid "Install local packages on system" -msgstr "Instaluje lokalne pakiety w systemie" +msgstr "Instaluje lokalne pakiety w systemie" #: ../misc/yumex-dnf.desktop.in.h:1 msgid "Yum Extender (DNF)" @@ -530,7 +530,7 @@ msgstr "Yum Extender (DNF)" #: ../misc/yumex-dnf.desktop.in.h:2 msgid "Install, update and remove applications" -msgstr "Instalowanie, aktualizowanie i usuwanie aplikacji" +msgstr "Instalowanie, aktualizowanie i usuwanie aplikacji" #: ../misc/yumex-dnf.desktop.in.h:3 msgid "Software Installer" @@ -545,13 +545,13 @@ msgid "" "Yum Extender is a graphical package management application. It allows you to" " search and browse for packages to install, remove and update on your " "computer." -msgstr "Yum Extender jest graficzną aplikacją do zarządzania pakietami. Umożliwia ona wyszukiwanie i przeglądanie pakietów oraz ich instalowanie, usuwanie i aktualizowanie." +msgstr "Yum Extender jest graficzną aplikacją do zarządzania pakietami. Umożliwia ona wyszukiwanie i przeglądanie pakietów oraz ich instalowanie, usuwanie i aktualizowanie." #: ../misc/yumex-dnf.appdata.xml.in.h:3 msgid "" "It is designed to give you full control over the packages on your computer " "and to be used by all users." -msgstr "Została ona zaprojektowana tak, aby każdy użytkownik miał pełną kontrolę nad pakietami w swoim komputerze." +msgstr "Została ona zaprojektowana tak, aby każdy użytkownik miał pełną kontrolę nad pakietami w swoim komputerze." #: ../misc/yumex-dnf.appdata.xml.in.h:4 msgid "Features:" @@ -563,7 +563,7 @@ msgstr "Przeglądanie pakietów dostępnych do instalacji lub aktualizacji" #: ../misc/yumex-dnf.appdata.xml.in.h:6 msgid "Browse packages installed on your computer" -msgstr "Przeglądanie pakietów zainstalowanych w komputerze" +msgstr "Przeglądanie pakietów zainstalowanych w komputerze" #: ../misc/yumex-dnf.appdata.xml.in.h:7 msgid "Search packages by name, summary, description" @@ -571,11 +571,11 @@ msgstr "Przeszukiwanie pakietów według nazwy, podsumowaniu, opisie" #: ../misc/yumex-dnf.appdata.xml.in.h:8 msgid "Watch the history of package action on your system" -msgstr "Wyświetlanie historii działań na pakietach w systemie" +msgstr "Wyświetlanie historii działań na pakietach w systemie" #: ../misc/yumex-dnf.appdata.xml.in.h:9 msgid "Browse and install/remove package groups" -msgstr "Przeglądanie i instalowanie/usuwanie grup pakietów" +msgstr "Przeglądanie i instalowanie/usuwanie grup pakietów" #: ../misc/yumex-dnf.appdata.xml.in.h:10 msgid "Browse packages by size, repository" @@ -629,7 +629,7 @@ msgstr "Zamknięcie tylko minimalizuje okno" msgid "" "Use the toolbar in the header of the window\n" "standard when using GNOME" -msgstr "Używanie paska narzędzi w nagłówku okna\npodczas używania środowiska GNOME" +msgstr "Używanie paska narzędzi w nagłówku okna\npodczas używania środowiska GNOME" #: ../src/yumex.ui.h:17 msgid "Show toolbar in window headerbar" @@ -649,11 +649,11 @@ msgstr "Zaznaczanie aktualizacji po uruchomieniu" msgid "" "The interval in hour, when the DNF cache will be expired and updated (0 = " "disabled)" -msgstr "Czas między wygasaniem i aktualizowaniem pamięci podręcznej programu DNF (0 = wyłączone)" +msgstr "Czas między wygasaniem i aktualizowaniem pamięci podręcznej programu DNF (0 = wyłączone)" #: ../src/yumex.ui.h:22 msgid "Cache expire interval (hours)" -msgstr "Czas między wygasaniem pamięci podręcznej (w godzinach)" +msgstr "Czas między wygasaniem pamięci podręcznej (w godzinach)" #: ../src/yumex.ui.h:23 msgid "12" @@ -689,7 +689,7 @@ msgstr "Jak często uruchamiać sprawdzanie aktualizacji" #: ../src/yumex.ui.h:31 msgid "Update check interval (minutes)" -msgstr "Czas między sprawdzaniem aktualizacji (w minutach)" +msgstr "Czas między sprawdzaniem aktualizacji (w minutach)" #: ../src/yumex.ui.h:32 msgid "Update Checker" @@ -721,7 +721,7 @@ msgstr "Zaawansowane" #: ../src/yumex.ui.h:39 msgid "Repositories used in current session" -msgstr "Repozytoria używane w bieżącej sesji" +msgstr "Repozytoria używane w bieżącej sesji" #: ../src/yumex.ui.h:40 msgid "" @@ -796,11 +796,11 @@ msgstr "Opis pakietu" #: ../src/yumex.ui.h:60 msgid "Package Update Information" -msgstr "Informacje o aktualizacji pakietu" +msgstr "Informacje o aktualizacji pakietu" #: ../src/yumex.ui.h:61 msgid "Package Filelist" -msgstr "Lista plików w pakiecie" +msgstr "Lista plików w pakiecie" #: ../src/yumex.ui.h:62 msgid "Package Requirements" diff --git a/po/pt_BR.po b/po/pt_BR.po index 93d1596..0fdc298 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -3,13 +3,13 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Felipe Braga, 2015 +# Felipe Braga , 2015 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" "Last-Translator: Tim Lauridsen \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/timlau/yumex/language/pt_BR/)\n" "MIME-Version: 1.0\n" diff --git a/po/sk.po b/po/sk.po index bba8da6..d351948 100644 --- a/po/sk.po +++ b/po/sk.po @@ -3,20 +3,20 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Dušan Kazik , 2012,2014-2015 +# Dušan Kazik , 2012,2014-2016 msgid "" msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 22:53+0000\n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" "Last-Translator: Dušan Kazik \n" "Language-Team: Slovak (http://www.transifex.com/timlau/yumex/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" @@ -152,7 +152,7 @@ msgstr "Overenie zmien v systéme" #: ../src/yumex/dnf_backend.py:246 #, python-format msgid "Downloading %d files (%sB)..." -msgstr "" +msgstr "Preberá sa %d súborov (%sB)..." #: ../src/yumex/const.py:129 msgid "Getting installed packages" diff --git a/po/tr_TR.po b/po/tr_TR.po index c76d30c..8b3bed3 100644 --- a/po/tr_TR.po +++ b/po/tr_TR.po @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" diff --git a/po/uk.po b/po/uk.po index dcc1125..37a04fd 100644 --- a/po/uk.po +++ b/po/uk.po @@ -10,14 +10,14 @@ msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 18:02+0000\n" +"PO-Revision-Date: 2017-09-20 01:03+0000\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian (http://www.transifex.com/timlau/yumex/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 msgid "Refreshing Repository Metadata" diff --git a/po/zh_CN.po b/po/zh_CN.po index 9fb107d..1f67cf1 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: Yum Extender\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-12-02 18:49+0100\n" -"PO-Revision-Date: 2015-12-02 17:49+0000\n" +"PO-Revision-Date: 2017-09-23 19:38+0000\n" "Last-Translator: Tim Lauridsen \n" "Language-Team: Chinese (China) (http://www.transifex.com/timlau/yumex/language/zh_CN/)\n" "MIME-Version: 1.0\n" From 46734d4e3012f53805bf060396655a7bb4d7aff1 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 17 May 2021 15:38:12 +0200 Subject: [PATCH 092/133] Use local builddir --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index b55ff06..69da59a 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ changelog: $(PYTHON) tools/git2cl.py upload: - @scp ~/rpmbuild/SOURCES/${APPNAME}-${VERSION}.tar.gz yum-extender.org:public_html/dnl/yumex/source/. + @scp $(BUILDDIR)/SOURCES/${APPNAME}-${VERSION}.tar.gz yum-extender.org:public_html/dnl/yumex/source/. release-branch: @git branch -m ${GIT_MASTER} release-${VERSION} @@ -112,20 +112,20 @@ test-builds: @$(MAKE) test-release @ssh timlau.fedorapeople.org rm public_html/files/yumex/* @scp ${APPNAME}-${NEW_VER}.tar.gz timlau.fedorapeople.org:public_html/files/yumex/${APPNAME}-${NEW_VER}-${GITDATE}.tar.gz - @scp ~/rpmbuild/RPMS/noarch/${APPNAME}-${NEW_VER}*.rpm timlau.fedorapeople.org:public_html/files/yumex/. - @scp ~/rpmbuild/SRPMS/${APPNAME}-${NEW_VER}*.rpm timlau.fedorapeople.org:public_html/files/yumex/. + @scp $(BUILDDIR)/RPMS/noarch/${APPNAME}-${NEW_VER}*.rpm timlau.fedorapeople.org:public_html/files/yumex/. + @scp $(BUILDDIR)/SRPMS/${APPNAME}-${NEW_VER}*.rpm timlau.fedorapeople.org:public_html/files/yumex/. test-upd: @$(MAKE) test-release - sudo dnf update ~/rpmbuild/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm + sudo dnf update $(BUILDDIR)/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm test-inst: @$(MAKE) test-release - sudo dnf install ~/rpmbuild/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm + sudo dnf install $(BUILDDIR)/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm test-reinst: @$(MAKE) test-release - sudo dnf reinstall ~/rpmbuild/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm + sudo dnf reinstall $(BUILDDIR)/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm transifex-setup: From 4fc69eac29530bb736d0267b030f934c7a76e0dd Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 17 May 2021 15:38:42 +0200 Subject: [PATCH 093/133] update .po files --- po/sv.po | 857 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 857 insertions(+) create mode 100644 po/sv.po diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..0d0a034 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,857 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Yum Extender\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-02 18:49+0100\n" +"PO-Revision-Date: 2015-12-02 17:49+0000\n" +"Last-Translator: Tim Lauridsen \n" +"Language-Team: Swedish (http://www.transifex.com/timlau/yumex/language/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 +msgid "Refreshing Repository Metadata" +msgstr "" + +#: ../src/yumex/__init__.py:119 ../src/yumex/old_init.py:144 +msgid "Could not refresh the DNF cache (root)" +msgstr "" + +#: ../src/yumex/__init__.py:124 ../src/yumex/old_init.py:149 +msgid "" +"DNF root backend was not authorized.\n" +"Yum Extender will exit" +msgstr "" + +#: ../src/yumex/__init__.py:129 ../src/yumex/old_init.py:154 +msgid "" +"DNF is locked by another process.\n" +"\n" +"Yum Extender will exit" +msgstr "" + +#: ../src/yumex/__init__.py:623 +msgid "Reloading package information..." +msgstr "" + +#: ../src/yumex/__init__.py:746 ../src/yumex/__init__.py:829 +#: ../src/yumex/old_init.py:266 ../src/yumex/old_init.py:1047 +msgid "Searching for dependencies" +msgstr "" + +#: ../src/yumex/__init__.py:748 ../src/yumex/__init__.py:831 +#: ../src/yumex/old_init.py:268 ../src/yumex/old_init.py:1049 +msgid "Dependencies resolved" +msgstr "" + +#. Ok pressed +#: ../src/yumex/__init__.py:762 ../src/yumex/__init__.py:839 +#: ../src/yumex/dnf_backend.py:206 ../src/yumex/old_init.py:276 +#: ../src/yumex/old_init.py:1063 +msgid "Applying changes to the system" +msgstr "" + +#: ../src/yumex/__init__.py:787 ../src/yumex/old_init.py:1088 +msgid "Error checking package signatures\n" +msgstr "" + +#: ../src/yumex/__init__.py:793 ../src/yumex/old_init.py:1094 +msgid "Downloading error(s)\n" +msgstr "" + +#: ../src/yumex/__init__.py:799 ../src/yumex/old_init.py:1100 +msgid "Error in transaction\n" +msgstr "" + +#: ../src/yumex/__init__.py:814 ../src/yumex/old_init.py:254 +#, python-format +msgid "Installing package: %s" +msgstr "" + +#: ../src/yumex/__init__.py:815 +#, python-format +msgid "%s was installed successfully" +msgstr "" + +#: ../src/yumex/__init__.py:820 ../src/yumex/old_init.py:259 +#, python-format +msgid "Removing package: %s" +msgstr "" + +#: ../src/yumex/__init__.py:821 +#, python-format +msgid "%s was removed successfully" +msgstr "" + +#: ../src/yumex/__init__.py:826 ../src/yumex/old_init.py:264 +msgid "Updating all available updates" +msgstr "" + +#: ../src/yumex/__init__.py:827 +msgid "Available updates was applied successfully" +msgstr "" + +#: ../src/yumex/__init__.py:846 ../src/yumex/__init__.py:896 +#: ../src/yumex/old_init.py:286 ../src/yumex/old_init.py:1149 +msgid "Error(s) in search for dependencies" +msgstr "" + +#: ../src/yumex/__init__.py:862 ../src/yumex/old_init.py:1115 +msgid "Preparing system for applying changes" +msgstr "" + +#: ../src/yumex/__init__.py:873 ../src/yumex/old_init.py:1126 +msgid "Can't remove protected package(s)" +msgstr "" + +#: ../src/yumex/__init__.py:887 ../src/yumex/old_init.py:1140 +msgid "No pending actions in queue" +msgstr "" + +#: ../src/yumex/__init__.py:891 ../src/yumex/old_init.py:1144 +msgid "Error(s) in building transaction" +msgstr "" + +#: ../src/yumex/__init__.py:1013 ../src/yumex/old_init.py:789 +msgid "Adding packages to view" +msgstr "" + +#: ../src/yumex/__init__.py:1064 ../src/yumex/old_init.py:728 +msgid "Error in undo history transaction" +msgstr "" + +#: ../src/yumex/dnf_backend.py:181 +#, python-format +msgid "" +"dnfdaemon api version : %d\n" +"don't match\n" +"needed api version : %d" +msgstr "" + +#: ../src/yumex/dnf_backend.py:191 +msgid "Downloading packages" +msgstr "" + +#: ../src/yumex/dnf_backend.py:197 +msgid "Checking package signatures" +msgstr "" + +#: ../src/yumex/dnf_backend.py:210 +msgid "Verify changes on the system" +msgstr "" + +#: ../src/yumex/dnf_backend.py:246 +#, python-format +msgid "Downloading %d files (%sB)..." +msgstr "" + +#: ../src/yumex/const.py:129 +msgid "Getting installed packages" +msgstr "" + +#: ../src/yumex/const.py:130 +msgid "Getting available packages" +msgstr "" + +#: ../src/yumex/const.py:131 +msgid "Getting available updates" +msgstr "" + +#: ../src/yumex/const.py:132 +msgid "Getting all packages" +msgstr "" + +#: ../src/yumex/const.py:145 +msgid "Updated packages" +msgstr "" + +#: ../src/yumex/const.py:146 +msgid "Downgraded packages" +msgstr "" + +#: ../src/yumex/const.py:147 +msgid "Obsoleting packages" +msgstr "" + +#: ../src/yumex/const.py:148 +msgid "Obsoleted packages" +msgstr "" + +#: ../src/yumex/const.py:149 +msgid "Erased packages" +msgstr "" + +#: ../src/yumex/const.py:150 ../src/yumex/const.py:151 +msgid "Installed packages" +msgstr "" + +#: ../src/yumex/const.py:152 +msgid "Installed for dependencies" +msgstr "" + +#: ../src/yumex/const.py:153 +msgid "Reinstalled packages" +msgstr "" + +#: ../src/yumex/const.py:157 +msgid "Installing" +msgstr "" + +#: ../src/yumex/const.py:158 +msgid "Updating" +msgstr "" + +#: ../src/yumex/const.py:159 +msgid "Removing" +msgstr "" + +#: ../src/yumex/const.py:160 +msgid "Downgrading" +msgstr "" + +#: ../src/yumex/const.py:161 +msgid "Replacing" +msgstr "" + +#: ../src/yumex/const.py:165 +#, python-format +msgid "Updating: %s" +msgstr "" + +#: ../src/yumex/const.py:166 +#, python-format +msgid "Installing: %s" +msgstr "" + +#: ../src/yumex/const.py:167 +#, python-format +msgid "Reinstalling: %s" +msgstr "" + +#: ../src/yumex/const.py:168 +#, python-format +msgid "Cleanup: %s" +msgstr "" + +#: ../src/yumex/const.py:169 +#, python-format +msgid "Removing: %s" +msgstr "" + +#: ../src/yumex/const.py:170 +#, python-format +msgid "Obsoleting: %s" +msgstr "" + +#: ../src/yumex/const.py:171 +#, python-format +msgid "Downgrading: %s" +msgstr "" + +#: ../src/yumex/const.py:172 +#, python-format +msgid "Verifying: %s" +msgstr "" + +#: ../src/yumex/const.py:182 +msgid "Bugfix" +msgstr "" + +#: ../src/yumex/const.py:183 +msgid "New Package" +msgstr "" + +#: ../src/yumex/const.py:184 +msgid "Security" +msgstr "" + +#: ../src/yumex/const.py:185 +msgid "Enhancement" +msgstr "" + +#: ../src/yumex/old_init.py:283 +msgid "Changes was successfully applied to the system" +msgstr "" + +#: ../src/yumex/old_init.py:1305 +msgid "" +"\n" +"\n" +"Yum Extender will close" +msgstr "" + +#: ../src/yumex/old_init.py:1307 +msgid "Error in starting notification icon" +msgstr "" + +#: ../src/yumex/old_init.py:1331 +msgid "Yum Extender will close" +msgstr "" + +#: ../src/yumex/old_init.py:1333 +msgid "Error in locking notification icon" +msgstr "" + +#. timeout 10s +#: ../src/yumex/updater.py:68 +msgid "Not Now" +msgstr "" + +#: ../src/yumex/updater.py:70 +msgid "Show Updates" +msgstr "" + +#: ../src/yumex/updater.py:165 +msgid "New Updates" +msgstr "" + +#: ../src/yumex/updater.py:166 +#, python-format +msgid "%s available updates" +msgstr "" + +#: ../src/yumex/gui/views.py:256 +msgid "Click to install all/remove all" +msgstr "" + +#: ../src/yumex/gui/views.py:261 +msgid "Click to select/deselect all" +msgstr "" + +#: ../src/yumex/gui/views.py:273 +msgid "Package" +msgstr "" + +#: ../src/yumex/gui/views.py:275 +msgid "Ver." +msgstr "" + +#: ../src/yumex/gui/views.py:277 +msgid "Arch." +msgstr "" + +#: ../src/yumex/gui/views.py:279 +msgid "click to filter archs" +msgstr "" + +#: ../src/yumex/gui/views.py:280 ../src/yumex/gui/views.py:769 +#: ../src/yumex.ui.h:73 +msgid "Summary" +msgstr "" + +#: ../src/yumex/gui/views.py:281 +msgid "Repo." +msgstr "" + +#: ../src/yumex/gui/views.py:282 ../src/yumex/gui/dialogs.py:210 +msgid "Size" +msgstr "" + +#: ../src/yumex/gui/views.py:321 +msgid "Reinstall Package" +msgstr "" + +#: ../src/yumex/gui/views.py:336 +msgid "Downgrade Package" +msgstr "" + +#: ../src/yumex/gui/views.py:764 ../src/yumex.ui.h:54 +msgid "Packages" +msgstr "" + +#: ../src/yumex/gui/views.py:894 +#, python-format +msgid "Downgrade to %s " +msgstr "" + +#: ../src/yumex/gui/views.py:917 +msgid "History (Date/Time)" +msgstr "" + +#: ../src/yumex/gui/views.py:994 +msgid "History Packages" +msgstr "" + +#. Setup reponame & repofile column's +#: ../src/yumex/gui/views.py:1082 ../src/yumex/gui/views.py:1129 +#: ../src/yumex/gui/dialogs.py:209 +msgid "Repository" +msgstr "" + +#: ../src/yumex/gui/views.py:1082 +msgid "Filename" +msgstr "" + +#: ../src/yumex/gui/views.py:1113 +msgid "" +"Click here to switch between\n" +" none/all/default selected" +msgstr "" + +#: ../src/yumex/gui/views.py:1130 ../src/yumex/gui/dialogs.py:206 +#: ../src/yumex.ui.h:71 +msgid "Name" +msgstr "" + +#: ../src/yumex/gui/dialogs.py:207 +msgid "Arch" +msgstr "" + +#: ../src/yumex/gui/dialogs.py:208 +msgid "Ver" +msgstr "" + +#: ../src/yumex/gui/dialogs.py:251 +msgid "replacing {}" +msgstr "" + +#: ../src/yumex/gui/dialogs.py:287 +#, python-format +msgid "" +" Do you want to import this GPG key\n" +" needed to verify the %s package?\n" +"\n" +" Key : 0x%s:\n" +" Userid : \"%s\"\n" +" From : %s" +msgstr "" + +#: ../src/yumex/gui/widgets.py:116 +msgid "Getting Package Metadata" +msgstr "" + +#: ../src/yumex/gui/widgets.py:621 +#, python-format +msgid "Tags: %s\n" +msgstr "" + +#: ../src/yumex/gui/widgets.py:626 +msgid "Links: " +msgstr "" + +#: ../src/yumex/gui/widgets.py:649 +msgid "No update information is available" +msgstr "" + +#: ../src/yumex/gui/widgets.py:651 +msgid "" +"\n" +"Fedora Updates:" +msgstr "" + +#: ../src/yumex/gui/widgets.py:661 +msgid "Release" +msgstr "" + +#: ../src/yumex/gui/widgets.py:662 +msgid "Type" +msgstr "" + +#. head += ("%14s " % _("Status")) + ": %(status)s\n" +#: ../src/yumex/gui/widgets.py:665 +msgid "Issued" +msgstr "" + +#: ../src/yumex/gui/widgets.py:702 ../src/yumex.ui.h:75 +msgid "Description" +msgstr "" + +#: ../src/yumex/gui/widgets.py:724 +msgid "No changelog information is available" +msgstr "" + +#: ../src/yumex/gui/widgets.py:726 +msgid "" +"\n" +"Online Changelog:" +msgstr "" + +#: ../src/yumex/gui/widgets.py:741 +msgid "No filelist information is available" +msgstr "" + +#: ../src/yumex/gui/widgets.py:771 +msgid "Newest only" +msgstr "" + +#: ../src/yumex/gui/widgets.py:772 +msgid "Erase unused requirements" +msgstr "" + +#: ../src/yumex/gui/widgets.py:774 +msgid "Cleanup old instonly packages " +msgstr "" + +#: ../src/yumex/gui/widgets.py:776 +msgid "Options" +msgstr "" + +#: ../src/yumex/gui/widgets.py:778 +msgid "About" +msgstr "" + +#: ../src/yumex/gui/widgets.py:779 +msgid "Documentation" +msgstr "" + +#: ../src/yumex/gui/widgets.py:780 +msgid "Help" +msgstr "" + +#: ../src/yumex/gui/widgets.py:782 ../src/yumex.ui.h:1 +msgid "Preferences" +msgstr "" + +#: ../src/yumex/gui/widgets.py:783 +msgid "Quit" +msgstr "" + +#: ../misc/yumex-dnf-local.desktop.in.h:1 +msgid "Yumex Package Installer" +msgstr "" + +#: ../misc/yumex-dnf-local.desktop.in.h:2 +msgid "Install local packages on system" +msgstr "" + +#: ../misc/yumex-dnf.desktop.in.h:1 +msgid "Yum Extender (DNF)" +msgstr "" + +#: ../misc/yumex-dnf.desktop.in.h:2 +msgid "Install, update and remove applications" +msgstr "" + +#: ../misc/yumex-dnf.desktop.in.h:3 +msgid "Software Installer" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:1 +msgid "Graphical package manager" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:2 +msgid "" +"Yum Extender is a graphical package management application. It allows you to" +" search and browse for packages to install, remove and update on your " +"computer." +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:3 +msgid "" +"It is designed to give you full control over the packages on your computer " +"and to be used by all users." +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:4 +msgid "Features:" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:5 +msgid "Browse packages available for installation or update" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:6 +msgid "Browse packages installed on your computer" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:7 +msgid "Search packages by name, summary, description" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:8 +msgid "Watch the history of package action on your system" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:9 +msgid "Browse and install/remove package groups" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:10 +msgid "Browse packages by size, repository" +msgstr "" + +#: ../misc/yumex-dnf.appdata.xml.in.h:11 +msgid "Control what package repositories are enabled for the current session" +msgstr "" + +#: ../src/yumex.ui.h:2 +msgid "OK" +msgstr "" + +#: ../src/yumex.ui.h:3 +msgid "Cancel" +msgstr "" + +#: ../src/yumex.ui.h:4 +msgid "" +"Show newest only is active when\n" +"Yum Extender starts.\n" +"Will show only latest version of available\n" +"packages" +msgstr "" + +#: ../src/yumex.ui.h:8 +msgid "Default: Show newest only" +msgstr "" + +#: ../src/yumex.ui.h:9 +msgid "" +"Erase unused requirement option is\n" +"active when Yum Extender starts" +msgstr "" + +#: ../src/yumex.ui.h:11 +msgid "Default: Erase Unused Requirements" +msgstr "" + +#: ../src/yumex.ui.h:12 +msgid "" +"Change the close action for the main window, so it just hides the\n" +"window when the close button is clicked" +msgstr "" + +#: ../src/yumex.ui.h:14 +msgid "Close will only minimize window" +msgstr "" + +#: ../src/yumex.ui.h:15 +msgid "" +"Use the toolbar in the header of the window\n" +"standard when using GNOME" +msgstr "" + +#: ../src/yumex.ui.h:17 +msgid "Show toolbar in window headerbar" +msgstr "" + +#: ../src/yumex.ui.h:18 +msgid "" +"Select all available updates when \n" +"Yum Extender is started" +msgstr "" + +#: ../src/yumex.ui.h:20 +msgid "Select updates at startup" +msgstr "" + +#: ../src/yumex.ui.h:21 +msgid "" +"The interval in hour, when the DNF cache will be expired and updated (0 = " +"disabled)" +msgstr "" + +#: ../src/yumex.ui.h:22 +msgid "Cache expire interval (hours)" +msgstr "" + +#: ../src/yumex.ui.h:23 +msgid "12" +msgstr "" + +#: ../src/yumex.ui.h:24 +msgid "Default: Cleanup Old Installonly packages" +msgstr "" + +#: ../src/yumex.ui.h:25 +msgid "Number of installonly packages to keep" +msgstr "" + +#: ../src/yumex.ui.h:26 +msgid "3" +msgstr "" + +#: ../src/yumex.ui.h:27 +msgid "Settings" +msgstr "" + +#: ../src/yumex.ui.h:28 +msgid "Autostart the Yum Extender update checker at user login" +msgstr "" + +#: ../src/yumex.ui.h:29 +msgid "Start update checker at user login" +msgstr "" + +#: ../src/yumex.ui.h:30 +msgid "How often the update checker will run" +msgstr "" + +#: ../src/yumex.ui.h:31 +msgid "Update check interval (minutes)" +msgstr "" + +#: ../src/yumex.ui.h:32 +msgid "Update Checker" +msgstr "" + +#: ../src/yumex.ui.h:33 +msgid "Color for installed packages" +msgstr "" + +#: ../src/yumex.ui.h:34 +msgid "Color for available updates" +msgstr "" + +#: ../src/yumex.ui.h:35 +msgid "Color for available packages" +msgstr "" + +#: ../src/yumex.ui.h:36 +msgid "Color for obsoleted packages" +msgstr "" + +#: ../src/yumex.ui.h:37 +msgid "Color for available downgrades" +msgstr "" + +#: ../src/yumex.ui.h:38 +msgid "Advanced" +msgstr "" + +#: ../src/yumex.ui.h:39 +msgid "Repositories used in current session" +msgstr "" + +#: ../src/yumex.ui.h:40 +msgid "" +"Save the current selected repositories\n" +"so they will be used next time you\n" +"start Yum Extender" +msgstr "" + +#: ../src/yumex.ui.h:43 +msgid "Save selected repositories" +msgstr "" + +#: ../src/yumex.ui.h:44 +msgid "Repositories" +msgstr "" + +#: ../src/yumex.ui.h:45 +msgid "label" +msgstr "" + +#: ../src/yumex.ui.h:46 +msgid "Show available updates" +msgstr "" + +#: ../src/yumex.ui.h:47 +msgid "Updates" +msgstr "" + +#: ../src/yumex.ui.h:48 +msgid "Show installed packages" +msgstr "" + +#: ../src/yumex.ui.h:49 +msgid "Installed" +msgstr "" + +#: ../src/yumex.ui.h:50 +msgid "Show available packages" +msgstr "" + +#: ../src/yumex.ui.h:51 +msgid "Available" +msgstr "" + +#: ../src/yumex.ui.h:52 +msgid "Show all packages" +msgstr "" + +#: ../src/yumex.ui.h:53 +msgid "All" +msgstr "" + +#: ../src/yumex.ui.h:55 +msgid "Groups" +msgstr "" + +#: ../src/yumex.ui.h:56 +msgid "Undo" +msgstr "" + +#: ../src/yumex.ui.h:57 +msgid "History" +msgstr "" + +#: ../src/yumex.ui.h:58 +msgid "Pending Actions" +msgstr "" + +#: ../src/yumex.ui.h:59 +msgid "Package Description" +msgstr "" + +#: ../src/yumex.ui.h:60 +msgid "Package Update Information" +msgstr "" + +#: ../src/yumex.ui.h:61 +msgid "Package Filelist" +msgstr "" + +#: ../src/yumex.ui.h:62 +msgid "Package Requirements" +msgstr "" + +#: ../src/yumex.ui.h:63 +msgid "Search (show/hide)" +msgstr "" + +#: ../src/yumex.ui.h:64 +msgid "Apply pending actions" +msgstr "" + +#: ../src/yumex.ui.h:65 +msgid "Prefix" +msgstr "" + +#: ../src/yumex.ui.h:66 +msgid "Package names starting with search key" +msgstr "" + +#: ../src/yumex.ui.h:67 +msgid "Keyword" +msgstr "" + +#: ../src/yumex.ui.h:68 +msgid "Package names containing search key" +msgstr "" + +#: ../src/yumex.ui.h:69 +msgid "Fields" +msgstr "" + +#: ../src/yumex.ui.h:70 +msgid "Specified package fields containing search keys." +msgstr "" + +#: ../src/yumex.ui.h:72 +msgid "Package name" +msgstr "" + +#: ../src/yumex.ui.h:74 +msgid "Package summary" +msgstr "" + +#: ../src/yumex.ui.h:76 +msgid "Package description" +msgstr "" + +#: ../src/yumex.ui.h:77 +msgid "Package actions to perform" +msgstr "" + +#: ../src/yumex.ui.h:78 +msgid "Size:" +msgstr "" From 319905713c3593b4867d9092be5bcb2ef1fd5375 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 17 May 2021 15:39:17 +0200 Subject: [PATCH 094/133] Transfix push, yumex-dnf.pot update --- po/yumex-dnf.pot | 583 ++++++++++++++++++++++++++--------------------- 1 file changed, 322 insertions(+), 261 deletions(-) diff --git a/po/yumex-dnf.pot b/po/yumex-dnf.pot index 3f74bc3..4c6effe 100644 --- a/po/yumex-dnf.pot +++ b/po/yumex-dnf.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-02 18:49+0100\n" +"POT-Creation-Date: 2021-05-17 15:38+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,119 +16,130 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: ../src/yumex/__init__.py:112 ../src/yumex/old_init.py:137 +#: ../src/yumex/__init__.py:91 msgid "Refreshing Repository Metadata" msgstr "" -#: ../src/yumex/__init__.py:119 ../src/yumex/old_init.py:144 +#: ../src/yumex/__init__.py:98 msgid "Could not refresh the DNF cache (root)" msgstr "" -#: ../src/yumex/__init__.py:124 ../src/yumex/old_init.py:149 +#: ../src/yumex/__init__.py:120 msgid "" "DNF root backend was not authorized.\n" "Yum Extender will exit" msgstr "" -#: ../src/yumex/__init__.py:129 ../src/yumex/old_init.py:154 +#: ../src/yumex/__init__.py:125 msgid "" "DNF is locked by another process.\n" "\n" "Yum Extender will exit" msgstr "" -#: ../src/yumex/__init__.py:623 +#: ../src/yumex/__init__.py:523 +msgid "Downloading Repository Metadata" +msgstr "" + +#: ../src/yumex/__init__.py:653 msgid "Reloading package information..." msgstr "" -#: ../src/yumex/__init__.py:746 ../src/yumex/__init__.py:829 -#: ../src/yumex/old_init.py:266 ../src/yumex/old_init.py:1047 +#: ../src/yumex/__init__.py:776 ../src/yumex/__init__.py:863 msgid "Searching for dependencies" msgstr "" -#: ../src/yumex/__init__.py:748 ../src/yumex/__init__.py:831 -#: ../src/yumex/old_init.py:268 ../src/yumex/old_init.py:1049 +#: ../src/yumex/__init__.py:778 ../src/yumex/__init__.py:865 msgid "Dependencies resolved" msgstr "" #. Ok pressed -#: ../src/yumex/__init__.py:762 ../src/yumex/__init__.py:839 -#: ../src/yumex/dnf_backend.py:206 ../src/yumex/old_init.py:276 -#: ../src/yumex/old_init.py:1063 +#: ../src/yumex/__init__.py:792 ../src/yumex/__init__.py:873 +#: ../src/yumex/dnf_backend.py:204 msgid "Applying changes to the system" msgstr "" -#: ../src/yumex/__init__.py:787 ../src/yumex/old_init.py:1088 +#: ../src/yumex/__init__.py:817 msgid "Error checking package signatures\n" msgstr "" -#: ../src/yumex/__init__.py:793 ../src/yumex/old_init.py:1094 -msgid "Downloading error(s)\n" -msgstr "" +#: ../src/yumex/__init__.py:824 +msgid "Downloading error\n" +msgid_plural "Downloading errors\n" +msgstr[0] "" +msgstr[1] "" -#: ../src/yumex/__init__.py:799 ../src/yumex/old_init.py:1100 +#: ../src/yumex/__init__.py:832 msgid "Error in transaction\n" -msgstr "" +msgid_plural "Errors in transaction\n" +msgstr[0] "" +msgstr[1] "" -#: ../src/yumex/__init__.py:814 ../src/yumex/old_init.py:254 +#: ../src/yumex/__init__.py:848 #, python-format msgid "Installing package: %s" msgstr "" -#: ../src/yumex/__init__.py:815 +#: ../src/yumex/__init__.py:849 #, python-format msgid "%s was installed successfully" msgstr "" -#: ../src/yumex/__init__.py:820 ../src/yumex/old_init.py:259 +#: ../src/yumex/__init__.py:854 #, python-format msgid "Removing package: %s" msgstr "" -#: ../src/yumex/__init__.py:821 +#: ../src/yumex/__init__.py:855 #, python-format msgid "%s was removed successfully" msgstr "" -#: ../src/yumex/__init__.py:826 ../src/yumex/old_init.py:264 +#: ../src/yumex/__init__.py:860 msgid "Updating all available updates" msgstr "" -#: ../src/yumex/__init__.py:827 +#: ../src/yumex/__init__.py:861 msgid "Available updates was applied successfully" msgstr "" -#: ../src/yumex/__init__.py:846 ../src/yumex/__init__.py:896 -#: ../src/yumex/old_init.py:286 ../src/yumex/old_init.py:1149 -msgid "Error(s) in search for dependencies" -msgstr "" +#: ../src/yumex/__init__.py:881 ../src/yumex/__init__.py:935 +msgid "Error in search for dependencies" +msgid_plural "Errors in search for dependencies" +msgstr[0] "" +msgstr[1] "" -#: ../src/yumex/__init__.py:862 ../src/yumex/old_init.py:1115 +#: ../src/yumex/__init__.py:898 msgid "Preparing system for applying changes" msgstr "" -#: ../src/yumex/__init__.py:873 ../src/yumex/old_init.py:1126 -msgid "Can't remove protected package(s)" -msgstr "" +#: ../src/yumex/__init__.py:909 +msgid "Can't remove protected package:" +msgid_plural "Can't remove protected packages:" +msgstr[0] "" +msgstr[1] "" -#: ../src/yumex/__init__.py:887 ../src/yumex/old_init.py:1140 +#: ../src/yumex/__init__.py:924 msgid "No pending actions in queue" msgstr "" -#: ../src/yumex/__init__.py:891 ../src/yumex/old_init.py:1144 -msgid "Error(s) in building transaction" -msgstr "" +#: ../src/yumex/__init__.py:929 +msgid "Error in building transaction" +msgid_plural "Errors in building transaction" +msgstr[0] "" +msgstr[1] "" -#: ../src/yumex/__init__.py:1013 ../src/yumex/old_init.py:789 +#: ../src/yumex/__init__.py:1087 msgid "Adding packages to view" msgstr "" -#: ../src/yumex/__init__.py:1064 ../src/yumex/old_init.py:728 +#: ../src/yumex/__init__.py:1131 msgid "Error in undo history transaction" msgstr "" -#: ../src/yumex/dnf_backend.py:181 +#: ../src/yumex/dnf_backend.py:179 #, python-format msgid "" "dnfdaemon api version : %d\n" @@ -136,170 +147,163 @@ msgid "" "needed api version : %d" msgstr "" -#: ../src/yumex/dnf_backend.py:191 +#: ../src/yumex/dnf_backend.py:189 msgid "Downloading packages" msgstr "" -#: ../src/yumex/dnf_backend.py:197 +#: ../src/yumex/dnf_backend.py:195 msgid "Checking package signatures" msgstr "" -#: ../src/yumex/dnf_backend.py:210 +#: ../src/yumex/dnf_backend.py:208 msgid "Verify changes on the system" msgstr "" -#: ../src/yumex/dnf_backend.py:246 +#. Translators: %d will be replaced with the number of files +#. to download; %s will be replaced with the preformatted +#. number of bytes to download + the prefix (k, M, etc.) +#. Note that 'B' for 'bytes' is already here, it must be preserved. +#: ../src/yumex/dnf_backend.py:252 #, python-format -msgid "Downloading %d files (%sB)..." -msgstr "" +msgid "Downloading %d file (%sB)..." +msgid_plural "Downloading %d files (%sB)..." +msgstr[0] "" +msgstr[1] "" -#: ../src/yumex/const.py:129 +#: ../src/yumex/const.py:108 msgid "Getting installed packages" msgstr "" -#: ../src/yumex/const.py:130 +#: ../src/yumex/const.py:109 msgid "Getting available packages" msgstr "" -#: ../src/yumex/const.py:131 +#: ../src/yumex/const.py:110 msgid "Getting available updates" msgstr "" -#: ../src/yumex/const.py:132 +#: ../src/yumex/const.py:111 msgid "Getting all packages" msgstr "" -#: ../src/yumex/const.py:145 +#: ../src/yumex/const.py:124 msgid "Updated packages" msgstr "" -#: ../src/yumex/const.py:146 +#: ../src/yumex/const.py:125 msgid "Downgraded packages" msgstr "" -#: ../src/yumex/const.py:147 +#: ../src/yumex/const.py:126 msgid "Obsoleting packages" msgstr "" -#: ../src/yumex/const.py:148 +#: ../src/yumex/const.py:127 msgid "Obsoleted packages" msgstr "" -#: ../src/yumex/const.py:149 +#: ../src/yumex/const.py:128 msgid "Erased packages" msgstr "" -#: ../src/yumex/const.py:150 ../src/yumex/const.py:151 +#: ../src/yumex/const.py:129 ../src/yumex/const.py:130 msgid "Installed packages" msgstr "" -#: ../src/yumex/const.py:152 +#: ../src/yumex/const.py:131 msgid "Installed for dependencies" msgstr "" -#: ../src/yumex/const.py:153 +#: ../src/yumex/const.py:132 msgid "Reinstalled packages" msgstr "" -#: ../src/yumex/const.py:157 +#: ../src/yumex/const.py:136 msgid "Installing" msgstr "" -#: ../src/yumex/const.py:158 +#: ../src/yumex/const.py:137 msgid "Updating" msgstr "" -#: ../src/yumex/const.py:159 +#: ../src/yumex/const.py:138 msgid "Removing" msgstr "" -#: ../src/yumex/const.py:160 +#: ../src/yumex/const.py:139 msgid "Downgrading" msgstr "" -#: ../src/yumex/const.py:161 +#: ../src/yumex/const.py:140 msgid "Replacing" msgstr "" -#: ../src/yumex/const.py:165 +#: ../src/yumex/const.py:144 #, python-format msgid "Updating: %s" msgstr "" -#: ../src/yumex/const.py:166 +#: ../src/yumex/const.py:145 +#, python-format +msgid "Updated: %s" +msgstr "" + +#: ../src/yumex/const.py:146 #, python-format msgid "Installing: %s" msgstr "" -#: ../src/yumex/const.py:167 +#: ../src/yumex/const.py:147 #, python-format msgid "Reinstalling: %s" msgstr "" -#: ../src/yumex/const.py:168 +#: ../src/yumex/const.py:148 #, python-format msgid "Cleanup: %s" msgstr "" -#: ../src/yumex/const.py:169 +#: ../src/yumex/const.py:149 #, python-format msgid "Removing: %s" msgstr "" -#: ../src/yumex/const.py:170 +#: ../src/yumex/const.py:150 #, python-format msgid "Obsoleting: %s" msgstr "" -#: ../src/yumex/const.py:171 +#: ../src/yumex/const.py:151 #, python-format msgid "Downgrading: %s" msgstr "" -#: ../src/yumex/const.py:172 +#: ../src/yumex/const.py:152 #, python-format msgid "Verifying: %s" msgstr "" -#: ../src/yumex/const.py:182 +#: ../src/yumex/const.py:153 +#, python-format +msgid "Running scriptlet for: %s" +msgstr "" + +#: ../src/yumex/const.py:163 msgid "Bugfix" msgstr "" -#: ../src/yumex/const.py:183 +#: ../src/yumex/const.py:164 msgid "New Package" msgstr "" -#: ../src/yumex/const.py:184 +#: ../src/yumex/const.py:165 msgid "Security" msgstr "" -#: ../src/yumex/const.py:185 +#: ../src/yumex/const.py:166 msgid "Enhancement" msgstr "" -#: ../src/yumex/old_init.py:283 -msgid "Changes was successfully applied to the system" -msgstr "" - -#: ../src/yumex/old_init.py:1305 -msgid "" -"\n" -"\n" -"Yum Extender will close" -msgstr "" - -#: ../src/yumex/old_init.py:1307 -msgid "Error in starting notification icon" -msgstr "" - -#: ../src/yumex/old_init.py:1331 -msgid "Yum Extender will close" -msgstr "" - -#: ../src/yumex/old_init.py:1333 -msgid "Error in locking notification icon" -msgstr "" - #. timeout 10s #: ../src/yumex/updater.py:68 msgid "Not Now" @@ -309,111 +313,159 @@ msgstr "" msgid "Show Updates" msgstr "" -#: ../src/yumex/updater.py:165 +#: ../src/yumex/updater.py:160 msgid "New Updates" msgstr "" -#: ../src/yumex/updater.py:166 +#. Translators: %d is a number of available updates +#: ../src/yumex/updater.py:162 #, python-format -msgid "%s available updates" -msgstr "" +msgid "%d available update" +msgid_plural "%d available updates" +msgstr[0] "" +msgstr[1] "" -#: ../src/yumex/gui/views.py:256 +#: ../src/yumex/gui/views.py:254 msgid "Click to install all/remove all" msgstr "" -#: ../src/yumex/gui/views.py:261 +#: ../src/yumex/gui/views.py:260 msgid "Click to select/deselect all" msgstr "" -#: ../src/yumex/gui/views.py:273 +#: ../src/yumex/gui/views.py:272 msgid "Package" msgstr "" -#: ../src/yumex/gui/views.py:275 +#: ../src/yumex/gui/views.py:274 msgid "Ver." msgstr "" -#: ../src/yumex/gui/views.py:277 +#: ../src/yumex/gui/views.py:275 msgid "Arch." msgstr "" -#: ../src/yumex/gui/views.py:279 -msgid "click to filter archs" -msgstr "" - -#: ../src/yumex/gui/views.py:280 ../src/yumex/gui/views.py:769 -#: ../src/yumex.ui.h:73 +#: ../src/yumex/gui/views.py:276 ../src/yumex/gui/views.py:751 +#: ../src/yumex.ui.h:77 msgid "Summary" msgstr "" -#: ../src/yumex/gui/views.py:281 +#: ../src/yumex/gui/views.py:277 msgid "Repo." msgstr "" -#: ../src/yumex/gui/views.py:282 ../src/yumex/gui/dialogs.py:210 +#: ../src/yumex/gui/views.py:278 ../src/yumex/gui/dialogs.py:224 msgid "Size" msgstr "" -#: ../src/yumex/gui/views.py:321 +#: ../src/yumex/gui/views.py:327 msgid "Reinstall Package" msgstr "" -#: ../src/yumex/gui/views.py:336 +#: ../src/yumex/gui/views.py:342 msgid "Downgrade Package" msgstr "" -#: ../src/yumex/gui/views.py:764 ../src/yumex.ui.h:54 +#. The packages button in headerbar +#: ../src/yumex/gui/views.py:746 ../src/yumex.ui.h:53 msgid "Packages" msgstr "" -#: ../src/yumex/gui/views.py:894 +#: ../src/yumex/gui/views.py:804 +msgid "Package to update" +msgid_plural "Packages to update" +msgstr[0] "" +msgstr[1] "" + +#: ../src/yumex/gui/views.py:809 +msgid "Package to install" +msgid_plural "Packages to install" +msgstr[0] "" +msgstr[1] "" + +#: ../src/yumex/gui/views.py:814 +msgid "Package to remove" +msgid_plural "Packages to remove" +msgstr[0] "" +msgstr[1] "" + +#: ../src/yumex/gui/views.py:819 +msgid "Package to reinstall" +msgid_plural "Packages to reinstall" +msgstr[0] "" +msgstr[1] "" + +#: ../src/yumex/gui/views.py:824 +msgid "RPM file to install" +msgid_plural "RPM files to install" +msgstr[0] "" +msgstr[1] "" + +#: ../src/yumex/gui/views.py:829 +msgid "Group to install" +msgid_plural "Groups to install" +msgstr[0] "" +msgstr[1] "" + +#: ../src/yumex/gui/views.py:834 +msgid "Group to remove" +msgid_plural "Groups to remove" +msgstr[0] "" +msgstr[1] "" + +#: ../src/yumex/gui/views.py:854 +msgid "Package to downgrade" +msgid_plural "Packages to downgrade" +msgstr[0] "" +msgstr[1] "" + +#: ../src/yumex/gui/views.py:861 #, python-format msgid "Downgrade to %s " msgstr "" -#: ../src/yumex/gui/views.py:917 +#: ../src/yumex/gui/views.py:880 msgid "History (Date/Time)" msgstr "" -#: ../src/yumex/gui/views.py:994 +#: ../src/yumex/gui/views.py:957 msgid "History Packages" msgstr "" #. Setup reponame & repofile column's -#: ../src/yumex/gui/views.py:1082 ../src/yumex/gui/views.py:1129 -#: ../src/yumex/gui/dialogs.py:209 +#: ../src/yumex/gui/views.py:1037 ../src/yumex/gui/views.py:1084 +#: ../src/yumex/gui/dialogs.py:223 msgid "Repository" msgstr "" -#: ../src/yumex/gui/views.py:1082 +#: ../src/yumex/gui/views.py:1037 msgid "Filename" msgstr "" -#: ../src/yumex/gui/views.py:1113 +#: ../src/yumex/gui/views.py:1068 msgid "" "Click here to switch between\n" " none/all/default selected" msgstr "" -#: ../src/yumex/gui/views.py:1130 ../src/yumex/gui/dialogs.py:206 -#: ../src/yumex.ui.h:71 +#: ../src/yumex/gui/views.py:1085 ../src/yumex/gui/dialogs.py:220 +#: ../src/yumex.ui.h:75 msgid "Name" msgstr "" -#: ../src/yumex/gui/dialogs.py:207 +#: ../src/yumex/gui/dialogs.py:221 msgid "Arch" msgstr "" -#: ../src/yumex/gui/dialogs.py:208 +#: ../src/yumex/gui/dialogs.py:222 msgid "Ver" msgstr "" -#: ../src/yumex/gui/dialogs.py:251 +#: ../src/yumex/gui/dialogs.py:265 msgid "replacing {}" msgstr "" -#: ../src/yumex/gui/dialogs.py:287 +#: ../src/yumex/gui/dialogs.py:301 #, python-format msgid "" " Do you want to import this GPG key\n" @@ -424,93 +476,81 @@ msgid "" " From : %s" msgstr "" -#: ../src/yumex/gui/widgets.py:116 +#: ../src/yumex/gui/widgets.py:107 msgid "Getting Package Metadata" msgstr "" -#: ../src/yumex/gui/widgets.py:621 +#: ../src/yumex/gui/widgets.py:556 #, python-format msgid "Tags: %s\n" msgstr "" -#: ../src/yumex/gui/widgets.py:626 +#: ../src/yumex/gui/widgets.py:561 msgid "Links: " msgstr "" -#: ../src/yumex/gui/widgets.py:649 +#: ../src/yumex/gui/widgets.py:584 msgid "No update information is available" msgstr "" -#: ../src/yumex/gui/widgets.py:651 +#: ../src/yumex/gui/widgets.py:586 msgid "" "\n" "Fedora Updates:" msgstr "" -#: ../src/yumex/gui/widgets.py:661 +#: ../src/yumex/gui/widgets.py:596 msgid "Release" msgstr "" -#: ../src/yumex/gui/widgets.py:662 +#: ../src/yumex/gui/widgets.py:597 msgid "Type" msgstr "" #. head += ("%14s " % _("Status")) + ": %(status)s\n" -#: ../src/yumex/gui/widgets.py:665 +#: ../src/yumex/gui/widgets.py:600 msgid "Issued" msgstr "" -#: ../src/yumex/gui/widgets.py:702 ../src/yumex.ui.h:75 +#: ../src/yumex/gui/widgets.py:637 ../src/yumex.ui.h:79 msgid "Description" msgstr "" -#: ../src/yumex/gui/widgets.py:724 +#: ../src/yumex/gui/widgets.py:659 msgid "No changelog information is available" msgstr "" -#: ../src/yumex/gui/widgets.py:726 +#: ../src/yumex/gui/widgets.py:661 msgid "" "\n" "Online Changelog:" msgstr "" -#: ../src/yumex/gui/widgets.py:741 +#: ../src/yumex/gui/widgets.py:676 msgid "No filelist information is available" msgstr "" -#: ../src/yumex/gui/widgets.py:771 -msgid "Newest only" -msgstr "" - -#: ../src/yumex/gui/widgets.py:772 -msgid "Erase unused requirements" -msgstr "" - -#: ../src/yumex/gui/widgets.py:774 -msgid "Cleanup old instonly packages " -msgstr "" - -#: ../src/yumex/gui/widgets.py:776 -msgid "Options" -msgstr "" - -#: ../src/yumex/gui/widgets.py:778 +#: ../src/yumex/gui/widgets.py:706 msgid "About" msgstr "" -#: ../src/yumex/gui/widgets.py:779 +#: ../src/yumex/gui/widgets.py:707 msgid "Documentation" msgstr "" -#: ../src/yumex/gui/widgets.py:780 +#: ../src/yumex/gui/widgets.py:708 msgid "Help" msgstr "" -#: ../src/yumex/gui/widgets.py:782 ../src/yumex.ui.h:1 +#: ../src/yumex/gui/widgets.py:710 msgid "Preferences" msgstr "" -#: ../src/yumex/gui/widgets.py:783 +#: ../src/yumex/gui/widgets.py:711 +msgid "Refresh Metadata" +msgstr "" + +#: ../src/yumex/gui/widgets.py:712 msgid "Quit" msgstr "" @@ -583,195 +623,194 @@ msgstr "" msgid "Control what package repositories are enabled for the current session" msgstr "" -#: ../src/yumex.ui.h:2 +#: ../src/yumex.ui.h:1 msgid "OK" msgstr "" -#: ../src/yumex.ui.h:3 +#: ../src/yumex.ui.h:2 msgid "Cancel" msgstr "" -#: ../src/yumex.ui.h:4 +#: ../src/yumex.ui.h:3 msgid "" -"Show newest only is active when\n" -"Yum Extender starts.\n" -"Will show only latest version of available\n" -"packages" +"Use the toolbar in the header of the window\n" +"standard when using GNOME" +msgstr "" + +#: ../src/yumex.ui.h:5 +msgid "Show toolbar in window headerbar" +msgstr "" + +#: ../src/yumex.ui.h:6 +msgid "" +"The interval in hour, when the DNF cache will be expired and updated (0 = " +"disabled)" +msgstr "" + +#: ../src/yumex.ui.h:7 +msgid "Cache expire interval (hours)" msgstr "" #: ../src/yumex.ui.h:8 -msgid "Default: Show newest only" +msgid "12" msgstr "" #: ../src/yumex.ui.h:9 msgid "" -"Erase unused requirement option is\n" -"active when Yum Extender starts" +"Select all available updates when \n" +"Yum Extender is started" msgstr "" #: ../src/yumex.ui.h:11 -msgid "Default: Erase Unused Requirements" +msgid "Select updates at startup" msgstr "" #: ../src/yumex.ui.h:12 -msgid "" -"Change the close action for the main window, so it just hides the\n" -"window when the close button is clicked" +msgid "UI" msgstr "" -#: ../src/yumex.ui.h:14 -msgid "Close will only minimize window" +#: ../src/yumex.ui.h:13 +msgid "Autostart the Yum Extender update checker at user login" msgstr "" -#: ../src/yumex.ui.h:15 -msgid "" -"Use the toolbar in the header of the window\n" -"standard when using GNOME" +#: ../src/yumex.ui.h:14 +msgid "Start update checker at user login" msgstr "" -#: ../src/yumex.ui.h:17 -msgid "Show toolbar in window headerbar" +#: ../src/yumex.ui.h:15 +msgid "How often the update checker will run" msgstr "" -#: ../src/yumex.ui.h:18 -msgid "" -"Select all available updates when \n" -"Yum Extender is started" +#: ../src/yumex.ui.h:16 +msgid "Update check interval (minutes)" msgstr "" -#: ../src/yumex.ui.h:20 -msgid "Select updates at startup" +#: ../src/yumex.ui.h:17 +msgid "Update Checker" msgstr "" -#: ../src/yumex.ui.h:21 +#: ../src/yumex.ui.h:18 msgid "" -"The interval in hour, when the DNF cache will be expired and updated (0 = " -"disabled)" +"Show newest only is active when\n" +"Yum Extender starts.\n" +"Will show only latest version of available\n" +"packages" msgstr "" #: ../src/yumex.ui.h:22 -msgid "Cache expire interval (hours)" +msgid "Show newest only" msgstr "" #: ../src/yumex.ui.h:23 -msgid "12" -msgstr "" - -#: ../src/yumex.ui.h:24 -msgid "Default: Cleanup Old Installonly packages" +msgid "" +"Erase unused requirement option is\n" +"active when Yum Extender starts" msgstr "" #: ../src/yumex.ui.h:25 -msgid "Number of installonly packages to keep" +msgid "Erase Unused Requirements" msgstr "" #: ../src/yumex.ui.h:26 -msgid "3" +msgid "Cleanup Old Installonly packages" msgstr "" #: ../src/yumex.ui.h:27 -msgid "Settings" +msgid "Number of installonly packages to keep" msgstr "" #: ../src/yumex.ui.h:28 -msgid "Autostart the Yum Extender update checker at user login" +msgid "3" msgstr "" #: ../src/yumex.ui.h:29 -msgid "Start update checker at user login" +msgid "DNF Options" msgstr "" #: ../src/yumex.ui.h:30 -msgid "How often the update checker will run" +msgid "Color for installed packages" msgstr "" #: ../src/yumex.ui.h:31 -msgid "Update check interval (minutes)" +msgid "Color for available updates" msgstr "" #: ../src/yumex.ui.h:32 -msgid "Update Checker" +msgid "Color for available packages" msgstr "" #: ../src/yumex.ui.h:33 -msgid "Color for installed packages" +msgid "Color for obsoleted packages" msgstr "" #: ../src/yumex.ui.h:34 -msgid "Color for available updates" +msgid "Color for available downgrades" msgstr "" #: ../src/yumex.ui.h:35 -msgid "Color for available packages" +msgid "Colors" msgstr "" #: ../src/yumex.ui.h:36 -msgid "Color for obsoleted packages" +msgid "Repositories used in current session" msgstr "" #: ../src/yumex.ui.h:37 -msgid "Color for available downgrades" +msgid "" +"Save the current selected repositories\n" +"so they will be used next time you\n" +"start Yum Extender" msgstr "" -#: ../src/yumex.ui.h:38 -msgid "Advanced" +#: ../src/yumex.ui.h:40 +msgid "Save selected repositories" msgstr "" -#: ../src/yumex.ui.h:39 -msgid "Repositories used in current session" +#: ../src/yumex.ui.h:41 +msgid "Repositories" msgstr "" -#: ../src/yumex.ui.h:40 -msgid "" -"Save the current selected repositories\n" -"so they will be used next time you\n" -"start Yum Extender" +#: ../src/yumex.ui.h:42 +msgid "Errors" msgstr "" #: ../src/yumex.ui.h:43 -msgid "Save selected repositories" +msgid "More filtering options" msgstr "" #: ../src/yumex.ui.h:44 -msgid "Repositories" +msgid "Show available updates (Ctrl+1)" msgstr "" #: ../src/yumex.ui.h:45 -msgid "label" +msgid "Updates" msgstr "" #: ../src/yumex.ui.h:46 -msgid "Show available updates" +msgid "Show installed packages (Ctrl+2)" msgstr "" #: ../src/yumex.ui.h:47 -msgid "Updates" +msgid "Installed" msgstr "" #: ../src/yumex.ui.h:48 -msgid "Show installed packages" +msgid "Show available packages (Ctrl+3)" msgstr "" #: ../src/yumex.ui.h:49 -msgid "Installed" +msgid "Available" msgstr "" #: ../src/yumex.ui.h:50 -msgid "Show available packages" +msgid "Show all packages (Ctrl+4)" msgstr "" #: ../src/yumex.ui.h:51 -msgid "Available" -msgstr "" - -#: ../src/yumex.ui.h:52 -msgid "Show all packages" -msgstr "" - -#: ../src/yumex.ui.h:53 msgid "All" msgstr "" +#. The groups button in headerbar #: ../src/yumex.ui.h:55 msgid "Groups" msgstr "" @@ -780,78 +819,100 @@ msgstr "" msgid "Undo" msgstr "" -#: ../src/yumex.ui.h:57 +#. The history button in headerbar +#: ../src/yumex.ui.h:58 msgid "History" msgstr "" -#: ../src/yumex.ui.h:58 -msgid "Pending Actions" +#. The pending action queue button in headerbar +#: ../src/yumex.ui.h:60 +msgid "Queue" msgstr "" -#: ../src/yumex.ui.h:59 +#: ../src/yumex.ui.h:61 msgid "Package Description" msgstr "" -#: ../src/yumex.ui.h:60 +#: ../src/yumex.ui.h:62 msgid "Package Update Information" msgstr "" -#: ../src/yumex.ui.h:61 +#: ../src/yumex.ui.h:63 msgid "Package Filelist" msgstr "" -#: ../src/yumex.ui.h:62 +#: ../src/yumex.ui.h:64 msgid "Package Requirements" msgstr "" -#: ../src/yumex.ui.h:63 -msgid "Search (show/hide)" +#: ../src/yumex.ui.h:65 +msgid "Package Versions" msgstr "" -#: ../src/yumex.ui.h:64 -msgid "Apply pending actions" +#: ../src/yumex.ui.h:66 +msgid "Archs" msgstr "" -#: ../src/yumex.ui.h:65 +#: ../src/yumex.ui.h:67 +msgid "Newest Only" +msgstr "" + +#: ../src/yumex.ui.h:68 +msgid "Show only the latest package versions" +msgstr "" + +#: ../src/yumex.ui.h:69 msgid "Prefix" msgstr "" -#: ../src/yumex.ui.h:66 +#: ../src/yumex.ui.h:70 msgid "Package names starting with search key" msgstr "" -#: ../src/yumex.ui.h:67 +#: ../src/yumex.ui.h:71 msgid "Keyword" msgstr "" -#: ../src/yumex.ui.h:68 +#: ../src/yumex.ui.h:72 msgid "Package names containing search key" msgstr "" -#: ../src/yumex.ui.h:69 +#: ../src/yumex.ui.h:73 msgid "Fields" msgstr "" -#: ../src/yumex.ui.h:70 +#: ../src/yumex.ui.h:74 msgid "Specified package fields containing search keys." msgstr "" -#: ../src/yumex.ui.h:72 +#: ../src/yumex.ui.h:76 msgid "Package name" msgstr "" -#: ../src/yumex.ui.h:74 +#: ../src/yumex.ui.h:78 msgid "Package summary" msgstr "" -#: ../src/yumex.ui.h:76 +#: ../src/yumex.ui.h:80 msgid "Package description" msgstr "" -#: ../src/yumex.ui.h:77 +#: ../src/yumex.ui.h:81 +msgid "Remove Selected" +msgstr "" + +#: ../src/yumex.ui.h:82 +msgid "Search (show/hide)" +msgstr "" + +#: ../src/yumex.ui.h:83 +msgid "Apply pending actions" +msgstr "" + +#: ../src/yumex.ui.h:84 msgid "Package actions to perform" msgstr "" -#: ../src/yumex.ui.h:78 +#: ../src/yumex.ui.h:85 msgid "Size:" msgstr "" From a8aeab87db6a136d04272eb23c2df44eb0c85da5 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 17 May 2021 15:52:18 +0200 Subject: [PATCH 095/133] remove rpm transaction debug logging - Too noisy --- src/yumex/dnf_backend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 07400b4..8b98adb 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -222,7 +222,7 @@ def on_RPMProgress(self, package, action, te_current, name = yumex.misc.pkg_id_to_full_name(package) else: # this is just a pkg name (cleanup) name = package - logger.debug('on_RPMProgress : [%s]', package) + #logger.debug('on_RPMProgress : [%s]', package) action_msg = const.RPM_ACTIONS.get(action,None) if action_msg: self.frontend.infobar.info_sub( action_msg % name) @@ -268,7 +268,7 @@ def on_DownloadEnd(self, name, status, msg): logger.debug('Downloaded : %s', name) self._files_downloaded += 1 else: - logger.debug('Download Error : %s - %s', name, msg) + logger.debug('Download Error : %s - %s (status : %d )', name, msg, status) def on_RepoMetaDataProgress(self, name, frac): """Repository Metadata Download progress.""" From 2944c8b81b2390581af463b783860646a3c2c2c1 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 19 May 2021 15:43:28 +0200 Subject: [PATCH 096/133] Add support for using a yumex.css in conf dir for styling --- src/yumex/__init__.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 564fe4f..3568227 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -229,6 +229,18 @@ def on_delete_event(self, *args): else: self.app.quit() + def apply_css(self, css_fn): + """apply a css for custom styling""" + if css_fn: + screen = Gdk.Screen.get_default() + css_provider = Gtk.CssProvider() + css_provider.load_from_path(css_fn) + context = Gtk.StyleContext() + context.add_provider_for_screen(screen, css_provider, + Gtk.STYLE_PROVIDER_PRIORITY_USER) + logger.debug('loading custom styling : %s', css_fn) + + def load_custom_styling(self): """Load custom .css styling from current theme.""" css_fn = None @@ -242,13 +254,13 @@ def load_custom_styling(self): css_fn = fn break if css_fn: - screen = Gdk.Screen.get_default() - css_provider = Gtk.CssProvider() - css_provider.load_from_path(css_fn) - context = Gtk.StyleContext() - context.add_provider_for_screen(screen, css_provider, - Gtk.STYLE_PROVIDER_PRIORITY_USER) - logger.debug('loading custom styling : %s', css_fn) + self.apply_css(css_fn) + else: + css_fn = os.environ['HOME'] + "/.config/yumex-dnf/yumex.css" + logger.debug('looking for %s', css_fn) + if os.path.exists(css_fn): + self.apply_css(css_fn) + def on_window_state(self, widget, event): # save window current maximized state From b19a207dffb61fad9457ee6846af84ec52e7be29 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 19 May 2021 15:45:11 +0200 Subject: [PATCH 097/133] new default colors --- src/yumex/misc.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/yumex/misc.py b/src/yumex/misc.py index b769f30..ab8ab3a 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -266,11 +266,11 @@ class YumexConf(config.BaseConfig): debug = config.BoolOption(False) autostart = config.BoolOption(False) - color_install = config.Option('#3584e4') - color_update = config.Option('#e01b24') - color_downgrade = config.Option('#ff7800') - color_normal = config.Option('#000000') - color_obsolete = config.Option('#ff7800') + color_install = config.Option('#8BE8FD') + color_update = config.Option('#FF79C6') + color_downgrade = config.Option('#50FA7B') + color_normal = config.Option('#D3DAE3') + color_obsolete = config.Option('#FFB86C') history_days = config.IntOption(180) newest_only = config.BoolOption(True) From 8744e941ef99fd1e4f5c3e7f39feac6f60048d69 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 19 May 2021 16:04:08 +0200 Subject: [PATCH 098/133] remove deprecated properties in .ui, add style classes & names --- src/yumex.ui | 1140 +++++++++++++++++++++++++++----------------------- 1 file changed, 610 insertions(+), 530 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 68f69d8..4b56063 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -1,86 +1,51 @@ - + - + 10 900 - 10 - 10 + 10 + 10 2 10 - 1 - 1 + 1 + 1 240 - 1 - 10 + 1 + 10 5 10080 - 5 - 10 + 5 + 10 - False - dialog - - - True - False - - - - - - True - False - 6 - 6 - vertical - start - - - True - False - pref_stack - - - True - True - 0 - - - - - - - - pref_ok - pref_cancel - + False + dialog - False + False vertical 2 - False - 12 - 6 - 6 - end + False + 12 + 6 + 6 + end OK True - True - True + True + True False @@ -92,8 +57,8 @@ Cancel True - True - True + True + True False @@ -111,103 +76,104 @@ True - False - 6 + False + 6 + True - False - 6 - 10 - 6 - 6 - True + False + 6 + 10 + 6 + 6 + True True - False - Use the toolbar in the header of the window + False + Use the toolbar in the header of the window standard when using GNOME start Show toolbar in window headerbar - 0 - 1 + 0 + 1 2 True - True + True end start - 2 - 1 + 2 + 1 10 True - False - The interval in hour, when the DNF cache will be expired and updated (0 = disabled) + False + The interval in hour, when the DNF cache will be expired and updated (0 = disabled) start Cache expire interval (hours) end - 0 - 0 + 0 + 0 2 True - True - The interval in hour, when the DNF cache will be expired and updated (0 = disabled) + True + The interval in hour, when the DNF cache will be expired and updated (0 = disabled) end start 12 - number + number adj_refresh_interval - True + True True 12 - 2 - 0 + 2 + 0 True - False - Select all available updates when + False + Select all available updates when Yum Extender is started start Select updates at startup - 0 - 2 + 0 + 2 2 True - True + True end - 2 - 2 + 2 + 2 @@ -217,72 +183,82 @@ Yum Extender is started + True - False - 6 - 6 + False + 6 + 6 True - True + True end start - 2 - 0 + 2 + 0 True - False - Autostart the Yum Extender update checker at user login + False + Autostart the Yum Extender update checker at user login start True Start update checker at user login - 0 - 0 + 0 + 0 2 True - True + True end start - + 60 - number + number adj_update_interval - True + True True 60 - 2 - 1 + 2 + 1 True - False - How often the update checker will run + False + How often the update checker will run start True Update check interval (minutes) - 0 - 1 + 0 + 1 2 + + + + + + + + + pref_update @@ -291,15 +267,16 @@ Yum Extender is started + True - False - 6 - 6 + False + 6 + 6 - False - Show newest only is active when + False + Show newest only is active when Yum Extender starts. Will show only latest version of available packages @@ -308,102 +285,101 @@ packages Show newest only - 0 - 0 + 0 + 0 2 - True + True end start - 2 - 0 + 2 + 0 - False - Erase unused requirement option is + False + Erase unused requirement option is active when Yum Extender starts start True Erase Unused Requirements - 0 - 1 + 0 + 1 2 - True + True end start - 2 - 1 + 2 + 1 True - False + False start Cleanup Old Installonly packages - 0 - 2 + 0 + 2 2 True - True + True end - 2 - 2 + 2 + 2 True - False + False start - 25 - 25 + 25 Number of installonly packages to keep - 0 - 3 + 0 + 3 2 True - True - 0 + True + 0 3 - digits + digits adj_installonly_limit - 1 + 1 True 3 - 2 - 3 + 2 + 3 @@ -414,146 +390,147 @@ active when Yum Extender starts + True - False - 6 - 10 - 6 - 6 + False + 6 + 10 + 6 + 6 True - False + False start True Color for installed packages - 0 - 0 + 0 + 0 2 True - False + False start True Color for available updates - 0 - 1 + 0 + 1 2 True - False + False start True Color for available packages - 0 - 2 + 0 + 2 2 True - False + False start True Color for obsoleted packages - 0 - 3 + 0 + 3 2 True - False + False start True Color for available downgrades - 0 - 4 + 0 + 4 2 True - True - True + True + True end start - 2 - 0 + 2 + 0 True - True - True + True + True end start - 2 - 1 + 2 + 1 True - True - True + True + True end start - 2 - 2 + 2 + 2 True - True - True + True + True end start - 2 - 3 + 2 + 3 True - True - True + True + True end start - 2 - 4 + 2 + 4 @@ -566,19 +543,17 @@ active when Yum Extender starts True - False + False vertical True - False + False start - 10 - 10 - 10 - 10 - 6 - 6 + 10 + 10 + 6 + 6 Repositories used in current session @@ -592,16 +567,14 @@ active when Yum Extender starts - 400 + 400 True - True - 6 - 6 - 6 - 6 + True + 6 + 6 True - in - 400 + in + 400 @@ -615,24 +588,22 @@ active when Yum Extender starts True - False - Save the current selected repositories + False + Save the current selected repositories so they will be used next time you start Yum Extender - 10 - 10 - 10 - 10 - 5 - 5 + 10 + 10 + 5 + 5 Save selected repositories True - True - False + True + False start - True + True False @@ -670,33 +641,68 @@ start Yum Extender pref_ok pref_cancel + + + True + False + + + True + False + 6 + 6 + vertical + start + + + True + False + pref_stack + + + True + True + 0 + + + + + + + + + + + pref_ok + pref_cancel + + True - False + False - False - 5 + False + 5 Errors - center-on-parent - 600 - 260 - True - dialog - - - + center-on-parent + 600 + 260 + True + dialog - False + False vertical 2 - False - end + False + end @@ -704,8 +710,8 @@ start Yum Extender OK True - True - True + True + True False @@ -717,31 +723,31 @@ start Yum Extender False True - end + end 0 True - False + False vertical True - True - in + True + in - 350 + 350 True - True + True False - 5 - 5 - 5 - 5 - False + 5 + 5 + 5 + 5 + False error_buffer True @@ -765,24 +771,27 @@ start Yum Extender error_ok + True - False - True - + False + True + - + True - False + False @@ -794,7 +803,7 @@ start Yum Extender #3584e4 Normal Monospace - 0.90000000000000002 + 0.90 @@ -803,7 +812,7 @@ start Yum Extender #e01b24 Normal Monospace - 0.90000000000000002 + 0.90 @@ -812,7 +821,7 @@ start Yum Extender #e01b24 Normal Monospace - 0.90000000000000002 + 0.90 @@ -821,7 +830,7 @@ start Yum Extender #3584e4 Normal Monospace - 0.90000000000000002 + 0.90 @@ -830,7 +839,7 @@ start Yum Extender #3584e4 Normal Monospace - 0.90000000000000002 + 0.90 @@ -839,7 +848,7 @@ start Yum Extender #3584e4 Normal Monospace - 0.90000000000000002 + 0.90 @@ -848,7 +857,7 @@ start Yum Extender #3584e4 Normal Monospace - 0.90000000000000002 + 0.90 @@ -857,35 +866,36 @@ start Yum Extender #3584e4 Normal Monospace - 0.90000000000000002 + 0.90 - info_tags + info_tags True - False + False vertical True - False - none - True + False + none + True + infobar True - True - False - 5 - warning + True + False + 5 + warning - False + False 6 - end + end @@ -898,77 +908,81 @@ start Yum Extender - False + False + True - False + False True - 6 - 5 + 6 + 5 True - False + False start - 6 - 10 - 6 - 10 + 6 + 10 - 1 - 0 + 1 + 0 True - False - 10 - 10 - 10 - 10 + False + 10 + 10 True - 1 - 1 + 1 + 1 - False + False start - 20 - 10 - 20 - 10 + 20 + 10 - 1 - 2 + 1 + 2 True - False + False True - 0 - 0 + 0 + 0 3 + + + + + + + + + False @@ -988,6 +1002,9 @@ start Yum Extender + False @@ -998,20 +1015,24 @@ start Yum Extender True - True - False + True + False True - False + False - 500 + search_entry + 500 True - True - edit-find-symbolic - False - False + True + edit-find-symbolic + False + False + False @@ -1022,14 +1043,14 @@ start Yum Extender True - True - False - True + True + False + True True - False - preferences-other-symbolic + False + preferences-other-symbolic @@ -1042,7 +1063,7 @@ start Yum Extender True - False + False False @@ -1063,46 +1084,47 @@ start Yum Extender True - False + False True - True + True vertical 400 - True + True True - False - crossfade + False + crossfade True - False + False vertical True - False + False + package_sidebar True - False + False vertical True - False - icons + False + icons 2 True - False - More filtering options - True - view-list-symbolic + False + More filtering options + True + view-list-symbolic False @@ -1113,27 +1135,29 @@ start Yum Extender False False - end + end 0 - 120 + pkg_listbox + 100 True - False + False start + 5 True - True - Show available updates (Ctrl+1) - 6 - 6 + True + Show available updates (Ctrl+1) + 6 + 6 True - False + False start Updates @@ -1143,14 +1167,14 @@ start Yum Extender True - True - Show installed packages (Ctrl+2) - 6 - 6 + True + Show installed packages (Ctrl+2) + 6 + 6 True - False + False start Installed @@ -1160,14 +1184,14 @@ start Yum Extender True - True - Show available packages (Ctrl+3) - 6 - 6 + True + Show available packages (Ctrl+3) + 6 + 6 True - False + False start Available @@ -1177,23 +1201,20 @@ start Yum Extender True - True - Show all packages (Ctrl+4) - 6 - 6 + True + Show all packages (Ctrl+4) + 6 + 6 True - False + False start All - True @@ -1201,6 +1222,9 @@ start Yum Extender 1 + False @@ -1210,15 +1234,19 @@ start Yum Extender - 200 + pkg_view + 200 True - True + True True True - in + in + False @@ -1242,21 +1270,21 @@ start Yum Extender True - False + False vertical True - True + True 300 - True + True - 200 - 250 + 200 + 250 True - True - in + True + in @@ -1268,11 +1296,11 @@ start Yum Extender - 350 - 250 + 350 + 250 True - True - in + True + in @@ -1299,20 +1327,20 @@ start Yum Extender True - False + False vertical True - True + True 250 - 200 - 250 + 200 + 250 True - True - in + True + in @@ -1324,11 +1352,11 @@ start Yum Extender - 350 - 250 + 350 + 250 True - True - in + True + in @@ -1348,18 +1376,17 @@ start Yum Extender True - False + False end - 6 - 6 - 6 - 6 + 6 + 6 + 6 Undo True - True - True + True + True False @@ -1384,13 +1411,13 @@ start Yum Extender True - False + False vertical True - True - in + True + in @@ -1417,11 +1444,12 @@ start Yum Extender True - False + False + info_selector True - False + False start start False @@ -1429,42 +1457,43 @@ start Yum Extender vertical + info_list True - False + False start start - 32 - 32 + 32 + 32 True - True - Package Description + True + Package Description start start True - False - dialog-information-symbolic + False + dialog-information-symbolic - 32 - 32 + 32 + 32 True - True - Package Update Information + True + Package Update Information start start True - False - software-update-available-symbolic + False + software-update-available-symbolic 2 @@ -1472,18 +1501,18 @@ start Yum Extender - 32 - 32 + 32 + 32 True - True - Package Filelist + True + Package Filelist start start True - False - drive-multidisk-symbolic + False + drive-multidisk-symbolic 2 @@ -1491,26 +1520,23 @@ start Yum Extender - 32 - 32 + 32 + 32 True - True - Package Requirements + True + Package Requirements start start True - False - insert-object-symbolic + False + insert-object-symbolic 2 - False @@ -1528,21 +1554,22 @@ start Yum Extender True - True - in + True + in + info_text True - True + True False - word - 12 - 12 - 6 - 6 - False + word + 12 + 12 + 6 + 6 + False info_buffer - False + False True @@ -1553,6 +1580,9 @@ start Yum Extender 1 + False @@ -1573,15 +1603,20 @@ start Yum Extender 2 + + header_left True - False + False 24 + main_switcher True - False + False main_stack @@ -1590,48 +1625,52 @@ start Yum Extender 0 + - False - button_more_filters + False + button_more_filters + True - False - 6 - 12 + False + 6 + 12 True - False + False start <b>Package Versions</b> - True + True - 0 - 0 + 0 + 0 3 True - False + False start <b>Archs</b> - True + True - 0 - 3 + 0 + 3 3 True - False + False vertical @@ -1644,20 +1683,20 @@ start Yum Extender - 0 - 4 + 0 + 4 3 True - False + False vertical - 0 - 2 + 0 + 2 3 @@ -1665,15 +1704,15 @@ start Yum Extender Newest Only True - True - False - Show only the latest package versions + True + False + Show only the latest package versions start - True + True - 0 - 1 + 0 + 1 3 @@ -1681,133 +1720,171 @@ start Yum Extender - False - sch_options_button + False + sch_options_button bottom + True - False + False Prefix True - True - False - Package names starting with search key + True + False + Package names starting with search key True - True + True - 0 - 0 + 0 + 0 Keyword True - True - False - Package names containing search key - True + True + False + Package names containing search key + True sch_opt_prefix - 0 - 1 + 0 + 1 Fields True - True - False - Specified package fields containing search keys. - True + True + False + Specified package fields containing search keys. + True sch_opt_prefix - 0 - 2 + 0 + 2 Name True - True - False - Package name - 24 - True + True + False + Package name + 24 + True - 0 - 3 + 0 + 3 Summary True - True - False - Package summary - 24 - True + True + False + Package summary + 24 + True - 0 - 4 + 0 + 4 Description True - True - False - Package description - 24 - True + True + False + Package description + 24 + True - 0 - 5 + 0 + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True - False + False True - False + False Remove Selected + right_header True - False + False 6 True - True - True - Search (show/hide) + True + True + Search (show/hide) start True - False - edit-find-symbolic + False + edit-find-symbolic @@ -1820,14 +1897,14 @@ start Yum Extender True - True - True - Apply pending actions + True + True + Apply pending actions True - False - system-run-symbolic + False + system-run-symbolic @@ -1840,13 +1917,13 @@ start Yum Extender True - True - True + True + True True - False - open-menu-symbolic + False + open-menu-symbolic @@ -1856,34 +1933,34 @@ start Yum Extender 2 + - False - 5 + False + 5 Package actions to perform - center-on-parent - 600 - 260 - True - dialog - - - + center-on-parent + 600 + 260 + True + dialog - False + False vertical 2 - False - end + False + end Cancel True - True - True + True + True False @@ -1895,8 +1972,8 @@ start Yum Extender OK True - True - True + True + True False @@ -1908,27 +1985,27 @@ start Yum Extender False True - end + end 0 True - False + False vertical 5 True - True - in - 600 - 400 + True + in + 600 + 400 True - True + True @@ -1944,12 +2021,12 @@ start Yum Extender True - False + False 2 True - False + False Size: @@ -1962,7 +2039,7 @@ start Yum Extender True - False + False start @@ -1991,5 +2068,8 @@ start Yum Extender result_cancel result_ok + From 738c3b0e1cc6d265b4061f1c5b9ee5628c40e615 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Wed, 19 May 2021 16:04:58 +0200 Subject: [PATCH 099/133] Use a wide paned --- src/yumex/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 3568227..8328bf9 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -506,6 +506,7 @@ def _setup_gui(self): # Setup info self.main_paned = self.get_ui('main_paned') self.main_paned.set_position(CONFIG.conf.info_paned) + self.main_paned.set_wide_handle(True) # use wide separator bar (off) # Get the theme default TreeView text color color_normal = misc.get_style_color(self.package_view) From 6602360e9a4f2f1e5c6d3c873ae0f04bac7b3285 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Thu, 20 May 2021 16:39:33 +0200 Subject: [PATCH 100/133] Initial support for themes --- misc/themes/yumex.theme | 233 +++++++++++++++++++++++++++++++++++++++ src/yumex.ui | 172 +++++++++++++++++------------ src/yumex/__init__.py | 44 ++++++-- src/yumex/const.py | 2 + src/yumex/dnf_backend.py | 12 +- src/yumex/misc.py | 7 ++ 6 files changed, 380 insertions(+), 90 deletions(-) create mode 100644 misc/themes/yumex.theme diff --git a/misc/themes/yumex.theme b/misc/themes/yumex.theme new file mode 100644 index 0000000..79c0100 --- /dev/null +++ b/misc/themes/yumex.theme @@ -0,0 +1,233 @@ +/* +* Yum Extender styling (GTK3 CSS) +*/ + +/*Package Type Colors */ + +@define-color color_install #8BE8FD; +@define-color color_update #FF79C6; +@define-color color_downgrade #50FA7B; +@define-color color_normal #FFB86C; +@define-color color_obsolete #FFB86C; + +/* UI colors */ + +@define-color bg_color #21252b; +@define-color bg_color_02 #44475A; +@define-color bg_color_03 #6272A4; +@define-color bg_color_04 #282A36; +@define-color bg_color_05 #566388; +@define-color fg_color #F8F8F2; +@define-color fg_color_02 #FFB86C; +@define-color fg_color_03 #F1FA8C; +@define-color fg_color_04 #FF79C6; + +/* generic vindow & dialogs */ +window, dialog { + background: @bg_color; + color: @fg_color; + +} + +/* generic headerbar & buttons */ +headerbar { + background-color: @bg_color; + color: @fg_color; + +} + +/* generic treeview & textview */ +treeview, text { + background: @bg_color; + color: @fg_color; +} + +/* Generic button */ +button { + background: @bg_color; + color: @fg_color; +} + +button:hover { + color: @fg_color; + background: @bg_color_02; +} + + +/* Headerbar stack selector*/ + +#header_left stackswitcher button{ + background-color: @bg_color_02; + color: @fg_color; +} + +#header_left stackswitcher button:checked{ + background-color: @bg_color_03; + color: @fg_color_02; + font-weight: bold; +} + +#header_left stackswitcher button:hover { + background: @bg_color_03; +} + +#header_left *:selected { + background-color: @bg_color_02; + color: @fg_color_02; + border-style: none; +} + + +#header_right button { + background: @bg_color; + color: @fg_color; + border-style: none; +} + +#header_right button:hover { + background: @bg_color_02; + color: @fg_color; + border-style: none; +} + +/* Info view w. progressbar */ +.infobar box{ + background: @bg_color_04; +} + +.infobar label{ + color: @fg_color_03; +} + +/* separator between vies & info */ +paned separator{ + background: @bg_color_02; +} + +/* info type selector */ +#info_selector row { + color: @fg_color; + background: @bg_color; +} + +#info_selector row:hover { + color: @fg_color; + background: @bg_color_02; +} + +#info_selector row.activatable:selected { + color: @fg_color; + background: @bg_color_05; + border-left-style: solid; + border-left-width: 3; + border-left-color: @fg_color_04; +} + +/* Preferences Dialog */ +.preferences label{ + color: @fg_color_02; +} + +.preferences { + background: @bg_color_04; +} + +/* Package category selector */ +#package_sidebar toolbar{ + background: @bg_color; +} + +#package_sidebar list{ + background: @bg_color; + color: @fg_color_04; + font-style: italic; +} + +#package_sidebar row.activatable:selected { + color: @fg_color; + background: @bg_color_05; + border-left-style: solid; + border-left-width: 3; + border-left-color: @fg_color_04; +} + +#package_sidebar row.activatable:hover { + color: @fg_color; + background: @bg_color_02; +} + +/* Package View */ +#pkg_view { + background: @bg_color; + color: @fg_color; +} + +#pkg_view *:selected{ + background: @bg_color_05; + color: @fg_color; +} + +#pkg_view *:hover{ + background: @bg_color_02; + color: @fg_color; +} + +/* Package View Column Headers */ +#pkg_view button { + color: @fg_color; + background: @bg_color_04; + border-bottom-color: @bg_color_03; + border-bottom-width: 2px +} + +/* Package View Checkboxes */ +#pkg_view check { + background: @bg_color_02; + color: @fg_color_04; +} + +#pkg_view check:checked { + background: @bg_color_03; + color: @fg_color; + border-width: 0px; +} + +/* Search bar */ +.search { + color: @fg_color; + background: @bg_color; +} + +.search box{ + background: @bg_color_04; +} + +.search button{ + background: @bg_color_04; + border-width: 0px; +} + +.search button:hover { + color: @fg_color; + background: @bg_color_02; +} + +/* Popup Background (popover, tooltips) */ +.background popover,tooltip { + color: @fg_color; + background: @bg_color_04; +} + +/* Popup Menu Checkboxes & Radioboxes */ +.popup check, radio { + background: @bg_color_02; + color: @fg_color_04; +} + +/* Popup Menu Checkboxes & Radioboxes (Checked)*/ +.popup check:checked, radio:checked { + background: @bg_color_03; + color: @fg_color; + border-width: 0px; +} + diff --git a/src/yumex.ui b/src/yumex.ui index 4b56063..ae5ced1 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -877,11 +877,86 @@ start Yum Extender True False vertical + + + True + True + False + + + True + False + + + search_entry + 500 + True + True + edit-find-symbolic + False + False + + + + False + True + 0 + + + + + True + True + False + True + + + True + False + preferences-other-symbolic + + + + + False + True + 1 + + + + + True + False + + + False + True + 8 + 2 + + + + + + + + + False + True + 0 + + True False - none + 1000 True @@ -940,6 +1015,7 @@ start Yum Extender 10 10 True + True 1 @@ -1008,76 +1084,7 @@ start Yum Extender False - True - 0 - - - - - True - True - False - - - True - False - - - search_entry - 500 - True - True - edit-find-symbolic - False - False - - - - False - True - 0 - - - - - True - True - False - True - - - True - False - preferences-other-symbolic - - - - - False - True - 1 - - - - - True - False - - - False - True - 8 - 2 - - - - - - - False - True + False 1 @@ -1111,6 +1118,7 @@ start Yum Extender package_sidebar True False + 30 vertical @@ -1637,6 +1645,10 @@ start Yum Extender True False + 5 + 5 + 5 + 5 6 12 @@ -1716,8 +1728,14 @@ start Yum Extender 3 + + False @@ -1728,6 +1746,10 @@ start Yum Extender True False + 5 + 5 + 5 + 5 Prefix @@ -1854,8 +1876,14 @@ start Yum Extender + + True @@ -1869,7 +1897,7 @@ start Yum Extender - right_header + header_right True False 6 diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 8328bf9..bd08881 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -25,10 +25,11 @@ import shutil import subprocess import sys +import re from gi.repository import Gio, Gtk, Gdk -from yumex.misc import _, ngettext, CONFIG +from yumex.misc import Config, _, ngettext, CONFIG import yumex.const as const import yumex.misc as misc import yumex.dnf_backend @@ -240,11 +241,39 @@ def apply_css(self, css_fn): Gtk.STYLE_PROVIDER_PRIORITY_USER) logger.debug('loading custom styling : %s', css_fn) + def load_colors(self, theme_fn): + color_table = {} + colors = 'color_install', 'color_update', 'color_downgrade', 'color_normal', 'color_obsolete' + regex = re.compile(r'@define-color\s*(.*)\s(.*)\s?;') + with open(theme_fn, 'r') as reader: + lines = reader.readlines() + for line in lines: + if line.startswith("@define-color"): + match = regex.search(line) + if len(match.groups()) == 2: + color_table[match.group(1)] = match.group(2) + logger.debug(f'loaded {len(color_table)} colors from {theme_fn}') + for color in colors: + if color in color_table: + setattr(CONFIG.session,color,color_table[color]) + logger.debug(f' --> updated color : {color} to: {color_table[color]}') + + def load_theme(self): + theme_fn = os.path.join(const.THEME_DIR, CONFIG.conf.theme) + logger.debug('looking for %s', theme_fn) + if os.path.exists(theme_fn): + self.apply_css(theme_fn) + self.load_colors(theme_fn) + def load_custom_styling(self): """Load custom .css styling from current theme.""" + # Use Dark Theme always + gtk_settings = Gtk.Settings.get_default() + gtk_settings.set_property("gtk-application-prefer-dark-theme",True) css_fn = None - theme = Gtk.Settings.get_default().props.gtk_theme_name + theme = gtk_settings.props.gtk_theme_name + logger.debug(f'current theme : {theme}') css_postfix = '%s/apps/yumex.css' % theme for css_prefix in [os.path.expanduser('~/.themes'), '/usr/share/themes']: @@ -256,11 +285,7 @@ def load_custom_styling(self): if css_fn: self.apply_css(css_fn) else: - css_fn = os.environ['HOME'] + "/.config/yumex-dnf/yumex.css" - logger.debug('looking for %s', css_fn) - if os.path.exists(css_fn): - self.apply_css(css_fn) - + self.load_theme() def on_window_state(self, widget, event): # save window current maximized state @@ -508,11 +533,6 @@ def _setup_gui(self): self.main_paned.set_position(CONFIG.conf.info_paned) self.main_paned.set_wide_handle(True) # use wide separator bar (off) - # Get the theme default TreeView text color - color_normal = misc.get_style_color(self.package_view) - CONFIG.conf.color_normal = misc.color_to_hex(color_normal) - logger.debug('theme color : %s' % misc.color_to_hex(color_normal)) - # infobar self.infobar = widgets.InfoProgressBar(self.ui) self.infobar.hide() diff --git a/src/yumex/const.py b/src/yumex/const.py index cc74261..1db2183 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -37,10 +37,12 @@ DATA_DIR = '/usr/share/yumex-dnf' PIX_DIR = DATA_DIR + "/gfx" MISC_DIR = DATA_DIR + THEME_DIR = DATA_DIR + "/themes" else: DATA_DIR = BIN_PATH PIX_DIR = DATA_DIR + "/../gfx" MISC_DIR = DATA_DIR + "/../misc" + THEME_DIR = DATA_DIR + "/../misc/themes" HOME_DIR = os.environ['HOME'] AUTOSTART_DIR = HOME_DIR + '/.config/autostart' diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 8b98adb..2d18f40 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -127,15 +127,15 @@ def pkgtags(self): @property def color(self): """Package color to show in package view.""" - color = CONFIG.conf.color_normal + color = CONFIG.session.color_normal if self.action == 'u': - color = CONFIG.conf.color_update + color = CONFIG.session.color_update elif self.action == 'o': - color = CONFIG.conf.color_obsolete + color = CONFIG.session.color_obsolete elif self.action == 'do': - color = CONFIG.conf.color_downgrade + color = CONFIG.session.color_downgrade elif self.action == 'r': - color = CONFIG.conf.color_install + color = CONFIG.session.color_install rgba = Gdk.RGBA() rgba.parse(color) return rgba @@ -222,7 +222,7 @@ def on_RPMProgress(self, package, action, te_current, name = yumex.misc.pkg_id_to_full_name(package) else: # this is just a pkg name (cleanup) name = package - #logger.debug('on_RPMProgress : [%s]', package) + # logger.debug('on_RPMProgress : [%s]', package) action_msg = const.RPM_ACTIONS.get(action,None) if action_msg: self.frontend.infobar.info_sub( action_msg % name) diff --git a/src/yumex/misc.py b/src/yumex/misc.py index ab8ab3a..36faa0b 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -266,6 +266,8 @@ class YumexConf(config.BaseConfig): debug = config.BoolOption(False) autostart = config.BoolOption(False) + theme = config.Option("yumex.theme") + color_install = config.Option('#8BE8FD') color_update = config.Option('#FF79C6') color_downgrade = config.Option('#50FA7B') @@ -309,6 +311,11 @@ class SessionConf(config.BaseConfig): # enabled repositories for this session enabled_repos = config.ListOption([]) clean_instonly = config.BoolOption(False) + color_install = config.Option('#ffffff') + color_update = config.Option('#ffffff') + color_downgrade = config.Option('#ffffff') + color_normal = config.Option('#ffffff') + color_obsolete = config.Option('#ffffff') class Config(object): From 164dee9fda0946752e761014f5937fa2323133b1 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Thu, 20 May 2021 16:44:13 +0200 Subject: [PATCH 101/133] update Makeffile to install themes --- misc/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/misc/Makefile b/misc/Makefile index cd1fd3b..8272f77 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -17,10 +17,12 @@ build: clean install: build install -d $(DESTDIR)$(DATADIR)/applications install -d $(DESTDIR)$(DATADIR)/$(APPNAME) + install -d $(DESTDIR)$(DATADIR)/$(APPNAME)/themes install -d $(DESTDIR)$(DATADIR)/appdata install -m644 $(APPNAME).desktop $(DESTDIR)$(DATADIR)/applications/. install -m644 $(APPNAME)-local.desktop $(DESTDIR)$(DATADIR)/applications/. install -m644 $(APPNAME)-updater.desktop $(DESTDIR)$(DATADIR)/$(APPNAME)/. install -m644 $(APPNAME).appdata.xml $(DESTDIR)$(DATADIR)/appdata/. + install -m644 themes/* $(DESTDIR)$(DATADIR)/$(APPNAME)/themes/. .PHONY: all install clean build From f69c2e5ae92463134c1d9720bf212af58799bdfc Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 21 May 2021 19:54:31 +0200 Subject: [PATCH 102/133] Added new themes and support for selecting themes in preferences. --- misc/themes/{yumex.theme => Dracula.theme} | 85 ++++---- misc/themes/One-Dark.theme | 231 +++++++++++++++++++++ src/yumex.ui | 29 ++- src/yumex/gui/dialogs.py | 29 +++ src/yumex/misc.py | 2 +- 5 files changed, 330 insertions(+), 46 deletions(-) rename misc/themes/{yumex.theme => Dracula.theme} (69%) create mode 100644 misc/themes/One-Dark.theme diff --git a/misc/themes/yumex.theme b/misc/themes/Dracula.theme similarity index 69% rename from misc/themes/yumex.theme rename to misc/themes/Dracula.theme index 79c0100..6a1e6d1 100644 --- a/misc/themes/yumex.theme +++ b/misc/themes/Dracula.theme @@ -12,11 +12,11 @@ /* UI colors */ -@define-color bg_color #21252b; -@define-color bg_color_02 #44475A; -@define-color bg_color_03 #6272A4; -@define-color bg_color_04 #282A36; -@define-color bg_color_05 #566388; +@define-color bg_shade_01 #21252b; +@define-color bg_shade_02 #282A36; +@define-color bg_shade_03 #44475A; +@define-color bg_shade_04 #566388; +@define-color bg_shade_05 #6272A4; @define-color fg_color #F8F8F2; @define-color fg_color_02 #FFB86C; @define-color fg_color_03 #F1FA8C; @@ -24,75 +24,75 @@ /* generic vindow & dialogs */ window, dialog { - background: @bg_color; + background: @bg_shade_01; color: @fg_color; } /* generic headerbar & buttons */ headerbar { - background-color: @bg_color; + background-color: @bg_shade_01; color: @fg_color; } /* generic treeview & textview */ treeview, text { - background: @bg_color; + background: @bg_shade_01; color: @fg_color; } /* Generic button */ button { - background: @bg_color; + background: @bg_shade_01; color: @fg_color; } button:hover { color: @fg_color; - background: @bg_color_02; + background: @bg_shade_03; } /* Headerbar stack selector*/ #header_left stackswitcher button{ - background-color: @bg_color_02; + background-color: @bg_shade_03; color: @fg_color; } #header_left stackswitcher button:checked{ - background-color: @bg_color_03; + background-color: @bg_shade_05; color: @fg_color_02; font-weight: bold; } #header_left stackswitcher button:hover { - background: @bg_color_03; + background: @bg_shade_05; } #header_left *:selected { - background-color: @bg_color_02; + background-color: @bg_shade_03; color: @fg_color_02; border-style: none; } #header_right button { - background: @bg_color; + background: @bg_shade_01; color: @fg_color; border-style: none; } #header_right button:hover { - background: @bg_color_02; + background: @bg_shade_03; color: @fg_color; border-style: none; } /* Info view w. progressbar */ .infobar box{ - background: @bg_color_04; + background: @bg_shade_02; } .infobar label{ @@ -101,25 +101,24 @@ button:hover { /* separator between vies & info */ paned separator{ - background: @bg_color_02; + background: @bg_shade_03; } /* info type selector */ #info_selector row { - color: @fg_color; - background: @bg_color; + color: @bg_shade_05; + background: @bg_shade_01; } #info_selector row:hover { color: @fg_color; - background: @bg_color_02; } #info_selector row.activatable:selected { color: @fg_color; - background: @bg_color_05; + background: @bg_shade_02; border-left-style: solid; - border-left-width: 3; + border-left-width: 3px; border-left-color: @fg_color_04; } @@ -129,65 +128,65 @@ paned separator{ } .preferences { - background: @bg_color_04; + background: @bg_shade_02; } /* Package category selector */ #package_sidebar toolbar{ - background: @bg_color; + background: @bg_shade_01; } #package_sidebar list{ - background: @bg_color; + background: @bg_shade_01; color: @fg_color_04; font-style: italic; } #package_sidebar row.activatable:selected { color: @fg_color; - background: @bg_color_05; + background: @bg_shade_04; border-left-style: solid; - border-left-width: 3; + border-left-width: 3px; border-left-color: @fg_color_04; } #package_sidebar row.activatable:hover { color: @fg_color; - background: @bg_color_02; + background: @bg_shade_03; } /* Package View */ #pkg_view { - background: @bg_color; + background: @bg_shade_01; color: @fg_color; } #pkg_view *:selected{ - background: @bg_color_05; + background: @bg_shade_04; color: @fg_color; } #pkg_view *:hover{ - background: @bg_color_02; + background: @bg_shade_03; color: @fg_color; } /* Package View Column Headers */ #pkg_view button { color: @fg_color; - background: @bg_color_04; - border-bottom-color: @bg_color_03; + background: @bg_shade_02; + border-bottom-color: @bg_shade_05; border-bottom-width: 2px } /* Package View Checkboxes */ #pkg_view check { - background: @bg_color_02; + background: @bg_shade_03; color: @fg_color_04; } #pkg_view check:checked { - background: @bg_color_03; + background: @bg_shade_05; color: @fg_color; border-width: 0px; } @@ -195,38 +194,38 @@ paned separator{ /* Search bar */ .search { color: @fg_color; - background: @bg_color; + background: @bg_shade_01; } .search box{ - background: @bg_color_04; + background: @bg_shade_02; } .search button{ - background: @bg_color_04; + background: @bg_shade_02; border-width: 0px; } .search button:hover { color: @fg_color; - background: @bg_color_02; + background: @bg_shade_03; } /* Popup Background (popover, tooltips) */ .background popover,tooltip { color: @fg_color; - background: @bg_color_04; + background: @bg_shade_02; } /* Popup Menu Checkboxes & Radioboxes */ .popup check, radio { - background: @bg_color_02; + background: @bg_shade_03; color: @fg_color_04; } /* Popup Menu Checkboxes & Radioboxes (Checked)*/ .popup check:checked, radio:checked { - background: @bg_color_03; + background: @bg_shade_05; color: @fg_color; border-width: 0px; } diff --git a/misc/themes/One-Dark.theme b/misc/themes/One-Dark.theme new file mode 100644 index 0000000..67ad79a --- /dev/null +++ b/misc/themes/One-Dark.theme @@ -0,0 +1,231 @@ +/* +* Yum Extender styling (GTK3 CSS) +* Based on the One-Dark theme +*/ + +/*Package Type Colors */ + +@define-color color_install #56b6c2; +@define-color color_update #e06c75; +@define-color color_downgrade #98c379; +@define-color color_normal #d19a66; +@define-color color_obsolete #e06c75; + +/* UI colors */ + +@define-color bg_shade_01 #282c34; +@define-color bg_shade_02 #323842; +@define-color bg_shade_03 #404859; +@define-color bg_shade_04 #5c6370; +@define-color fg_color #abb2bf; +@define-color fg_color_02 #d19a66; +@define-color fg_color_03 #e6c07b; +@define-color fg_color_04 #98c379; + +/* generic vindow & dialogs */ +window, dialog { + background: @bg_shade_01; + color: @fg_color; + +} + +/* generic headerbar & buttons */ +headerbar { + background-color: @bg_shade_01; + color: @fg_color; + +} + +/* generic treeview & textview */ +treeview, text { + background: @bg_shade_01; + color: @fg_color; +} + +/* Generic button */ +button { + background: @bg_shade_01; + color: @fg_color; +} + +button:hover { + color: @fg_color; + background: @bg_shade_02; +} + + +/* Headerbar stack selector*/ + +#header_left stackswitcher button{ + background-color: @bg_shade_02; + color: @fg_color; +} + +#header_left stackswitcher button:checked{ + background-color: @bg_shade_03; + color: @fg_color_02; + font-weight: bold; +} + +#header_left stackswitcher button:hover { + background: @bg_shade_03; +} + +#header_left *:selected { + background-color: @bg_shade_02; + color: @fg_color_02; + border-style: none; +} + + +#header_right button { + background: @bg_shade_01; + color: @fg_color; + border-style: none; +} + +#header_right button:hover { + background: @bg_shade_02; + color: @fg_color; + border-style: none; +} + +/* Info view w. progressbar */ +.infobar box{ + background: @bg_shade_04; +} + +.infobar label{ + color: @fg_color_03; +} + +/* separator between vies & info */ +paned separator{ + background: @bg_shade_02; +} + +/* info type selector */ +#info_selector row { + color: @bg_shade_03; + background: @bg_shade_01; +} + +#info_selector row:hover { + color: @fg_color; +} + +#info_selector row.activatable:selected { + color: @fg_color; + border-left-style: solid; + border-left-width: 3; + border-left-color: @fg_color; +} + +/* Preferences Dialog */ +.preferences label{ + color: @fg_color_02; +} + +.preferences { + background: @bg_shade_04; +} + +/* Package category selector */ +#package_sidebar toolbar{ + background: @bg_shade_01; +} + +#package_sidebar list{ + background: @bg_shade_01; + color: @fg_color_04; + font-style: italic; +} + +#package_sidebar row.activatable:selected { + color: @fg_color; + background: @bg_shade_03; + border-left-style: solid; + border-left-width: 3; + border-left-color: @fg_color_04; +} + +#package_sidebar row.activatable:hover { + color: @fg_color; + background: @bg_shade_02; +} + +/* Package View */ +#pkg_view { + background: @bg_shade_01; + color: @fg_color; +} + +#pkg_view *:selected{ + background: @bg_shade_03; + color: @fg_color; +} + +#pkg_view *:hover{ + background: @bg_shade_02; + color: @fg_color; +} + +/* Package View Column Headers */ +#pkg_view button { + color: @fg_color; + background: @bg_shade_03; + border-bottom-color: @bg_shade_03; + border-bottom-width: 2px +} + +/* Package View Checkboxes */ +#pkg_view check { + background: @bg_shade_02; + color: @fg_color_04; +} + +#pkg_view check:checked { + background: @bg_shade_03; + color: @fg_color; + border-width: 0px; +} + +/* Search bar */ +.search { + color: @fg_color; + background: @bg_shade_01; +} + +.search box{ + background: @bg_shade_04; +} + +.search button{ + background: @bg_shade_04; + border-width: 0px; +} + +.search button:hover { + color: @fg_color; + background: @bg_shade_02; +} + +/* Popup Background (popover, tooltips) */ +.background popover,tooltip { + color: @fg_color; + background: @bg_shade_04; +} + +/* Popup Menu Checkboxes & Radioboxes */ +.popup check, radio { + background: @bg_shade_02; + color: @fg_color_04; +} + +/* Popup Menu Checkboxes & Radioboxes (Checked)*/ +.popup check:checked, radio:checked { + background: @bg_shade_03; + color: @fg_color; + border-width: 0px; +} + diff --git a/src/yumex.ui b/src/yumex.ui index ae5ced1..3bfc51c 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -78,6 +78,7 @@ True False 6 + slide-right @@ -390,7 +391,7 @@ active when Yum Extender starts - + True False @@ -533,10 +534,34 @@ active when Yum Extender starts 4 + + + True + False + start + start + Theme + + + 0 + 5 + 2 + + + + + True + False + + + 2 + 5 + + pref_colors - Colors + Theme 3 diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index bba451b..5b60ad2 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -22,6 +22,7 @@ import logging import os import shutil +import glob from gi.repository import Gtk from gi.repository import GObject @@ -76,6 +77,23 @@ def run(self): need_reset = self.set_settings() return need_reset + def get_themes(self): + # Get Themes + pattern = os.path.normpath(os.path.join(const.THEME_DIR, '*.theme')) + theme_files = glob.glob(pattern) + theme_names = [os.path.basename(theme).split('.')[0] for theme in theme_files] + widget = self.base.ui.get_object('pref_theme') + widget.remove_all() + default = CONFIG.conf.theme.split(".")[0] + i = 0 + ndx = 0 + for theme in sorted(theme_names): + widget.append_text(theme) + if theme == default: + ndx=i + i += 1 + widget.set_active(ndx) + def get_settings(self): # set boolean states for option in Preferences.FLAGS: @@ -100,6 +118,9 @@ def get_settings(self): self.repo_view.populate(self.repos) if CONFIG.conf.repo_saved: self.repo_view.select_by_keys(CONFIG.session.enabled_repos) + # Get Themes + self.get_themes() + def on_clean_instonly(self, *args): '''Handler for clean_instonly switch''' @@ -153,6 +174,14 @@ def set_settings(self): if CONFIG.conf.repo_saved: CONFIG.conf.repo_enabled = repo_now changed = True + # Themes + widget = self.base.ui.get_object('pref_theme') + default = CONFIG.conf.theme.split(".")[0] + theme = widget.get_active_text() + if theme != default: + CONFIG.conf.theme = f'{theme}.theme' + self.base.load_custom_styling() + changed = True if changed: CONFIG.write() return need_reset diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 36faa0b..754bb6d 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -266,7 +266,7 @@ class YumexConf(config.BaseConfig): debug = config.BoolOption(False) autostart = config.BoolOption(False) - theme = config.Option("yumex.theme") + theme = config.Option("Dracula.theme") color_install = config.Option('#8BE8FD') color_update = config.Option('#FF79C6') From 8d67edc94db27253ba8420c2df0e1d9d1c990506 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sat, 22 May 2021 09:23:16 +0200 Subject: [PATCH 103/133] * Added System (light + dark) there only set pkg list colors. * Add Material-Green Theme * Added support for macro colors in themes --- misc/themes/Material-Green.theme | 223 +++++++++++++++++++++++++++++++ misc/themes/System-Dark.theme | 33 +++++ misc/themes/System-Light.theme | 37 +++++ src/yumex/__init__.py | 23 +++- src/yumex/misc.py | 4 +- 5 files changed, 313 insertions(+), 7 deletions(-) create mode 100644 misc/themes/Material-Green.theme create mode 100644 misc/themes/System-Dark.theme create mode 100644 misc/themes/System-Light.theme diff --git a/misc/themes/Material-Green.theme b/misc/themes/Material-Green.theme new file mode 100644 index 0000000..748e001 --- /dev/null +++ b/misc/themes/Material-Green.theme @@ -0,0 +1,223 @@ +/* +* Yum Extender styling (GTK3 CSS) +* Based on the One-Dark theme +*/ + +/*Package Type Colors */ + +@define-color color_install #7cc6bf; +@define-color color_update #1c6b9f; +@define-color color_downgrade #98c379; +@define-color color_normal #ff4c98; +@define-color color_obsolete #299f1c; + +/* UI colors */ + +@define-color bg_shade_01 #010807; +@define-color bg_shade_02 #005d26; +@define-color bg_shade_03 #027c3a; +@define-color bg_shade_04 #1c9f50; +@define-color fg_color #e6f5ea; +@define-color fg_color_02 #9f1c6b; +@define-color fg_color_03 #299f1c; +@define-color fg_color_04 #1c9f92; + +/* generic vindow & dialogs */ +window, dialog { + background: @bg_shade_01; + color: @fg_color; + +} + +/* generic headerbar & buttons */ +headerbar { + background-color: @bg_shade_01; + color: @fg_color; + +} + +/* generic treeview & textview */ +treeview, text { + background: @bg_shade_01; + color: @fg_color; +} + +/* Generic button */ +button { + background: @bg_shade_01; + color: @fg_color; +} + +button:hover { + color: @fg_color; + background: @bg_shade_02; +} + + +/* Headerbar stack selector*/ + +#header_left stackswitcher button{ + background-color: @bg_shade_02; + color: @fg_color; +} + +#header_left stackswitcher button:checked{ + background-color: @bg_shade_03; + color: @fg_color_04; + font-weight: bold; +} + +#header_left stackswitcher button:hover { + background: @bg_shade_03; +} + +#header_right button { + color: @fg_color; + border-style: none; +} + +#header_right button:hover { + background: @bg_shade_02; + color: @fg_color; + border-style: none; +} + +/* Info view w. progressbar */ +.infobar box{ + background: @bg_shade_01; +} + +.infobar label{ + color: @fg_color_03; +} + +/* separator between vies & info */ +paned separator{ + background: @bg_shade_02; +} + +/* info type selector */ +#info_selector row { + color: @bg_shade_03; + background: @bg_shade_01; +} + +#info_selector row:hover { + color: @fg_color; +} + +#info_selector row.activatable:selected { + color: @fg_color; + border-left-style: solid; + border-left-width: 3; + border-left-color: @fg_color_02; +} + +/* Preferences Dialog */ +.preferences label{ + color: @fg_color_02; +} + +.preferences { + background: @bg_shade_04; +} + +/* Package category selector */ +#package_sidebar toolbar{ + background: @bg_shade_01; +} + +#package_sidebar list{ + background: @bg_shade_01; + color: @fg_color_04; + font-style: italic; +} + +#package_sidebar row.activatable:selected { + color: @fg_color; + background: @bg_shade_03; + border-left-style: solid; + border-left-width: 3; + border-left-color: @fg_color_02; +} + +#package_sidebar row.activatable:hover { + color: @fg_color; + background: @bg_shade_02; +} + +/* Package View */ +#pkg_view { + background: @bg_shade_01; + color: @fg_color; +} + +#pkg_view *:selected{ + background: @bg_shade_03; + color: @fg_color; +} + +#pkg_view *:hover{ + background: @bg_shade_02; + color: @fg_color; +} + +/* Package View Column Headers */ +#pkg_view button { + color: @fg_color; + background: @bg_shade_03; + border-bottom-color: @bg_shade_03; + border-bottom-width: 2px +} + +/* Package View Checkboxes */ +#pkg_view check { + background: @bg_shade_02; + color: @fg_color_04; +} + +#pkg_view check:checked { + background: @bg_shade_03; + color: @fg_color; + border-width: 0px; +} + +/* Search bar */ +.search { + color: @fg_color; + background: @bg_shade_01; +} + +.search box{ + background: @bg_shade_04; +} + +.search button{ + background: @bg_shade_04; + border-width: 0px; +} + +.search button:hover { + color: @fg_color; + background: @bg_shade_02; +} + +/* Popup Background (popover, tooltips) */ +.background popover,tooltip { + color: @fg_color; + background: @bg_shade_04; +} + +/* Popup Menu Checkboxes & Radioboxes */ +.popup check, radio { + background: @bg_shade_02; + color: @fg_color_04; +} + +/* Popup Menu Checkboxes & Radioboxes (Checked)*/ +.popup check:checked, radio:checked { + background: @bg_shade_03; + color: @fg_color; + border-width: 0px; +} + diff --git a/misc/themes/System-Dark.theme b/misc/themes/System-Dark.theme new file mode 100644 index 0000000..8ea1826 --- /dev/null +++ b/misc/themes/System-Dark.theme @@ -0,0 +1,33 @@ +/* +* Yum Extender styling (GTK3 CSS) +*/ + +/* Material Design Colors for light Background */ + +@define-color Material_Red #EF9A9A; +@define-color Material_Pink #F48FB1; +@define-color Material_Purple #CE93D8; +@define-color Material_DeepPurple #B39DDB; +@define-color Material_Indigo #9FA8DA; +@define-color Material_Blue #90CAF9; +@define-color Material_LightBlue #81D4FA; +@define-color Material_Cyan #80DEEA; +@define-color Material_Teal #80CBC4; +@define-color Material_Green #A5D6A7; +@define-color Material_LightGreen #C5E1A5; +@define-color Material_Lime #E6EE9C; +@define-color Material_Yellow #FFF59D; +@define-color Material_Amber #FFE082; +@define-color Material_Orange #FFCC80; +@define-color Material_DeepOrange #FFAB91; +@define-color Material_Brown #BCAAA4; +@define-color Material_Grey #EEEEEE; +@define-color Material_BlueGrey #B0BEC5; + + +/*Package Type Colors */ +@define-color color_install @Material_Indigo; +@define-color color_update @Material_Pink; +@define-color color_downgrade @Material_Lime; +@define-color color_normal @Material_Orange; +@define-color color_obsolete @Material_Green; diff --git a/misc/themes/System-Light.theme b/misc/themes/System-Light.theme new file mode 100644 index 0000000..68e082b --- /dev/null +++ b/misc/themes/System-Light.theme @@ -0,0 +1,37 @@ +/* +* Yum Extender styling (GTK3 CSS) +*/ + +/* Material Design Colors for light Background */ + +@define-color Material_Red #F44336; +@define-color Material_Pink #E91E63; +@define-color Material_Purple #9C27B0; +@define-color Material_DeepPurple #673AB7; +@define-color Material_Indigo #3F51B5; +@define-color Material_Blue #2196F3; +@define-color Material_LightBlue #03A9F4; +@define-color Material_Cyan #00BCD4; +@define-color Material_Teal #009688; +@define-color Material_Green #4CAF50; +@define-color Material_LightGreen #8BC34A; +@define-color Material_Lime #CDDC39; +@define-color Material_Yellow #FFEB3B; +@define-color Material_Amber #FFC107; +@define-color Material_Orange #FF9800; +@define-color Material_DeepOrange #FF5722; +@define-color Material_Brown #795548; +@define-color Material_Grey #9E9E9E; +@define-color Material_BlueGrey #607D8B; + + +/*Package Type Colors */ +@define-color color_install @Material_Indigo; +@define-color color_update @Material_Pink; +@define-color color_downgrade @Material_Lime; +@define-color color_normal @Material_Orange; +@define-color color_obsolete @Material_Green; + + + + diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index bd08881..03a0c1b 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -244,7 +244,11 @@ def apply_css(self, css_fn): def load_colors(self, theme_fn): color_table = {} colors = 'color_install', 'color_update', 'color_downgrade', 'color_normal', 'color_obsolete' - regex = re.compile(r'@define-color\s*(.*)\s(.*)\s?;') + regex = re.compile(r'@define-color\s(\w*)\s*(#\w{6}|@\w*)\s*;') + if misc.check_dark_theme(): + backup_color = '#ffffff' + else: + backup_color = '#000000' with open(theme_fn, 'r') as reader: lines = reader.readlines() for line in lines: @@ -252,11 +256,20 @@ def load_colors(self, theme_fn): match = regex.search(line) if len(match.groups()) == 2: color_table[match.group(1)] = match.group(2) + logger.debug(f' {match.group(1)} = {match.group(2)}') logger.debug(f'loaded {len(color_table)} colors from {theme_fn}') for color in colors: if color in color_table: - setattr(CONFIG.session,color,color_table[color]) - logger.debug(f' --> updated color : {color} to: {color_table[color]}') + color_value = color_table[color] + if color_value.startswith('@'): # lookup macro color + key = color_value[1:] # dump the @ + if key in color_table: + color_value = color_table[key] + else: + logger.info(f'Unknown Color alias : {color_value} default to {backup_color}') + color_value = backup_color + setattr(CONFIG.session,color, color_value) + logger.debug(f' --> updated color : {color} to: {color_value}') def load_theme(self): theme_fn = os.path.join(const.THEME_DIR, CONFIG.conf.theme) @@ -268,9 +281,9 @@ def load_theme(self): def load_custom_styling(self): """Load custom .css styling from current theme.""" - # Use Dark Theme always + # Use Dark Theme gtk_settings = Gtk.Settings.get_default() - gtk_settings.set_property("gtk-application-prefer-dark-theme",True) + gtk_settings.set_property("gtk-application-prefer-dark-theme",CONFIG.conf.use_dark) css_fn = None theme = gtk_settings.props.gtk_theme_name logger.debug(f'current theme : {theme}') diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 754bb6d..013030a 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -265,8 +265,8 @@ class YumexConf(config.BaseConfig): """ Yum Extender Config Setting""" debug = config.BoolOption(False) autostart = config.BoolOption(False) - - theme = config.Option("Dracula.theme") + theme = config.Option("System-Dark.theme") + use_dark = config.BoolOption(False) color_install = config.Option('#8BE8FD') color_update = config.Option('#FF79C6') From 7fa5eb00b85385dcab198347f6f869f891f4f924 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sat, 22 May 2021 09:27:06 +0200 Subject: [PATCH 104/133] Update copyright year & version to match spec --- src/yumex/const.py | 2 +- src/yumex/gui/dialogs.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yumex/const.py b/src/yumex/const.py index 1db2183..ee4eec3 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -27,7 +27,7 @@ from yumex.misc import _ -VERSION = "4.4.0" +VERSION = "4.4.3" NEEDED_DAEMON_API = 2 # The needed dnfdaemon API version diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 5b60ad2..8ffd168 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -43,7 +43,7 @@ def __init__(self, parent): self.props.version = const.VERSION self.props.authors = ['Tim Lauridsen '] self.props.license_type = Gtk.License.GPL_2_0 - self.props.copyright = '(C) 2015 Tim Lauridsen' + self.props.copyright = '(C) 2021 Tim Lauridsen' self.props.website = 'https://github.com/timlau/yumex-dnf' self.props.logo_icon_name = 'yumex-dnf' self.set_transient_for(parent) From c3a03a6466c1e84487705d4677a4ac509cf884c8 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sat, 22 May 2021 20:10:54 +0200 Subject: [PATCH 105/133] * UI cleanup * improve Dracula Theme * Remove color selection from pref. * Add Dark mode switch to pref. --- misc/themes/Dracula.theme | 190 +++++++++----------- src/yumex.ui | 367 ++++++++++++++------------------------ src/yumex/__init__.py | 9 +- src/yumex/gui/dialogs.py | 17 +- 4 files changed, 228 insertions(+), 355 deletions(-) diff --git a/misc/themes/Dracula.theme b/misc/themes/Dracula.theme index 6a1e6d1..0f57f5c 100644 --- a/misc/themes/Dracula.theme +++ b/misc/themes/Dracula.theme @@ -12,6 +12,8 @@ /* UI colors */ +/* @define-color bg_shade_01 #21252b;*/ + @define-color bg_shade_01 #21252b; @define-color bg_shade_02 #282A36; @define-color bg_shade_03 #44475A; @@ -22,86 +24,52 @@ @define-color fg_color_03 #F1FA8C; @define-color fg_color_04 #FF79C6; -/* generic vindow & dialogs */ -window, dialog { +/* generic vindow & dialog */ +#yumex_main, #yumex_transaction, #yumex_error { background: @bg_shade_01; color: @fg_color; } -/* generic headerbar & buttons */ -headerbar { - background-color: @bg_shade_01; - color: @fg_color; - -} - -/* generic treeview & textview */ -treeview, text { - background: @bg_shade_01; - color: @fg_color; -} - -/* Generic button */ -button { - background: @bg_shade_01; - color: @fg_color; -} - -button:hover { - color: @fg_color; +/* Transaction & error dialog buttons */ +#yumex_transaction button, #yumex_error button{ background: @bg_shade_03; -} - - -/* Headerbar stack selector*/ - -#header_left stackswitcher button{ - background-color: @bg_shade_03; color: @fg_color; } -#header_left stackswitcher button:checked{ - background-color: @bg_shade_05; - color: @fg_color_02; - font-weight: bold; -} - -#header_left stackswitcher button:hover { - background: @bg_shade_05; +/* Info box w. progressbar */ +#yumex_infobar box{ + background: @bg_shade_02; + border-style: solid; + border-width: 2px; + border-color: @bg_shade_03; + border-radius: 2px; } -#header_left *:selected { - background-color: @bg_shade_03; - color: @fg_color_02; - border-style: none; +#yumex_infobar label{ + color: @fg_color_03; } - -#header_right button { - background: @bg_shade_01; - color: @fg_color; - border-style: none; +#yumex_infobar spinner{ + color: @bg_shade_04; + background: @bg_shade_02; } -#header_right button:hover { +/* separator between vies & info */ +paned separator{ background: @bg_shade_03; - color: @fg_color; - border-style: none; -} - -/* Info view w. progressbar */ -.infobar box{ - background: @bg_shade_02; } -.infobar label{ - color: @fg_color_03; +#yumex_infobox text { + background: @bg_shade_01; + color: @fg_color; } -/* separator between vies & info */ -paned separator{ - background: @bg_shade_03; +#yumex_infobox .frame { + border-style: none; + border-left-style: solid; + border-left-width: 2px; + border-left-color: @bg_shade_03; } /* info type selector */ @@ -118,36 +86,46 @@ paned separator{ color: @fg_color; background: @bg_shade_02; border-left-style: solid; - border-left-width: 3px; + border-left-width: 4px; border-left-color: @fg_color_04; + border-radius: 2px; } -/* Preferences Dialog */ -.preferences label{ - color: @fg_color_02; +/* Views */ +.yumex_views treeview{ + background: @bg_shade_01; + color: @fg_color; } -.preferences { +/* Package category selector */ +#package_sidebar toolbar{ background: @bg_shade_02; } -/* Package category selector */ -#package_sidebar toolbar{ - background: @bg_shade_01; +#package_sidebar button{ + color: @fg_color; + background: @bg_shade_02; } #package_sidebar list{ background: @bg_shade_01; color: @fg_color_04; - font-style: italic; +} + +#package_sidebar row.activatable{ + padding-left: 10px; } #package_sidebar row.activatable:selected { color: @fg_color; background: @bg_shade_04; + border: none; border-left-style: solid; border-left-width: 3px; border-left-color: @fg_color_04; + border-radius: 2px; + /*padding-left: 10px;*/ + } #package_sidebar row.activatable:hover { @@ -156,77 +134,83 @@ paned separator{ } /* Package View */ -#pkg_view { - background: @bg_shade_01; - color: @fg_color; -} -#pkg_view *:selected{ +.yumex_views treeview:selected{ background: @bg_shade_04; color: @fg_color; } -#pkg_view *:hover{ +.yumex_views treeview:hover{ background: @bg_shade_03; color: @fg_color; } /* Package View Column Headers */ -#pkg_view button { +.yumex_views header button { color: @fg_color; background: @bg_shade_02; + border: none; border-bottom-color: @bg_shade_05; - border-bottom-width: 2px + border-bottom-width: 1px; + border-bottom-style: solid; + border-left-color: @bg_shade_05; + border-left-width: 1px; + border-left-style: dotted; } /* Package View Checkboxes */ -#pkg_view check { +.yumex_views check { background: @bg_shade_03; color: @fg_color_04; } -#pkg_view check:checked { +.yumex_views check:checked { background: @bg_shade_05; color: @fg_color; border-width: 0px; } -/* Search bar */ -.search { - color: @fg_color; - background: @bg_shade_01; +#pkg_view { + border-style: none; + border-left-style: solid; + border-left-width: 2px; + border-left-color: @bg_shade_03; } -.search box{ - background: @bg_shade_02; -} +/* Search bar */ -.search button{ - background: @bg_shade_02; - border-width: 0px; +/* Search Entry */ +#yumex_search entry.search{ + color: @fg_color_02; + background: @bg_shade_01; + border: none; + border: 1px solid @fg_color; + border-radius: 5px; + font-weight: normal; + font-size: 120%; + caret-color: @fg_color_02; /* cursor color */ + } -.search button:hover { - color: @fg_color; - background: @bg_shade_03; +#yumex_search entry.search image{ + color: @fg_color_02; + background: @bg_shade_01; } -/* Popup Background (popover, tooltips) */ -.background popover,tooltip { - color: @fg_color; +#yumex_search box{ background: @bg_shade_02; + border: none; + outline-style: none; } -/* Popup Menu Checkboxes & Radioboxes */ -.popup check, radio { +#yumex_search button { + color: @fg_color; background: @bg_shade_03; - color: @fg_color_04; + border: none; + box-shadow: none; } -/* Popup Menu Checkboxes & Radioboxes (Checked)*/ -.popup check:checked, radio:checked { - background: @bg_shade_05; +#yumex_search button:hover { color: @fg_color; - border-width: 0px; + background: @bg_shade_04; } - diff --git a/src/yumex.ui b/src/yumex.ui index 3bfc51c..270da30 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -400,12 +400,13 @@ active when Yum Extender starts 6 6 - + True False start + start True - Color for installed packages + Theme 0 @@ -414,149 +415,77 @@ active when Yum Extender starts - - True - False - start - True - Color for available updates - - - 0 - 1 - 2 - - - - - True - False - start - True - Color for available packages - - - 0 - 2 - 2 - - - - + True False - start - True - Color for obsoleted packages - 0 - 3 - 2 + 2 + 0 - + True False start + start True - Color for available downgrades + Use Dark Theme 0 - 4 + 1 2 - + True True - True end start 2 - 0 + 1 - - True - True - True - end - start - - - 2 - 1 - + - - True - True - True - end - start - - - 2 - 2 - + - - True - True - True - end - start - - - 2 - 3 - + - - True - True - True - end - start - - - 2 - 4 - + - - True - False - start - start - Theme - - - 0 - 5 - 2 - + - - True - False - - - 2 - 5 - + + + + + + + + + + + + + + + + + + + @@ -711,6 +640,7 @@ start Yum Extender + yumex_error False 5 Errors @@ -796,9 +726,6 @@ start Yum Extender error_ok - True @@ -899,11 +826,13 @@ start Yum Extender info_tags + yumex_main True False vertical + yumex_search True True False @@ -913,7 +842,6 @@ start Yum Extender False - search_entry 500 True True @@ -936,6 +864,7 @@ start Yum Extender True False True + 5 True @@ -946,7 +875,7 @@ start Yum Extender False - True + False 1 @@ -962,14 +891,8 @@ start Yum Extender 2 - - False @@ -979,133 +902,96 @@ start Yum Extender + yumex_infobar True False 1000 True - - infobar + True - True False - 5 - warning - - + vertical + + + + info_content + True False - 6 - end + 10 + 10 + 10 + 10 + True + 6 + 5 - + + True + False + start + 15 + + + + + + 1 + 0 + - - - False - False - 0 - - - - - False - - + True False + center + 10 + 10 True - 6 - 5 - - - True - False - start - 6 - 10 - - - - - - 1 - 0 - - - - - True - False - 10 - 10 - True - True - - - 1 - 1 - - - - - False - start - 20 - 10 - - - - - - - 1 - 2 - - - - - True - False - True - - - 0 - 0 - 3 - - - - - - - - - - - - False - True - 1 + 1 + 1 + + + + + False + start + 20 + + + + + + + 1 + 2 + + + + + 40 + 40 + True + False + True + + + 0 + 0 + 3 False - False + True 0 - - - - False @@ -1131,6 +1017,7 @@ start Yum Extender crossfade + Packages True False vertical @@ -1278,7 +1165,7 @@ start Yum Extender @@ -1302,6 +1189,7 @@ start Yum Extender + Groups True False vertical @@ -1321,6 +1209,9 @@ start Yum Extender + False @@ -1337,6 +1228,9 @@ start Yum Extender + True @@ -1359,6 +1253,7 @@ start Yum Extender + History True False vertical @@ -1377,6 +1272,9 @@ start Yum Extender + False @@ -1393,6 +1291,9 @@ start Yum Extender + True @@ -1443,6 +1344,7 @@ start Yum Extender + Queue True False vertical @@ -1454,6 +1356,9 @@ start Yum Extender + True @@ -1468,6 +1373,9 @@ start Yum Extender 3 + False @@ -1476,6 +1384,7 @@ start Yum Extender + yumex_infobox True False @@ -1509,6 +1418,7 @@ start Yum Extender True False dialog-information-symbolic + 2 @@ -1613,9 +1523,6 @@ start Yum Extender 1 - False @@ -1636,9 +1543,6 @@ start Yum Extender 2 - header_left @@ -1663,6 +1567,7 @@ start Yum Extender + PackageFilterPopup False button_more_filters @@ -1758,11 +1663,9 @@ start Yum Extender - + SearchPopup False sch_options_button bottom @@ -1906,9 +1809,6 @@ start Yum Extender - True @@ -1991,6 +1891,7 @@ start Yum Extender + yumex_transaction False 5 Package actions to perform @@ -2122,7 +2023,7 @@ start Yum Extender result_ok diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 03a0c1b..6a1f46c 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -27,7 +27,7 @@ import sys import re -from gi.repository import Gio, Gtk, Gdk +from gi.repository import Gio, Gtk, Gdk, GLib from yumex.misc import Config, _, ngettext, CONFIG import yumex.const as const @@ -235,7 +235,10 @@ def apply_css(self, css_fn): if css_fn: screen = Gdk.Screen.get_default() css_provider = Gtk.CssProvider() - css_provider.load_from_path(css_fn) + try: + css_provider.load_from_path(css_fn) + except GLib.Error as e: + logger.error(f"Error in theme: {e} ") context = Gtk.StyleContext() context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) @@ -256,7 +259,7 @@ def load_colors(self, theme_fn): match = regex.search(line) if len(match.groups()) == 2: color_table[match.group(1)] = match.group(2) - logger.debug(f' {match.group(1)} = {match.group(2)}') + logger.debug(f' --> Color: {match.group(1)} = {match.group(2)}') logger.debug(f'loaded {len(color_table)} colors from {theme_fn}') for color in colors: if color in color_table: diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 8ffd168..233299b 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -52,10 +52,8 @@ def __init__(self, parent): class Preferences: VALUES = ['update_interval', 'refresh_interval', 'installonly_limit'] - COLORS = ['color_install', 'color_update', 'color_normal', - 'color_obsolete', 'color_downgrade'] FLAGS = ['autostart', 'clean_unused', 'newest_only', - 'headerbar', 'auto_select_updates', 'repo_saved', 'clean_instonly' + 'headerbar', 'auto_select_updates', 'repo_saved', 'clean_instonly', 'use_dark' ] def __init__(self, base): @@ -103,11 +101,6 @@ def get_settings(self): # cleanup installonly handler widget = self.base.ui.get_object('pref_clean_instonly') widget.connect('notify::active', self.on_clean_instonly) - # set colors states - for name in Preferences.COLORS: - rgba = yumex.misc.get_color(getattr(CONFIG.conf, name)) - widget = self.base.ui.get_object(name) - widget.set_rgba(rgba) # Set value states for name in Preferences.VALUES: widget = self.base.ui.get_object('pref_' + name) @@ -148,14 +141,6 @@ def set_settings(self): setattr(CONFIG.conf, option, state) changed = True self.handle_setting(option, state) - # handle color options - for name in Preferences.COLORS: - widget = self.base.ui.get_object(name) - rgba = widget.get_rgba() - color = yumex.misc.color_to_hex(rgba) - if color != getattr(CONFIG.conf, name): # changed ?? - setattr(CONFIG.conf, name, color) - changed = True # handle value options for name in Preferences.VALUES: widget = self.base.ui.get_object('pref_' + name) From db71c1f89494485547eba2b8965a09e57c7b6ab1 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sat, 22 May 2021 20:17:48 +0200 Subject: [PATCH 106/133] Update One-Dark & Material-Green to changed CSS naming in .ui --- misc/themes/Material-Green.theme | 207 +++++++++++++++--------------- misc/themes/One-Dark.theme | 211 ++++++++++++++----------------- 2 files changed, 196 insertions(+), 222 deletions(-) diff --git a/misc/themes/Material-Green.theme b/misc/themes/Material-Green.theme index 748e001..4d238b9 100644 --- a/misc/themes/Material-Green.theme +++ b/misc/themes/Material-Green.theme @@ -22,83 +22,57 @@ @define-color fg_color_03 #299f1c; @define-color fg_color_04 #1c9f92; -/* generic vindow & dialogs */ -window, dialog { +/* generic vindow & dialog */ +#yumex_main, #yumex_transaction, #yumex_error { background: @bg_shade_01; color: @fg_color; } -/* generic headerbar & buttons */ -headerbar { - background-color: @bg_shade_01; - color: @fg_color; - -} - -/* generic treeview & textview */ -treeview, text { - background: @bg_shade_01; - color: @fg_color; -} - -/* Generic button */ -button { - background: @bg_shade_01; +/* Transaction & error dialog buttons */ +#yumex_transaction button, #yumex_error button{ + background: @bg_shade_03; color: @fg_color; } -button:hover { - color: @fg_color; +/* Info box w. progressbar */ +#yumex_infobar box{ background: @bg_shade_02; + border-style: solid; + border-width: 2px; + border-color: @bg_shade_03; + border-radius: 2px; } - -/* Headerbar stack selector*/ - -#header_left stackswitcher button{ - background-color: @bg_shade_02; - color: @fg_color; +#yumex_infobar label{ + color: @fg_color_03; } -#header_left stackswitcher button:checked{ - background-color: @bg_shade_03; - color: @fg_color_04; - font-weight: bold; +#yumex_infobar spinner{ + color: @bg_shade_04; + background: @bg_shade_02; } -#header_left stackswitcher button:hover { +/* separator between vies & info */ +paned separator{ background: @bg_shade_03; } -#header_right button { - color: @fg_color; - border-style: none; -} - -#header_right button:hover { - background: @bg_shade_02; - color: @fg_color; - border-style: none; -} - -/* Info view w. progressbar */ -.infobar box{ +#yumex_infobox text { background: @bg_shade_01; + color: @fg_color; } -.infobar label{ - color: @fg_color_03; -} - -/* separator between vies & info */ -paned separator{ - background: @bg_shade_02; +#yumex_infobox .frame { + border-style: none; + border-left-style: solid; + border-left-width: 2px; + border-left-color: @bg_shade_03; } /* info type selector */ #info_selector row { - color: @bg_shade_03; + color: @bg_shade_05; background: @bg_shade_01; } @@ -108,116 +82,133 @@ paned separator{ #info_selector row.activatable:selected { color: @fg_color; + background: @bg_shade_02; border-left-style: solid; - border-left-width: 3; - border-left-color: @fg_color_02; -} - -/* Preferences Dialog */ -.preferences label{ - color: @fg_color_02; + border-left-width: 4px; + border-left-color: @fg_color_04; + border-radius: 2px; } -.preferences { - background: @bg_shade_04; +/* Views */ +.yumex_views treeview{ + background: @bg_shade_01; + color: @fg_color; } /* Package category selector */ #package_sidebar toolbar{ - background: @bg_shade_01; + background: @bg_shade_02; +} + +#package_sidebar button{ + color: @fg_color; + background: @bg_shade_02; } #package_sidebar list{ background: @bg_shade_01; color: @fg_color_04; - font-style: italic; +} + +#package_sidebar row.activatable{ + padding-left: 10px; } #package_sidebar row.activatable:selected { color: @fg_color; - background: @bg_shade_03; + background: @bg_shade_04; + border: none; border-left-style: solid; - border-left-width: 3; - border-left-color: @fg_color_02; + border-left-width: 3px; + border-left-color: @fg_color_04; + border-radius: 2px; + /*padding-left: 10px;*/ + } #package_sidebar row.activatable:hover { color: @fg_color; - background: @bg_shade_02; + background: @bg_shade_03; } /* Package View */ -#pkg_view { - background: @bg_shade_01; - color: @fg_color; -} -#pkg_view *:selected{ - background: @bg_shade_03; +.yumex_views treeview:selected{ + background: @bg_shade_04; color: @fg_color; } -#pkg_view *:hover{ - background: @bg_shade_02; +.yumex_views treeview:hover{ + background: @bg_shade_03; color: @fg_color; } /* Package View Column Headers */ -#pkg_view button { +.yumex_views header button { color: @fg_color; - background: @bg_shade_03; - border-bottom-color: @bg_shade_03; - border-bottom-width: 2px + background: @bg_shade_02; + border: none; + border-bottom-color: @bg_shade_05; + border-bottom-width: 1px; + border-bottom-style: solid; + border-left-color: @bg_shade_05; + border-left-width: 1px; + border-left-style: dotted; } /* Package View Checkboxes */ -#pkg_view check { - background: @bg_shade_02; +.yumex_views check { + background: @bg_shade_03; color: @fg_color_04; } -#pkg_view check:checked { - background: @bg_shade_03; +.yumex_views check:checked { + background: @bg_shade_05; color: @fg_color; border-width: 0px; } -/* Search bar */ -.search { - color: @fg_color; - background: @bg_shade_01; +#pkg_view { + border-style: none; + border-left-style: solid; + border-left-width: 2px; + border-left-color: @bg_shade_03; } -.search box{ - background: @bg_shade_04; +/* Search bar */ + +/* Search Entry */ +#yumex_search entry.search{ + color: @fg_color_02; + background: @bg_shade_01; + border: none; + border: 1px solid @fg_color; + border-radius: 5px; + font-weight: normal; + font-size: 120%; + caret-color: @fg_color_02; /* cursor color */ + } -.search button{ - background: @bg_shade_04; - border-width: 0px; +#yumex_search entry.search image{ + color: @fg_color_02; + background: @bg_shade_01; } -.search button:hover { - color: @fg_color; +#yumex_search box{ background: @bg_shade_02; + border: none; + outline-style: none; } -/* Popup Background (popover, tooltips) */ -.background popover,tooltip { +#yumex_search button { color: @fg_color; - background: @bg_shade_04; -} - -/* Popup Menu Checkboxes & Radioboxes */ -.popup check, radio { - background: @bg_shade_02; - color: @fg_color_04; + background: @bg_shade_03; + border: none; + box-shadow: none; } -/* Popup Menu Checkboxes & Radioboxes (Checked)*/ -.popup check:checked, radio:checked { - background: @bg_shade_03; +#yumex_search button:hover { color: @fg_color; - border-width: 0px; + background: @bg_shade_04; } - diff --git a/misc/themes/One-Dark.theme b/misc/themes/One-Dark.theme index 67ad79a..f731f07 100644 --- a/misc/themes/One-Dark.theme +++ b/misc/themes/One-Dark.theme @@ -22,91 +22,57 @@ @define-color fg_color_03 #e6c07b; @define-color fg_color_04 #98c379; -/* generic vindow & dialogs */ -window, dialog { +/* generic vindow & dialog */ +#yumex_main, #yumex_transaction, #yumex_error { background: @bg_shade_01; color: @fg_color; } -/* generic headerbar & buttons */ -headerbar { - background-color: @bg_shade_01; - color: @fg_color; - -} - -/* generic treeview & textview */ -treeview, text { - background: @bg_shade_01; - color: @fg_color; -} - -/* Generic button */ -button { - background: @bg_shade_01; +/* Transaction & error dialog buttons */ +#yumex_transaction button, #yumex_error button{ + background: @bg_shade_03; color: @fg_color; } -button:hover { - color: @fg_color; +/* Info box w. progressbar */ +#yumex_infobar box{ background: @bg_shade_02; + border-style: solid; + border-width: 2px; + border-color: @bg_shade_03; + border-radius: 2px; } - -/* Headerbar stack selector*/ - -#header_left stackswitcher button{ - background-color: @bg_shade_02; - color: @fg_color; +#yumex_infobar label{ + color: @fg_color_03; } -#header_left stackswitcher button:checked{ - background-color: @bg_shade_03; - color: @fg_color_02; - font-weight: bold; +#yumex_infobar spinner{ + color: @bg_shade_04; + background: @bg_shade_02; } -#header_left stackswitcher button:hover { +/* separator between vies & info */ +paned separator{ background: @bg_shade_03; } -#header_left *:selected { - background-color: @bg_shade_02; - color: @fg_color_02; - border-style: none; -} - - -#header_right button { +#yumex_infobox text { background: @bg_shade_01; color: @fg_color; - border-style: none; -} - -#header_right button:hover { - background: @bg_shade_02; - color: @fg_color; - border-style: none; } -/* Info view w. progressbar */ -.infobar box{ - background: @bg_shade_04; -} - -.infobar label{ - color: @fg_color_03; -} - -/* separator between vies & info */ -paned separator{ - background: @bg_shade_02; +#yumex_infobox .frame { + border-style: none; + border-left-style: solid; + border-left-width: 2px; + border-left-color: @bg_shade_03; } /* info type selector */ #info_selector row { - color: @bg_shade_03; + color: @bg_shade_05; background: @bg_shade_01; } @@ -116,116 +82,133 @@ paned separator{ #info_selector row.activatable:selected { color: @fg_color; + background: @bg_shade_02; border-left-style: solid; - border-left-width: 3; - border-left-color: @fg_color; -} - -/* Preferences Dialog */ -.preferences label{ - color: @fg_color_02; + border-left-width: 4px; + border-left-color: @fg_color_04; + border-radius: 2px; } -.preferences { - background: @bg_shade_04; +/* Views */ +.yumex_views treeview{ + background: @bg_shade_01; + color: @fg_color; } /* Package category selector */ #package_sidebar toolbar{ - background: @bg_shade_01; + background: @bg_shade_02; +} + +#package_sidebar button{ + color: @fg_color; + background: @bg_shade_02; } #package_sidebar list{ background: @bg_shade_01; color: @fg_color_04; - font-style: italic; +} + +#package_sidebar row.activatable{ + padding-left: 10px; } #package_sidebar row.activatable:selected { color: @fg_color; - background: @bg_shade_03; + background: @bg_shade_04; + border: none; border-left-style: solid; - border-left-width: 3; + border-left-width: 3px; border-left-color: @fg_color_04; + border-radius: 2px; + /*padding-left: 10px;*/ + } #package_sidebar row.activatable:hover { color: @fg_color; - background: @bg_shade_02; + background: @bg_shade_03; } /* Package View */ -#pkg_view { - background: @bg_shade_01; - color: @fg_color; -} -#pkg_view *:selected{ - background: @bg_shade_03; +.yumex_views treeview:selected{ + background: @bg_shade_04; color: @fg_color; } -#pkg_view *:hover{ - background: @bg_shade_02; +.yumex_views treeview:hover{ + background: @bg_shade_03; color: @fg_color; } /* Package View Column Headers */ -#pkg_view button { +.yumex_views header button { color: @fg_color; - background: @bg_shade_03; - border-bottom-color: @bg_shade_03; - border-bottom-width: 2px + background: @bg_shade_02; + border: none; + border-bottom-color: @bg_shade_05; + border-bottom-width: 1px; + border-bottom-style: solid; + border-left-color: @bg_shade_05; + border-left-width: 1px; + border-left-style: dotted; } /* Package View Checkboxes */ -#pkg_view check { - background: @bg_shade_02; +.yumex_views check { + background: @bg_shade_03; color: @fg_color_04; } -#pkg_view check:checked { - background: @bg_shade_03; +.yumex_views check:checked { + background: @bg_shade_05; color: @fg_color; border-width: 0px; } -/* Search bar */ -.search { - color: @fg_color; - background: @bg_shade_01; +#pkg_view { + border-style: none; + border-left-style: solid; + border-left-width: 2px; + border-left-color: @bg_shade_03; } -.search box{ - background: @bg_shade_04; +/* Search bar */ + +/* Search Entry */ +#yumex_search entry.search{ + color: @fg_color_02; + background: @bg_shade_01; + border: none; + border: 1px solid @fg_color; + border-radius: 5px; + font-weight: normal; + font-size: 120%; + caret-color: @fg_color_02; /* cursor color */ + } -.search button{ - background: @bg_shade_04; - border-width: 0px; +#yumex_search entry.search image{ + color: @fg_color_02; + background: @bg_shade_01; } -.search button:hover { - color: @fg_color; +#yumex_search box{ background: @bg_shade_02; + border: none; + outline-style: none; } -/* Popup Background (popover, tooltips) */ -.background popover,tooltip { +#yumex_search button { color: @fg_color; - background: @bg_shade_04; -} - -/* Popup Menu Checkboxes & Radioboxes */ -.popup check, radio { - background: @bg_shade_02; - color: @fg_color_04; + background: @bg_shade_03; + border: none; + box-shadow: none; } -/* Popup Menu Checkboxes & Radioboxes (Checked)*/ -.popup check:checked, radio:checked { - background: @bg_shade_03; +#yumex_search button:hover { color: @fg_color; - border-width: 0px; + background: @bg_shade_04; } - From de2d5e5feb3a399ef783da22184e1121b5da9816 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sun, 23 May 2021 13:11:00 +0200 Subject: [PATCH 107/133] Update Dracula theme --- misc/themes/Dracula.theme | 140 +++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 71 deletions(-) diff --git a/misc/themes/Dracula.theme b/misc/themes/Dracula.theme index 0f57f5c..213fa96 100644 --- a/misc/themes/Dracula.theme +++ b/misc/themes/Dracula.theme @@ -4,112 +4,110 @@ /*Package Type Colors */ -@define-color color_install #8BE8FD; -@define-color color_update #FF79C6; -@define-color color_downgrade #50FA7B; -@define-color color_normal #FFB86C; -@define-color color_obsolete #FFB86C; +@define-color color_install #8BE8FD; +@define-color color_update #FF79C6; +@define-color color_downgrade #50FA7B; +@define-color color_normal #FFB86C; +@define-color color_obsolete #FFB86C; /* UI colors */ -/* @define-color bg_shade_01 #21252b;*/ - -@define-color bg_shade_01 #21252b; -@define-color bg_shade_02 #282A36; -@define-color bg_shade_03 #44475A; -@define-color bg_shade_04 #566388; -@define-color bg_shade_05 #6272A4; -@define-color fg_color #F8F8F2; -@define-color fg_color_02 #FFB86C; -@define-color fg_color_03 #F1FA8C; -@define-color fg_color_04 #FF79C6; +@define-color black #21252b; +@define-color primary_dark #282A36; +@define-color primary #44475A; +@define-color primary_light #566388; +@define-color primary_lighter #6272A4; +@define-color white #F8F8F2; +@define-color other_orange #FFB86C; +@define-color other_yellow #F1FA8C; +@define-color secondary #FF79C6; /* generic vindow & dialog */ #yumex_main, #yumex_transaction, #yumex_error { - background: @bg_shade_01; - color: @fg_color; + background: @black; + color: @white; } /* Transaction & error dialog buttons */ #yumex_transaction button, #yumex_error button{ - background: @bg_shade_03; - color: @fg_color; + background: @primary; + color: @white; } /* Info box w. progressbar */ #yumex_infobar box{ - background: @bg_shade_02; + background: @primary_dark; border-style: solid; border-width: 2px; - border-color: @bg_shade_03; + border-color: @primary; border-radius: 2px; } #yumex_infobar label{ - color: @fg_color_03; + color: @other_yellow; } #yumex_infobar spinner{ - color: @bg_shade_04; - background: @bg_shade_02; + color: @primary_light; + background: @primary_dark; } /* separator between vies & info */ paned separator{ - background: @bg_shade_03; + background: @primary; } #yumex_infobox text { - background: @bg_shade_01; - color: @fg_color; + background: @black; + color: @white; } #yumex_infobox .frame { border-style: none; border-left-style: solid; border-left-width: 2px; - border-left-color: @bg_shade_03; + border-left-color: @primary; } /* info type selector */ #info_selector row { - color: @bg_shade_05; - background: @bg_shade_01; + color: @primary_lighter; + background: @black; } #info_selector row:hover { - color: @fg_color; + color: @white; } #info_selector row.activatable:selected { - color: @fg_color; - background: @bg_shade_02; + color: @white; + background: @primary; border-left-style: solid; border-left-width: 4px; - border-left-color: @fg_color_04; + border-left-color: @secondary; border-radius: 2px; } /* Views */ .yumex_views treeview{ - background: @bg_shade_01; - color: @fg_color; + background: @black; + color: @white; } /* Package category selector */ #package_sidebar toolbar{ - background: @bg_shade_02; + background: @primary_dark; } #package_sidebar button{ - color: @fg_color; - background: @bg_shade_02; + color: @white; + background: @primary_dark; } #package_sidebar list{ - background: @bg_shade_01; - color: @fg_color_04; + background: @black; + color: @white; } #package_sidebar row.activatable{ @@ -117,56 +115,56 @@ paned separator{ } #package_sidebar row.activatable:selected { - color: @fg_color; - background: @bg_shade_04; + color: @white; + background: @primary; border: none; border-left-style: solid; border-left-width: 3px; - border-left-color: @fg_color_04; + border-left-color: @secondary; border-radius: 2px; /*padding-left: 10px;*/ } #package_sidebar row.activatable:hover { - color: @fg_color; - background: @bg_shade_03; + color: @white; + background: @primary; } /* Package View */ .yumex_views treeview:selected{ - background: @bg_shade_04; - color: @fg_color; + background: @primary_light; + color: @white; } .yumex_views treeview:hover{ - background: @bg_shade_03; - color: @fg_color; + background: @primary; + color: @white; } /* Package View Column Headers */ .yumex_views header button { - color: @fg_color; - background: @bg_shade_02; + color: @white; + background: @primary_dark; border: none; - border-bottom-color: @bg_shade_05; + border-bottom-color: @primary_lighter; border-bottom-width: 1px; border-bottom-style: solid; - border-left-color: @bg_shade_05; + border-left-color: @primary_lighter; border-left-width: 1px; border-left-style: dotted; } /* Package View Checkboxes */ .yumex_views check { - background: @bg_shade_03; - color: @fg_color_04; + background: @primary; + color: @secondary; } .yumex_views check:checked { - background: @bg_shade_05; - color: @fg_color; + background: @primary_lighter; + color: @white; border-width: 0px; } @@ -174,43 +172,43 @@ paned separator{ border-style: none; border-left-style: solid; border-left-width: 2px; - border-left-color: @bg_shade_03; + border-left-color: @primary; } /* Search bar */ /* Search Entry */ #yumex_search entry.search{ - color: @fg_color_02; - background: @bg_shade_01; + color: @other_orange; + background: @black; border: none; - border: 1px solid @fg_color; + border: 1px solid @white; border-radius: 5px; font-weight: normal; font-size: 120%; - caret-color: @fg_color_02; /* cursor color */ + caret-color: @other_orange; /* cursor color */ } #yumex_search entry.search image{ - color: @fg_color_02; - background: @bg_shade_01; + color: @other_orange; + background: @black; } #yumex_search box{ - background: @bg_shade_02; + background: @primary_dark; border: none; outline-style: none; } #yumex_search button { - color: @fg_color; - background: @bg_shade_03; + color: @white; + background: @primary; border: none; box-shadow: none; } #yumex_search button:hover { - color: @fg_color; - background: @bg_shade_04; + color: @white; + background: @primary_light; } From a517e0d7d28f834860e7acffa1a4a9c67810e7b0 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sun, 23 May 2021 15:16:56 +0200 Subject: [PATCH 108/133] Update 2 theme and remove one (too ugly) --- misc/themes/Dracula.theme | 64 ++++----- misc/themes/Material-Green.theme | 214 ------------------------------- misc/themes/One-Dark.theme | 136 ++++++++++---------- 3 files changed, 100 insertions(+), 314 deletions(-) delete mode 100644 misc/themes/Material-Green.theme diff --git a/misc/themes/Dracula.theme b/misc/themes/Dracula.theme index 213fa96..47cf459 100644 --- a/misc/themes/Dracula.theme +++ b/misc/themes/Dracula.theme @@ -12,27 +12,27 @@ /* UI colors */ -@define-color black #21252b; +@define-color bg_color #21252b; @define-color primary_dark #282A36; @define-color primary #44475A; @define-color primary_light #566388; @define-color primary_lighter #6272A4; -@define-color white #F8F8F2; -@define-color other_orange #FFB86C; -@define-color other_yellow #F1FA8C; +@define-color text_color #F8F8F2; +@define-color other_search #FFB86C; +@define-color other_infobar #F1FA8C; @define-color secondary #FF79C6; /* generic vindow & dialog */ #yumex_main, #yumex_transaction, #yumex_error { - background: @black; - color: @white; + background: @bg_color; + color: @text_color; } /* Transaction & error dialog buttons */ #yumex_transaction button, #yumex_error button{ background: @primary; - color: @white; + color: @text_color; } /* Info box w. progressbar */ @@ -45,7 +45,7 @@ } #yumex_infobar label{ - color: @other_yellow; + color: @other_infobar; } #yumex_infobar spinner{ @@ -59,8 +59,8 @@ paned separator{ } #yumex_infobox text { - background: @black; - color: @white; + background: @bg_color; + color: @text_color; } #yumex_infobox .frame { @@ -73,15 +73,15 @@ paned separator{ /* info type selector */ #info_selector row { color: @primary_lighter; - background: @black; + background: @bg_color; } #info_selector row:hover { - color: @white; + color: @text_color; } #info_selector row.activatable:selected { - color: @white; + color: @text_color; background: @primary; border-left-style: solid; border-left-width: 4px; @@ -91,8 +91,8 @@ paned separator{ /* Views */ .yumex_views treeview{ - background: @black; - color: @white; + background: @bg_color; + color: @text_color; } /* Package category selector */ @@ -101,13 +101,13 @@ paned separator{ } #package_sidebar button{ - color: @white; + color: @text_color; background: @primary_dark; } #package_sidebar list{ - background: @black; - color: @white; + background: @bg_color; + color: @text_color; } #package_sidebar row.activatable{ @@ -115,7 +115,7 @@ paned separator{ } #package_sidebar row.activatable:selected { - color: @white; + color: @text_color; background: @primary; border: none; border-left-style: solid; @@ -127,7 +127,7 @@ paned separator{ } #package_sidebar row.activatable:hover { - color: @white; + color: @text_color; background: @primary; } @@ -135,17 +135,17 @@ paned separator{ .yumex_views treeview:selected{ background: @primary_light; - color: @white; + color: @text_color; } .yumex_views treeview:hover{ background: @primary; - color: @white; + color: @text_color; } /* Package View Column Headers */ .yumex_views header button { - color: @white; + color: @text_color; background: @primary_dark; border: none; border-bottom-color: @primary_lighter; @@ -164,7 +164,7 @@ paned separator{ .yumex_views check:checked { background: @primary_lighter; - color: @white; + color: @text_color; border-width: 0px; } @@ -179,20 +179,20 @@ paned separator{ /* Search Entry */ #yumex_search entry.search{ - color: @other_orange; - background: @black; + color: @other_search; + background: @bg_color; border: none; - border: 1px solid @white; + border: 1px solid @text_color; border-radius: 5px; font-weight: normal; font-size: 120%; - caret-color: @other_orange; /* cursor color */ + caret-color: @other_search; /* cursor color */ } #yumex_search entry.search image{ - color: @other_orange; - background: @black; + color: @other_search; + background: @bg_color; } #yumex_search box{ @@ -202,13 +202,13 @@ paned separator{ } #yumex_search button { - color: @white; + color: @text_color; background: @primary; border: none; box-shadow: none; } #yumex_search button:hover { - color: @white; + color: @text_color; background: @primary_light; } diff --git a/misc/themes/Material-Green.theme b/misc/themes/Material-Green.theme deleted file mode 100644 index 4d238b9..0000000 --- a/misc/themes/Material-Green.theme +++ /dev/null @@ -1,214 +0,0 @@ -/* -* Yum Extender styling (GTK3 CSS) -* Based on the One-Dark theme -*/ - -/*Package Type Colors */ - -@define-color color_install #7cc6bf; -@define-color color_update #1c6b9f; -@define-color color_downgrade #98c379; -@define-color color_normal #ff4c98; -@define-color color_obsolete #299f1c; - -/* UI colors */ - -@define-color bg_shade_01 #010807; -@define-color bg_shade_02 #005d26; -@define-color bg_shade_03 #027c3a; -@define-color bg_shade_04 #1c9f50; -@define-color fg_color #e6f5ea; -@define-color fg_color_02 #9f1c6b; -@define-color fg_color_03 #299f1c; -@define-color fg_color_04 #1c9f92; - -/* generic vindow & dialog */ -#yumex_main, #yumex_transaction, #yumex_error { - background: @bg_shade_01; - color: @fg_color; - -} - -/* Transaction & error dialog buttons */ -#yumex_transaction button, #yumex_error button{ - background: @bg_shade_03; - color: @fg_color; -} - -/* Info box w. progressbar */ -#yumex_infobar box{ - background: @bg_shade_02; - border-style: solid; - border-width: 2px; - border-color: @bg_shade_03; - border-radius: 2px; -} - -#yumex_infobar label{ - color: @fg_color_03; -} - -#yumex_infobar spinner{ - color: @bg_shade_04; - background: @bg_shade_02; -} - -/* separator between vies & info */ -paned separator{ - background: @bg_shade_03; -} - -#yumex_infobox text { - background: @bg_shade_01; - color: @fg_color; -} - -#yumex_infobox .frame { - border-style: none; - border-left-style: solid; - border-left-width: 2px; - border-left-color: @bg_shade_03; -} - -/* info type selector */ -#info_selector row { - color: @bg_shade_05; - background: @bg_shade_01; -} - -#info_selector row:hover { - color: @fg_color; -} - -#info_selector row.activatable:selected { - color: @fg_color; - background: @bg_shade_02; - border-left-style: solid; - border-left-width: 4px; - border-left-color: @fg_color_04; - border-radius: 2px; -} - -/* Views */ -.yumex_views treeview{ - background: @bg_shade_01; - color: @fg_color; -} - -/* Package category selector */ -#package_sidebar toolbar{ - background: @bg_shade_02; -} - -#package_sidebar button{ - color: @fg_color; - background: @bg_shade_02; -} - -#package_sidebar list{ - background: @bg_shade_01; - color: @fg_color_04; -} - -#package_sidebar row.activatable{ - padding-left: 10px; -} - -#package_sidebar row.activatable:selected { - color: @fg_color; - background: @bg_shade_04; - border: none; - border-left-style: solid; - border-left-width: 3px; - border-left-color: @fg_color_04; - border-radius: 2px; - /*padding-left: 10px;*/ - -} - -#package_sidebar row.activatable:hover { - color: @fg_color; - background: @bg_shade_03; -} - -/* Package View */ - -.yumex_views treeview:selected{ - background: @bg_shade_04; - color: @fg_color; -} - -.yumex_views treeview:hover{ - background: @bg_shade_03; - color: @fg_color; -} - -/* Package View Column Headers */ -.yumex_views header button { - color: @fg_color; - background: @bg_shade_02; - border: none; - border-bottom-color: @bg_shade_05; - border-bottom-width: 1px; - border-bottom-style: solid; - border-left-color: @bg_shade_05; - border-left-width: 1px; - border-left-style: dotted; -} - -/* Package View Checkboxes */ -.yumex_views check { - background: @bg_shade_03; - color: @fg_color_04; -} - -.yumex_views check:checked { - background: @bg_shade_05; - color: @fg_color; - border-width: 0px; -} - -#pkg_view { - border-style: none; - border-left-style: solid; - border-left-width: 2px; - border-left-color: @bg_shade_03; -} - -/* Search bar */ - -/* Search Entry */ -#yumex_search entry.search{ - color: @fg_color_02; - background: @bg_shade_01; - border: none; - border: 1px solid @fg_color; - border-radius: 5px; - font-weight: normal; - font-size: 120%; - caret-color: @fg_color_02; /* cursor color */ - -} - -#yumex_search entry.search image{ - color: @fg_color_02; - background: @bg_shade_01; -} - -#yumex_search box{ - background: @bg_shade_02; - border: none; - outline-style: none; -} - -#yumex_search button { - color: @fg_color; - background: @bg_shade_03; - border: none; - box-shadow: none; -} - -#yumex_search button:hover { - color: @fg_color; - background: @bg_shade_04; -} diff --git a/misc/themes/One-Dark.theme b/misc/themes/One-Dark.theme index f731f07..26ca560 100644 --- a/misc/themes/One-Dark.theme +++ b/misc/themes/One-Dark.theme @@ -5,109 +5,109 @@ /*Package Type Colors */ -@define-color color_install #56b6c2; -@define-color color_update #e06c75; -@define-color color_downgrade #98c379; -@define-color color_normal #d19a66; -@define-color color_obsolete #e06c75; +@define-color color_install #56b6c2; +@define-color color_update #e06c75; +@define-color color_downgrade #98c379; +@define-color color_normal #d19a66; +@define-color color_obsolete #e06c75; /* UI colors */ -@define-color bg_shade_01 #282c34; -@define-color bg_shade_02 #323842; -@define-color bg_shade_03 #404859; -@define-color bg_shade_04 #5c6370; -@define-color fg_color #abb2bf; -@define-color fg_color_02 #d19a66; -@define-color fg_color_03 #e6c07b; -@define-color fg_color_04 #98c379; +@define-color bg_color #282c34; +@define-color primary_dark #323842; +@define-color primary #404859; +@define-color primary_light #5c6370; +@define-color text_color #abb2bf; +@define-color other_infobar #d19a66; +@define-color other_search #e6c07b; +@define-color secondary #98c379; /* generic vindow & dialog */ #yumex_main, #yumex_transaction, #yumex_error { - background: @bg_shade_01; - color: @fg_color; + background: @bg_color; + color: @text_color; } /* Transaction & error dialog buttons */ #yumex_transaction button, #yumex_error button{ - background: @bg_shade_03; - color: @fg_color; + background: @primary; + color: @text_color; } /* Info box w. progressbar */ #yumex_infobar box{ - background: @bg_shade_02; + background: @primary_dark; border-style: solid; border-width: 2px; - border-color: @bg_shade_03; + border-color: @primary; border-radius: 2px; } #yumex_infobar label{ - color: @fg_color_03; + color: @other_infobar; } #yumex_infobar spinner{ - color: @bg_shade_04; - background: @bg_shade_02; + color: @primary_light; + background: @primary_dark; } /* separator between vies & info */ paned separator{ - background: @bg_shade_03; + background: @primary; } #yumex_infobox text { - background: @bg_shade_01; - color: @fg_color; + background: @bg_color; + color: @text_color; } #yumex_infobox .frame { border-style: none; border-left-style: solid; border-left-width: 2px; - border-left-color: @bg_shade_03; + border-left-color: @primary; } /* info type selector */ #info_selector row { - color: @bg_shade_05; - background: @bg_shade_01; + color: @primary_lighter; + background: @bg_color; } #info_selector row:hover { - color: @fg_color; + color: @text_color; } #info_selector row.activatable:selected { - color: @fg_color; - background: @bg_shade_02; + color: @text_color; + background: @primary; border-left-style: solid; border-left-width: 4px; - border-left-color: @fg_color_04; + border-left-color: @secondary; border-radius: 2px; } /* Views */ .yumex_views treeview{ - background: @bg_shade_01; - color: @fg_color; + background: @bg_color; + color: @text_color; } /* Package category selector */ #package_sidebar toolbar{ - background: @bg_shade_02; + background: @primary_dark; } #package_sidebar button{ - color: @fg_color; - background: @bg_shade_02; + color: @text_color; + background: @primary_dark; } #package_sidebar list{ - background: @bg_shade_01; - color: @fg_color_04; + background: @bg_color; + color: @text_color; } #package_sidebar row.activatable{ @@ -115,56 +115,56 @@ paned separator{ } #package_sidebar row.activatable:selected { - color: @fg_color; - background: @bg_shade_04; + color: @text_color; + background: @primary; border: none; border-left-style: solid; border-left-width: 3px; - border-left-color: @fg_color_04; + border-left-color: @secondary; border-radius: 2px; /*padding-left: 10px;*/ } #package_sidebar row.activatable:hover { - color: @fg_color; - background: @bg_shade_03; + color: @text_color; + background: @primary; } /* Package View */ .yumex_views treeview:selected{ - background: @bg_shade_04; - color: @fg_color; + background: @primary_light; + color: @text_color; } .yumex_views treeview:hover{ - background: @bg_shade_03; - color: @fg_color; + background: @primary; + color: @text_color; } /* Package View Column Headers */ .yumex_views header button { - color: @fg_color; - background: @bg_shade_02; + color: @text_color; + background: @primary_dark; border: none; - border-bottom-color: @bg_shade_05; + border-bottom-color: @primary_lighter; border-bottom-width: 1px; border-bottom-style: solid; - border-left-color: @bg_shade_05; + border-left-color: @primary_lighter; border-left-width: 1px; border-left-style: dotted; } /* Package View Checkboxes */ .yumex_views check { - background: @bg_shade_03; - color: @fg_color_04; + background: @primary; + color: @secondary; } .yumex_views check:checked { - background: @bg_shade_05; - color: @fg_color; + background: @primary_lighter; + color: @text_color; border-width: 0px; } @@ -172,43 +172,43 @@ paned separator{ border-style: none; border-left-style: solid; border-left-width: 2px; - border-left-color: @bg_shade_03; + border-left-color: @primary; } /* Search bar */ /* Search Entry */ #yumex_search entry.search{ - color: @fg_color_02; - background: @bg_shade_01; + color: @other_search; + background: @bg_color; border: none; - border: 1px solid @fg_color; + border: 1px solid @text_color; border-radius: 5px; font-weight: normal; font-size: 120%; - caret-color: @fg_color_02; /* cursor color */ + caret-color: @other_search; /* cursor color */ } #yumex_search entry.search image{ - color: @fg_color_02; - background: @bg_shade_01; + color: @other_search; + background: @bg_color; } #yumex_search box{ - background: @bg_shade_02; + background: @primary_dark; border: none; outline-style: none; } #yumex_search button { - color: @fg_color; - background: @bg_shade_03; + color: @text_color; + background: @primary; border: none; box-shadow: none; } #yumex_search button:hover { - color: @fg_color; - background: @bg_shade_04; + color: @text_color; + background: @primary_light; } From de706d3389f24e13c2bd154139ab260c883968b3 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 24 May 2021 12:43:32 +0200 Subject: [PATCH 109/133] update readme --- README.md | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 93b455b..e697df5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,3 @@ -23-03-2017: yumex-dnf is no longer under active development -============================================================ - - Yum Extender (yumex-dnf) ========================= @@ -40,23 +36,15 @@ make test-inst ``` -Fedora Repository -======================= -yumex-dnf is available in the Fedora repositories for f22, f23 & Rawhide - -Use this to install it. -``` -sudo dnf install yumex-dnf -``` - Fedora Copr Repository ======================= -yumex-dnf & dnddaemon development packages is available in a [fedora Copr repository](https://copr.fedoraproject.org/coprs/timlau/yumex-dnf/) for f22, f23 & Rawhide +yumex-dnf development packages is available in a [fedora Copr repository](https://copr.fedoraproject.org/coprs/timlau/yumex-dnf/) for f34 & Rawhide Use this to enable it. ``` sudo dnf copr enable timlau/yumex-dnf +sudo dnf install yumex-dnf ``` Contributing From 3b00bfa773f407bd970e330be83ac89f18a3468f Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 24 May 2021 12:54:46 +0200 Subject: [PATCH 110/133] add BR make --- yumex-dnf.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/yumex-dnf.spec b/yumex-dnf.spec index d83e584..b3d82ef 100644 --- a/yumex-dnf.spec +++ b/yumex-dnf.spec @@ -15,6 +15,7 @@ BuildRequires: desktop-file-utils BuildRequires: gettext BuildRequires: intltool BuildRequires: python3-devel +BuildRequires: make Requires: python3-dnfdaemon >= 0.3.10 Requires: python3-gobject >= 3.10 From 11501046d6aaa74c24a1c3584ab368a7a5498cad Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 24 May 2021 13:22:24 +0200 Subject: [PATCH 111/133] disable group selection as group support is broken in dnfdaemon --- Makefile | 9 +++++++-- src/yumex/gui/views.py | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 69da59a..8400c11 100644 --- a/Makefile +++ b/Makefile @@ -126,7 +126,11 @@ test-inst: test-reinst: @$(MAKE) test-release sudo dnf reinstall $(BUILDDIR)/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm - + +test-copr: + @$(MAKE) test-release + copr-cli build yumex-dnf $(BUILDDIR)/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm + transifex-setup: tx init @@ -156,5 +160,6 @@ status-run: .PHONY: all archive install clean build .PHONY: $(SUBDIRS) $(INSTALL_TARGETS) $(CLEAN_TARGETS) -.PHONY: test-reinst test-inst mock-build rpm test-release test-cleanup show-vars release upload get-builddeps changelog +.PHONY: test-reinst test-inst mock-build rpm test-release test-cleanup show-vars release upload get-builddeps changelog +.PHONY: test-copr diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index c65d868..0283c6b 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -1172,7 +1172,8 @@ def setup_view(self): column = Gtk.TreeViewColumn(None, None) # Selection checkbox selection = Gtk.CellRendererToggle() # Selection - selection.set_property('activatable', True) + # FIXME: Group install/remove is broken in dnfdaemon + selection.set_property('activatable', False) column.pack_start(selection, False) column.set_cell_data_func(selection, self.set_checkbox) selection.connect("toggled", self.on_toggled) From d1fd45eba3685c9d42c428b5ed726b8d57e692bc Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Mon, 24 May 2021 13:27:25 +0200 Subject: [PATCH 112/133] readme updates --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e697df5..d140e6c 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ Yum Extender (yumex-dnf) This repository contains a complete rewrite of Yum Extender in python3, Gtk3 and using the dnf-daemon dbus API for packaging actions +**May 2021 : yumex-dnf is now back in development** +Group/History support is read-only for now, as dnfdaemon support for history/groups is broken + How to build & install test rpms ================================= From 7d1f03ab96f384e7755b3920a7bffc7463d24b07 Mon Sep 17 00:00:00 2001 From: stratusjerry Date: Wed, 26 May 2021 16:50:19 -0400 Subject: [PATCH 113/133] Update README.md small typo fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d140e6c..a45590e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Requirements dnf install python3 python3-gobject ``` -[dnf-deamon](https://github.com/timlau/dnf-daemon) python3 bindings must also be installed. +[dnf-daemon](https://github.com/timlau/dnf-daemon) python3 bindings must also be installed. ``` dnf install python3-dnfdaemon From 285f3eb51e17f93d192fb12aa2b6c43b19da93aa Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 13:10:55 +0200 Subject: [PATCH 114/133] Make theme page the first page in pref --- src/yumex.ui | 210 +++++++++++++++++++++++++-------------------------- 1 file changed, 105 insertions(+), 105 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 270da30..0e2bcd8 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -79,6 +79,109 @@ False 6 slide-right + + + + True + False + 6 + 10 + 6 + 6 + + + True + False + start + start + True + Theme + + + 0 + 0 + 2 + + + + + True + False + + + 2 + 0 + + + + + True + False + start + start + True + Use Dark Theme + + + 0 + 1 + 2 + + + + + True + True + end + start + + + 2 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pref_colors + Theme + + @@ -181,6 +284,7 @@ Yum Extender is started pref_ui UI + 1 @@ -264,7 +368,7 @@ Yum Extender is started pref_update Update Checker - 1 + 2 @@ -387,110 +491,6 @@ active when Yum Extender starts pref_dnf DNF Options - 2 - - - - - - True - False - 6 - 10 - 6 - 6 - - - True - False - start - start - True - Theme - - - 0 - 0 - 2 - - - - - True - False - - - 2 - 0 - - - - - True - False - start - start - True - Use Dark Theme - - - 0 - 1 - 2 - - - - - True - True - end - start - - - 2 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pref_colors - Theme 3 From 9357e66e04d05b70f676f3e6837d1ff9dbeab5f1 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 13:12:05 +0200 Subject: [PATCH 115/133] dont hide sublabel, just clear it, make UI look bad --- src/yumex/dnf_backend.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 2d18f40..7560d97 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -176,11 +176,11 @@ def __init__(self, frontend): self.running_api_version) else: raise dnfdaemon.client.APIVersionError( - _('dnfdaemon api version : %d' - "\ndon't match" - '\nneeded api version : %d') % - (self.running_api_version, - const.NEEDED_DAEMON_API)) + _('dnfdaemon api version : %d' + "\ndon't match" + '\nneeded api version : %d') % + (self.running_api_version, + const.NEEDED_DAEMON_API)) def on_TransactionEvent(self, event, data): if event == 'start-run': @@ -202,11 +202,11 @@ def on_TransactionEvent(self, event, data): elif event == 'run-transaction': self.frontend.infobar.show_progress(True) self.frontend.infobar.info(_('Applying changes to the system')) - self.frontend.infobar.hide_sublabel() + self.frontend.infobar.info_sub('') elif event == 'verify': self.frontend.infobar.show_progress(True) self.frontend.infobar.info(_('Verify changes on the system')) - #self.frontend.infobar.hide_sublabel() + self.frontend.infobar.info_sub('') # elif event == '': elif event == 'fail': self.frontend.infobar.show_progress(False) @@ -223,9 +223,9 @@ def on_RPMProgress(self, package, action, te_current, else: # this is just a pkg name (cleanup) name = package # logger.debug('on_RPMProgress : [%s]', package) - action_msg = const.RPM_ACTIONS.get(action,None) + action_msg = const.RPM_ACTIONS.get(action, None) if action_msg: - self.frontend.infobar.info_sub( action_msg % name) + self.frontend.infobar.info_sub(action_msg % name) else: logger.info("RPM Progress: Undefinded action {}".format(action)) if ts_current > 0 and ts_current <= ts_total: @@ -268,7 +268,8 @@ def on_DownloadEnd(self, name, status, msg): logger.debug('Downloaded : %s', name) self._files_downloaded += 1 else: - logger.debug('Download Error : %s - %s (status : %d )', name, msg, status) + logger.debug('Download Error : %s - %s (status : %d )', + name, msg, status) def on_RepoMetaDataProgress(self, name, frac): """Repository Metadata Download progress.""" @@ -304,7 +305,7 @@ def reload(self): # time.sleep(5) self.Lock() # Load & Lock the daemon self.SetWatchdogState(False) - #self._update_config_options() + # self._update_config_options() self.cache.reset() # Reset the cache def _update_config_options(self): From 83196f988886d683540076c0c84e649b4294442c Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 13:13:09 +0200 Subject: [PATCH 116/133] vs code: dont do type checks --- .vscode/settings.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2a0ea24 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "python.analysis.diagnosticSeverityOverrides": { + "reportGeneralTypeIssues": "none" + } +} \ No newline at end of file From 01127a949313eb1e7ab52f27f4d2498c261fbb37 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 13:20:33 +0200 Subject: [PATCH 117/133] Fixed Lint issues & code formatting --- src/main.py | 2 +- src/update.py | 2 +- src/yumex/__init__.py | 42 +++++++++++++++++++++++----------------- src/yumex/config.py | 5 +++++ src/yumex/const.py | 2 +- src/yumex/gui/dialogs.py | 12 ++++++------ src/yumex/gui/views.py | 3 +++ src/yumex/gui/widgets.py | 14 +++++++------- src/yumex/misc.py | 21 ++++++++++---------- src/yumex/updater.py | 4 ++-- 10 files changed, 61 insertions(+), 46 deletions(-) diff --git a/src/main.py b/src/main.py index 75434ce..ca08344 100755 --- a/src/main.py +++ b/src/main.py @@ -18,6 +18,7 @@ # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +from yumex import YumexApplication import sys import traceback import subprocess @@ -35,7 +36,6 @@ print("set PYTHONPATH to %s" % here) -from yumex import YumexApplication try: signal.signal(signal.SIGINT, signal.SIG_DFL) app = YumexApplication() diff --git a/src/update.py b/src/update.py index 511dafc..3e3baa4 100755 --- a/src/update.py +++ b/src/update.py @@ -18,6 +18,7 @@ # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +from yumex.updater import UpdateApplication import sys import traceback import subprocess @@ -34,7 +35,6 @@ sys.path[0] = here print("set PYTHONPATH to %s" % here) -from yumex.updater import UpdateApplication try: signal.signal(signal.SIGINT, signal.SIG_DFL) app = UpdateApplication() diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 6a1f46c..eef9514 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -110,6 +110,7 @@ def get_root_backend(self): if self._root_locked is False: logger.debug('Lock the DNF root daemon') locked, msg = self._root_backend.setup() + errmsg = "" if locked: self._root_locked = True if self._check_cache_expired('system'): @@ -127,7 +128,7 @@ def get_root_backend(self): 'Yum Extender will exit') self.error_dialog.show(errmsg) # close down and exit yum extender - #self.status.SetWorking(False) # reset working state + # self.status.SetWorking(False) # reset working state #self.status.SetYumexIsRunning(self.pid, False) sys.exit(1) return self._root_backend @@ -172,7 +173,7 @@ def exception_handler(self, e): self.release_root_backend(quit_dnfdaemon=True) except: pass - #self.status.SetWorking(False) # reset working state + # self.status.SetWorking(False) # reset working state #self.status.SetYumexIsRunning(self.pid, False) sys.exit(1) @@ -259,20 +260,23 @@ def load_colors(self, theme_fn): match = regex.search(line) if len(match.groups()) == 2: color_table[match.group(1)] = match.group(2) - logger.debug(f' --> Color: {match.group(1)} = {match.group(2)}') + logger.debug( + f' --> Color: {match.group(1)} = {match.group(2)}') logger.debug(f'loaded {len(color_table)} colors from {theme_fn}') for color in colors: if color in color_table: color_value = color_table[color] - if color_value.startswith('@'): # lookup macro color - key = color_value[1:] # dump the @ + if color_value.startswith('@'): # lookup macro color + key = color_value[1:] # dump the @ if key in color_table: color_value = color_table[key] else: - logger.info(f'Unknown Color alias : {color_value} default to {backup_color}') + logger.info( + f'Unknown Color alias : {color_value} default to {backup_color}') color_value = backup_color - setattr(CONFIG.session,color, color_value) - logger.debug(f' --> updated color : {color} to: {color_value}') + setattr(CONFIG.session, color, color_value) + logger.debug( + f' --> updated color : {color} to: {color_value}') def load_theme(self): theme_fn = os.path.join(const.THEME_DIR, CONFIG.conf.theme) @@ -280,13 +284,13 @@ def load_theme(self): if os.path.exists(theme_fn): self.apply_css(theme_fn) self.load_colors(theme_fn) - def load_custom_styling(self): """Load custom .css styling from current theme.""" - # Use Dark Theme + # Use Dark Theme gtk_settings = Gtk.Settings.get_default() - gtk_settings.set_property("gtk-application-prefer-dark-theme",CONFIG.conf.use_dark) + gtk_settings.set_property( + "gtk-application-prefer-dark-theme", CONFIG.conf.use_dark) css_fn = None theme = gtk_settings.props.gtk_theme_name logger.debug(f'current theme : {theme}') @@ -306,7 +310,7 @@ def load_custom_styling(self): def on_window_state(self, widget, event): # save window current maximized state self.cur_maximized = event.new_window_state & \ - Gdk.WindowState.MAXIMIZED != 0 + Gdk.WindowState.MAXIMIZED != 0 def on_window_changed(self, widget, data): size = widget.get_size() @@ -547,7 +551,7 @@ def _setup_gui(self): # Setup info self.main_paned = self.get_ui('main_paned') self.main_paned.set_position(CONFIG.conf.info_paned) - self.main_paned.set_wide_handle(True) # use wide separator bar (off) + self.main_paned.set_wide_handle(True) # use wide separator bar (off) # infobar self.infobar = widgets.InfoProgressBar(self.ui) @@ -749,6 +753,7 @@ def _switch_to(self, page): def _run_actions_installmode(self, args, quit_app): action = None + package = None if args.install: action = 'install' package = args.install @@ -893,6 +898,7 @@ def _process_actions_installmode(self, action, package, always_yes, :param package: package to work on :param always_yes: ask the user or default to yes/ok to all questions """ + exit_msg = "" if action == 'install': self.infobar.info(_('Installing package: %s') % package) exit_msg = _('%s was installed successfully') % package @@ -977,13 +983,13 @@ def _process_actions(self, from_queue=True): self.error_dialog.show( ngettext('Error in building transaction', 'Errors in building transaction', len(e.msgs)) + - '\n'.join(e.msgs)) + '\n'.join(e.msgs)) self._reset_on_cancel() except misc.TransactionSolveError as e: self.error_dialog.show( - ngettext('Error in search for dependencies', - 'Errors in search for dependencies', len(e.msgs)) + - '\n'.join(e.msgs)) + ngettext('Error in search for dependencies', + 'Errors in search for dependencies', len(e.msgs)) + + '\n'.join(e.msgs)) self._reset_on_error() ############################################################################### @@ -1131,7 +1137,7 @@ def on_filter_changed(self, widget, data): pkgs.extend(obs_pkgs) else: pkgs = self.backend.get_packages(data) - #self.status.SetUpdateCount(len(pkgs)) + # self.status.SetUpdateCount(len(pkgs)) self.info.set_package(None) self.infobar.info(_('Adding packages to view')) self.package_view.populate(pkgs) diff --git a/src/yumex/config.py b/src/yumex/config.py index e884e37..35b9933 100644 --- a/src/yumex/config.py +++ b/src/yumex/config.py @@ -305,6 +305,7 @@ class PositiveIntOption(IntOption): """An option representing a positive integer value, where 0 can have a special representation. """ + def __init__(self, default=None, range_min=0, range_max=None, names_of_0=None): super(PositiveIntOption, self).__init__(default, range_min, range_max) @@ -436,6 +437,7 @@ class SelectionOption(Option): """Handles string values where only specific values are allowed. """ + def __init__(self, default=None, allowed=(), mapper={}): super(SelectionOption, self).__init__(default) self._allowed = allowed @@ -468,6 +470,7 @@ class CaselessSelectionOption(SelectionOption): """Mainly for compatibility with :class:`BoolOption`, works like :class:`SelectionOption` but lowers input case. """ + def parse(self, s): """Parse a string for specific values. @@ -610,6 +613,7 @@ def populate(self, parser, section, parent=None): if value is not None: setattr(self, name, value) + @classmethod def optionobj(cls, name, exceptions=True): """Return the :class:`Option` instance for the given name. @@ -633,6 +637,7 @@ def optionobj(cls, name, exceptions=True): return None optionobj = classmethod(optionobj) + @classmethod def isoption(cls, name): """Return True if the given name refers to a defined option. diff --git a/src/yumex/const.py b/src/yumex/const.py index ee4eec3..24b5ea0 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -152,7 +152,7 @@ 'obsolete': _("Obsoleting: %s"), 'downgrade': _("Downgrading: %s"), 'verify': _("Verifying: %s"), - 'scriptlet' : _("Running scriptlet for: %s") + 'scriptlet': _("Running scriptlet for: %s") } WIDGETS_INSENSITIVE = ["header_menu", "header_filters", diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 233299b..1522ead 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -75,11 +75,12 @@ def run(self): need_reset = self.set_settings() return need_reset - def get_themes(self): + def get_themes(self): # Get Themes pattern = os.path.normpath(os.path.join(const.THEME_DIR, '*.theme')) theme_files = glob.glob(pattern) - theme_names = [os.path.basename(theme).split('.')[0] for theme in theme_files] + theme_names = [os.path.basename(theme).split('.')[0] + for theme in theme_files] widget = self.base.ui.get_object('pref_theme') widget.remove_all() default = CONFIG.conf.theme.split(".")[0] @@ -88,7 +89,7 @@ def get_themes(self): for theme in sorted(theme_names): widget.append_text(theme) if theme == default: - ndx=i + ndx = i i += 1 widget.set_active(ndx) @@ -113,7 +114,6 @@ def get_settings(self): self.repo_view.select_by_keys(CONFIG.session.enabled_repos) # Get Themes self.get_themes() - def on_clean_instonly(self, *args): '''Handler for clean_instonly switch''' @@ -164,9 +164,9 @@ def set_settings(self): default = CONFIG.conf.theme.split(".")[0] theme = widget.get_active_text() if theme != default: - CONFIG.conf.theme = f'{theme}.theme' + CONFIG.conf.theme = f'{theme}.theme' self.base.load_custom_styling() - changed = True + changed = True if changed: CONFIG.write() return need_reset diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index 0283c6b..00e02a3 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -864,6 +864,7 @@ def populate_list_downgrade(self): class HistoryView(Gtk.TreeView): """ History View Class""" + def __init__(self, base): Gtk.TreeView.__init__(self) self.model = self.setup_view() @@ -944,6 +945,7 @@ def get_selected(self): class HistoryPackageView(Gtk.TreeView): """ History Package View Class""" + def __init__(self, base): Gtk.TreeView.__init__(self) self.model = self.setup_view() @@ -1032,6 +1034,7 @@ class RepoView(SelectionView): """ This class controls the repo TreeView """ + def __init__(self): SelectionView.__init__(self) self.headers = [_('Repository'), _('Filename')] diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 2e54518..844ff2f 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -600,7 +600,7 @@ def _write_update_info(self, upd_info): head += ("%14s " % _("Issued")) + ": %(updated)s\n" head = head % upd_info - #if upd_info['updated'] and upd_info['updated'] != upd_info['issued']: + # if upd_info['updated'] and upd_info['updated'] != upd_info['issued']: # head += " Updated : %s" % upd_info['updated'] self.write(head) @@ -621,14 +621,14 @@ def _write_update_info(self, upd_info): self.write(bug_msg) header = " " - ## Add our CVE references - #if upd_info['references']: - #cves = [r for r in upd_info['references'] - #if r and r['type'] == 'cve'] - #if len(cves): + # Add our CVE references + # if upd_info['references']: + # cves = [r for r in upd_info['references'] + # if r and r['type'] == 'cve'] + # if len(cves): #cvelist = "" #header = "CVE" - #for cve in cves: + # for cve in cves: #cvelist += "%14s : %s\n" % (header, cve['id']) #header = " " #head += cvelist[:-1].rstrip() + '\n\n' diff --git a/src/yumex/misc.py b/src/yumex/misc.py index 013030a..daefbd2 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -44,6 +44,7 @@ logger = logging.getLogger('yumex.misc') + class QueueEmptyError(Exception): def __init__(self): @@ -268,11 +269,11 @@ class YumexConf(config.BaseConfig): theme = config.Option("System-Dark.theme") use_dark = config.BoolOption(False) - color_install = config.Option('#8BE8FD') - color_update = config.Option('#FF79C6') + color_install = config.Option('#8BE8FD') + color_update = config.Option('#FF79C6') color_downgrade = config.Option('#50FA7B') - color_normal = config.Option('#D3DAE3') - color_obsolete = config.Option('#FFB86C') + color_normal = config.Option('#D3DAE3') + color_obsolete = config.Option('#FFB86C') history_days = config.IntOption(180) newest_only = config.BoolOption(True) @@ -285,8 +286,8 @@ class YumexConf(config.BaseConfig): hb_default = is_gnome() headerbar = config.BoolOption(hb_default) search_default = config.CaselessSelectionOption( - default='prefix', - allowed=('prefix', 'keyword', 'fields', 'key')) + default='prefix', + allowed=('prefix', 'keyword', 'fields', 'key')) search_fields = config.KeyListOption(['name', 'summary']) win_height = config.IntOption(700) win_width = config.IntOption(1150) @@ -311,11 +312,11 @@ class SessionConf(config.BaseConfig): # enabled repositories for this session enabled_repos = config.ListOption([]) clean_instonly = config.BoolOption(False) - color_install = config.Option('#ffffff') - color_update = config.Option('#ffffff') + color_install = config.Option('#ffffff') + color_update = config.Option('#ffffff') color_downgrade = config.Option('#ffffff') - color_normal = config.Option('#ffffff') - color_obsolete = config.Option('#ffffff') + color_normal = config.Option('#ffffff') + color_obsolete = config.Option('#ffffff') class Config(object): diff --git a/src/yumex/updater.py b/src/yumex/updater.py index ef8f81c..bc20cbf 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -23,7 +23,7 @@ # along with this program; if not, write to # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from _signal import SIGINT, SIGTERM, SIGHUP +from signal import SIGINT, SIGTERM, SIGHUP import logging import os @@ -158,7 +158,7 @@ def __get_updates(self): logger.debug('notification opened : # updates = %d', update_count) notify = _Notification(_('New Updates'), - # Translators: %d is a number of available updates + # Translators: %d is a number of available updates ngettext('%d available update', '%d available updates', update_count) From 3cbac47a8653e1291ef4c93fbe799e14297e0eb5 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 13:57:46 +0200 Subject: [PATCH 118/133] fix issues with @classmethod --- src/yumex/config.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/yumex/config.py b/src/yumex/config.py index 35b9933..070af9c 100644 --- a/src/yumex/config.py +++ b/src/yumex/config.py @@ -635,7 +635,6 @@ def optionobj(cls, name, exceptions=True): raise KeyError else: return None - optionobj = classmethod(optionobj) @classmethod def isoption(cls, name): @@ -646,7 +645,6 @@ def isoption(cls, name): :return: whether *name* specifies a defined option """ return cls.optionobj(name, exceptions=False) is not None - isoption = classmethod(isoption) def iterkeys(self): """Yield the names of all defined options in the instance.""" From 51f2e295f99eec56270b9e53456fb6f3fb0ec179 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 14:13:38 +0200 Subject: [PATCH 119/133] import sorting can be a mess :-) --- src/main.py | 17 ++++++++++------- src/yumex/__init__.py | 18 ++++++++---------- src/yumex/gui/dialogs.py | 17 +++++++++-------- src/yumex/gui/views.py | 9 ++++----- src/yumex/misc.py | 8 +++----- 5 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/main.py b/src/main.py index ca08344..5b89c63 100755 --- a/src/main.py +++ b/src/main.py @@ -18,15 +18,18 @@ # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +""" Main launcher + isort:skip_file +""" +import gi # isort:skip +gi.require_version('Gtk', '3.0') # isort:skip +gi.require_version('Notify', '0.7') # isort:skip + from yumex import YumexApplication -import sys -import traceback -import subprocess import signal - -import gi -gi.require_version('Gtk', '3.0') -gi.require_version('Notify', '0.7') +import subprocess +import traceback +import sys here = sys.path[0] diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index eef9514..f1a9542 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -18,6 +18,14 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import yumex.gui.widgets as widgets +import yumex.gui.views as views +import yumex.gui.dialogs as dialogs +import yumex.dnf_backend +import yumex.misc as misc +import yumex.const as const +from yumex.misc import Config, _, ngettext, CONFIG +from gi.repository import Gio, Gtk, Gdk, GLib import argparse import datetime import logging @@ -27,16 +35,6 @@ import sys import re -from gi.repository import Gio, Gtk, Gdk, GLib - -from yumex.misc import Config, _, ngettext, CONFIG -import yumex.const as const -import yumex.misc as misc -import yumex.dnf_backend -import yumex.gui.dialogs as dialogs -import yumex.gui.views as views -import yumex.gui.widgets as widgets - logger = logging.getLogger('yumex') diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 1522ead..9c8f383 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -19,18 +19,17 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -import logging -import os -import shutil -import glob - -from gi.repository import Gtk -from gi.repository import GObject - from yumex import const import yumex.gui.views import yumex.misc from yumex.misc import _, CONFIG +from gi.repository import GObject +from gi.repository import Gtk +import glob +import shutil +import os +import logging + logger = logging.getLogger('yumex.gui.dialogs') @@ -108,7 +107,9 @@ def get_settings(self): widget.set_value(getattr(CONFIG.conf, name)) self.on_clean_instonly() # get the repositories + self.base.infobar.info(_('Fetching repository information')) self.repos = self.base.backend.get_repositories() + self.base.infobar.hide() self.repo_view.populate(self.repos) if CONFIG.conf.repo_saved: self.repo_view.select_by_keys(CONFIG.session.enabled_repos) diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index 00e02a3..f14ed7a 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -18,17 +18,16 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -import os import logging - +import os from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject - -from yumex import const -from yumex.misc import _, ngettext, CONFIG, doGtkEvents, TimeFunction import yumex.misc as misc +from yumex.misc import _, ngettext, CONFIG, doGtkEvents, TimeFunction +from yumex import const + logger = logging.getLogger('yumex.gui.views') diff --git a/src/yumex/misc.py b/src/yumex/misc.py index daefbd2..eee58ca 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -18,6 +18,9 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import yumex.config as config +import dnfdaemon.client +from gi.repository import Gtk, Gdk, Notify import time import configparser import gettext @@ -28,11 +31,6 @@ import subprocess import sys -from gi.repository import Gtk, Gdk, Notify - -import dnfdaemon.client - -import yumex.config as config LOCALE_DIR = os.path.join(sys.prefix, 'share', 'locale') locale.setlocale(locale.LC_ALL, '') From 92b39f207a6d8a040ca84e4cb72bb64c01b29fa3 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 14:50:49 +0200 Subject: [PATCH 120/133] vs code config --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 2a0ea24..4af34d5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "python.analysis.diagnosticSeverityOverrides": { "reportGeneralTypeIssues": "none" - } + }, + "python.linting.enabled": true } \ No newline at end of file From 9ab40d2e11b164f7da6557471da56f95d23c5008 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 14:52:59 +0200 Subject: [PATCH 121/133] make: fix test-copr to use SRPM --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8400c11..7352ecf 100644 --- a/Makefile +++ b/Makefile @@ -129,7 +129,7 @@ test-reinst: test-copr: @$(MAKE) test-release - copr-cli build yumex-dnf $(BUILDDIR)/RPMS/noarch/${APPNAME}-${NEW_VER}-${NEW_REL}*.rpm + copr-cli build yumex-dnf $(BUILDDIR)/SRPMS/${APPNAME}-${NEW_VER}-${NEW_REL}*.src.rpm transifex-setup: From dfbfebfee73c55815ebaf23197f8d41e8aa3e780 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 15:16:04 +0200 Subject: [PATCH 122/133] refactor gnome to use_headerbar --- src/yumex/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index f1a9542..496cbca 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -397,9 +397,9 @@ def _set_normal_cursor(self): class Window(BaseWindow): - def __init__(self, app, gnome=True, install_mode=False): + def __init__(self, app, use_headerbar=True, install_mode=False): super(Window, self).__init__(app) - self.gnome = gnome + self.use_headerbar = use_headerbar self.install_mode = install_mode # load custom styling from current theme self.load_custom_styling() @@ -500,7 +500,7 @@ def _setup_gui(self): box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.add(box) self._headerbar = self.get_ui('headerbar') - if self.gnome: # Gnome, headerbar in titlebar + if self.use_headerbar: # Gnome, headerbar in titlebar hb = self.get_ui('headerbar') rb = self.get_ui('right_header') lb = self.get_ui('left_header') @@ -1205,7 +1205,7 @@ def __init__(self): def on_activate(self, app): if not self.running: - self.window = Window(self, gnome=CONFIG.conf.headerbar, + self.window = Window(self, use_headerbar=CONFIG.conf.headerbar, install_mode=self.install_mode) app.add_window(self.window) self.running = True From 0c735b2dcfb1edf04d26c588bc3b545b77797a80 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 28 May 2021 15:50:45 +0200 Subject: [PATCH 123/133] cleanup Infobar & rename some methods --- src/yumex/__init__.py | 34 ++++++++++++++--------------- src/yumex/dnf_backend.py | 22 +++++++++---------- src/yumex/gui/dialogs.py | 2 +- src/yumex/gui/widgets.py | 47 ++++++++++++++++------------------------ 4 files changed, 48 insertions(+), 57 deletions(-) diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 496cbca..903b30b 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -87,7 +87,7 @@ def backend(self): def reset_cache(self): logger.debug('Refresh system cache') self.set_working(True, True) - self.infobar.info(_('Refreshing Repository Metadata')) + self.infobar.message(_('Refreshing Repository Metadata')) rc = self._root_backend.ExpireCache() self.set_working(False) if rc: @@ -571,7 +571,7 @@ def _setup_gui(self): self.app.set_accels_for_action('win.pref', ['Return']) def _setup_arch(self): - self.infobar.info(_('Downloading Repository Metadata')) + self.infobar.message(_('Downloading Repository Metadata')) # setup the arch filter self.arch_filter = self.backend.get_filter('arch') self.arch_filter.set_active(True) @@ -701,7 +701,7 @@ def _reset_on_error(self): def _reset(self): """Reset the gui on transaction completion.""" self.set_working(True) - self.infobar.info(_("Reloading package information...")) + self.infobar.message(_("Reloading package information...")) self.release_root_backend() self.backend.reload() # clear the package queue @@ -825,9 +825,9 @@ def _build_from_queue(self): raise misc.QueueEmptyError self.content.select_page('actions') self._populate_transaction() - self.infobar.info(_('Searching for dependencies')) + self.infobar.message(_('Searching for dependencies')) rc, result = self.backend.BuildTransaction() - self.infobar.info(_('Dependencies resolved')) + self.infobar.message(_('Dependencies resolved')) if not rc: raise misc.TransactionSolveError(result) return result @@ -841,7 +841,7 @@ def _get_transaction(self): def _run_transaction(self): """Run the current transaction.""" - self.infobar.info(_('Applying changes to the system')) + self.infobar.message(_('Applying changes to the system')) self.set_working(True, True) rc, result = self.backend.RunTransaction() # This can happen more than once (more gpg keys to be @@ -898,24 +898,24 @@ def _process_actions_installmode(self, action, package, always_yes, """ exit_msg = "" if action == 'install': - self.infobar.info(_('Installing package: %s') % package) + self.infobar.message(_('Installing package: %s') % package) exit_msg = _('%s was installed successfully') % package - self.infobar.info_sub(package) + self.infobar.message_sub(package) txmbrs = self.backend.Install(package) logger.debug('txmbrs: %s' % str(txmbrs)) elif action == 'remove': - self.infobar.info(_('Removing package: %s') % package) + self.infobar.message(_('Removing package: %s') % package) exit_msg = _('%s was removed successfully') % package - self.infobar.info_sub(package) + self.infobar.message_sub(package) txmbrs = self.backend.Remove(package) logger.debug('txmbrs: %s' % str(txmbrs)) elif action == 'update': - self.infobar.info(_('Updating all available updates')) + self.infobar.message(_('Updating all available updates')) exit_msg = _('Available updates was applied successfully') txmbrs = self.backend.Update('*') - self.infobar.info(_('Searching for dependencies')) + self.infobar.message(_('Searching for dependencies')) rc, result = self.backend.BuildTransaction() - self.infobar.info(_('Dependencies resolved')) + self.infobar.message(_('Dependencies resolved')) if rc: self.transaction_result.populate(result, '') if not always_yes: @@ -923,7 +923,7 @@ def _process_actions_installmode(self, action, package, always_yes, else: ok = True if ok: # Ok pressed - self.infobar.info(_('Applying changes to the system')) + self.infobar.message(_('Applying changes to the system')) self.backend.RunTransaction() self.release_root_backend() self.hide() @@ -948,7 +948,7 @@ def _process_actions(self, from_queue=True): - run the transaction """ self.set_working(True, True) - self.infobar.info(_('Preparing system for applying changes')) + self.infobar.message(_('Preparing system for applying changes')) try: if from_queue: result = self._build_from_queue() @@ -1119,7 +1119,7 @@ def on_search(self, widget, key, sch_type, fields): def on_filter_changed(self, widget, data): """Handle changes in package filter.""" - self.infobar.info(const.PACKAGE_LOAD_MSG[data]) + self.infobar.message(const.PACKAGE_LOAD_MSG[data]) self.set_working(True, True) if self.last_search: # we are searching pkgs = self._filter_search_pkgs(data) @@ -1137,7 +1137,7 @@ def on_filter_changed(self, widget, data): pkgs = self.backend.get_packages(data) # self.status.SetUpdateCount(len(pkgs)) self.info.set_package(None) - self.infobar.info(_('Adding packages to view')) + self.infobar.message(_('Adding packages to view')) self.package_view.populate(pkgs) self.set_working(False) self.infobar.hide() diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 7560d97..bd7e594 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -186,27 +186,27 @@ def on_TransactionEvent(self, event, data): if event == 'start-run': self.frontend.infobar.show_progress(True) elif event == 'download': - self.frontend.infobar.info(_('Downloading packages')) + self.frontend.infobar.message(_('Downloading packages')) elif event == 'pkg-to-download': self._dnl_packages = data elif event == 'signature-check': # self.frontend.infobar.show_progress(False) self.frontend.infobar.set_progress(0.0) - self.frontend.infobar.info(_('Checking package signatures')) + self.frontend.infobar.message(_('Checking package signatures')) self.frontend.infobar.set_progress(1.0) - self.frontend.infobar.info_sub('') + self.frontend.infobar.message_sub('') elif event == 'run-test-transaction': - # self.frontend.infobar.info(_('Testing Package Transactions')) # + # self.frontend.infobar.message(_('Testing Package Transactions')) # # User don't care pass elif event == 'run-transaction': self.frontend.infobar.show_progress(True) - self.frontend.infobar.info(_('Applying changes to the system')) - self.frontend.infobar.info_sub('') + self.frontend.infobar.message(_('Applying changes to the system')) + self.frontend.infobar.message_sub('') elif event == 'verify': self.frontend.infobar.show_progress(True) - self.frontend.infobar.info(_('Verify changes on the system')) - self.frontend.infobar.info_sub('') + self.frontend.infobar.message(_('Verify changes on the system')) + self.frontend.infobar.message_sub('') # elif event == '': elif event == 'fail': self.frontend.infobar.show_progress(False) @@ -225,7 +225,7 @@ def on_RPMProgress(self, package, action, te_current, # logger.debug('on_RPMProgress : [%s]', package) action_msg = const.RPM_ACTIONS.get(action, None) if action_msg: - self.frontend.infobar.info_sub(action_msg % name) + self.frontend.infobar.message_sub(action_msg % name) else: logger.info("RPM Progress: Undefinded action {}".format(action)) if ts_current > 0 and ts_current <= ts_total: @@ -244,7 +244,7 @@ def on_DownloadStart(self, num_files, num_bytes): self._files_to_download = num_files self._files_downloaded = 0 self.frontend.infobar.set_progress(0.0) - self.frontend.infobar.info_sub( + self.frontend.infobar.message_sub( # Translators: %d will be replaced with the number of files # to download; %s will be replaced with the preformatted # number of bytes to download + the prefix (k, M, etc.) @@ -276,7 +276,7 @@ def on_RepoMetaDataProgress(self, name, frac): values = (name, frac) logger.debug('on_RepoMetaDataProgress (root): %s', repr(values)) if frac == 0.0: - self.frontend.infobar.info_sub(name) + self.frontend.infobar.message_sub(name) else: self.frontend.infobar.set_progress(frac) diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 9c8f383..6ace52a 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -107,7 +107,7 @@ def get_settings(self): widget.set_value(getattr(CONFIG.conf, name)) self.on_clean_instonly() # get the repositories - self.base.infobar.info(_('Fetching repository information')) + self.base.infobar.message(_('Fetching repository information')) self.repos = self.base.backend.get_repositories() self.base.infobar.hide() self.repo_view.populate(self.repos) diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 844ff2f..6de51b5 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -42,6 +42,7 @@ class InfoProgressBar: def __init__(self, ui): self.ui = ui + self._is_visible = False self.infobar = ui.get_object("info_revealer") # infobar revealer self.label = ui.get_object("infobar_label") self.sublabel = ui.get_object("infobar_sublabel") @@ -49,10 +50,19 @@ def __init__(self, ui): self.spinner = ui.get_object("info_spinner") def _show_infobar(self, show=True): + ''' Show or hide the info bar''' + if show == self._is_visible: # check if infobar already is in the wanted state + return self.infobar.set_reveal_child(show) if show: self.infobar.show() self.spinner.start() + self.progress.show() + self.label.show() + self.sublabel.show() + self.label.set_text("") + self.sublabel.set_text("") + self._is_visible = True else: self.spinner.stop() self.infobar.hide() @@ -60,51 +70,32 @@ def _show_infobar(self, show=True): self.sublabel.hide() self.progress.hide() self.progress.set_show_text(False) - - def show_progress(self, state): - if state: - self.show_label() - else: - self._show_infobar(False) + self._is_visible = False def hide(self): self._show_infobar(False) - def hide_sublabel(self): - self.sublabel.hide() - - def show_label(self, msg=""): + def message(self, msg): + self._show_infobar(True) self.label.set_text(msg) - self.label.show() - def show_sublabel(self, msg=""): - self.sublabel.set_text(msg) - self.sublabel.show() - - def show_all(self): - self.show_label() - self.show_sublabel() - self.progress.show() - - def info(self, msg): + def message_sub(self, msg): self._show_infobar(True) - self.show_label(msg) + self.sublabel.set_text(msg) - def info_sub(self, msg): - self._show_infobar(True) - self.show_sublabel(msg) + def check_info(self): + if self.label.get_text() == "": + self.message(_("Getting Package Metadata")) def set_progress(self, frac, label=None): if frac >= 0.0 and frac <= 1.0: self._show_infobar() - self.progress.show() self.progress.set_fraction(frac) # make sure that the main label is shown, else the progress # looks bad. this normally happens when changlog or filelist info # is needed for a package and it will trigger the yum daemon to # download the need metadata. - if not self.label.get_property('visible'): - self.info(_("Getting Package Metadata")) + self.check_info() class SearchBar(GObject.GObject): From fd1aaa350ccf59c3be95cab27ff70374afd0d631 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sat, 29 May 2021 15:28:20 +0200 Subject: [PATCH 124/133] Code cleanup. Lint fixes PEP8 fixes remove uncommented code --- src/main.py | 11 ++-- src/yumex/__init__.py | 15 ++--- src/yumex/backend.py | 78 +++++++++++------------ src/yumex/config.py | 9 ++- src/yumex/const.py | 8 +-- src/yumex/dnf_backend.py | 14 ++--- src/yumex/gui/dialogs.py | 19 +++--- src/yumex/gui/views.py | 132 ++++++++++++++++++--------------------- src/yumex/gui/widgets.py | 33 +++------- src/yumex/misc.py | 16 ++--- src/yumex/updater.py | 8 +-- 11 files changed, 156 insertions(+), 187 deletions(-) diff --git a/src/main.py b/src/main.py index 5b89c63..d205366 100755 --- a/src/main.py +++ b/src/main.py @@ -21,16 +21,16 @@ """ Main launcher isort:skip_file """ -import gi # isort:skip -gi.require_version('Gtk', '3.0') # isort:skip -gi.require_version('Notify', '0.7') # isort:skip - -from yumex import YumexApplication import signal import subprocess import traceback import sys +import gi # isort:skip +gi.require_version('Gtk', '3.0') # isort:skip +gi.require_version('Notify', '0.7') # isort:skip + +from yumex import YumexApplication here = sys.path[0] if here != '/usr/bin': @@ -38,7 +38,6 @@ sys.path[0] = here print("set PYTHONPATH to %s" % here) - try: signal.signal(signal.SIGINT, signal.SIG_DFL) app = YumexApplication() diff --git a/src/yumex/__init__.py b/src/yumex/__init__.py index 903b30b..76964ff 100644 --- a/src/yumex/__init__.py +++ b/src/yumex/__init__.py @@ -125,9 +125,6 @@ def get_root_backend(self): 'DNF is locked by another process.\n\n' 'Yum Extender will exit') self.error_dialog.show(errmsg) - # close down and exit yum extender - # self.status.SetWorking(False) # reset working state - #self.status.SetYumexIsRunning(self.pid, False) sys.exit(1) return self._root_backend @@ -171,8 +168,6 @@ def exception_handler(self, e): self.release_root_backend(quit_dnfdaemon=True) except: pass - # self.status.SetWorking(False) # reset working state - #self.status.SetYumexIsRunning(self.pid, False) sys.exit(1) def _parse_error(self, value): @@ -204,6 +199,7 @@ def __init__(self, app): self.ui.add_from_file(const.DATA_DIR + "/yumex.ui") except: raise + # noinspection PyUnreachableCode dialogs.show_information( self, 'GtkBuilder ui file not found : ' + const.DATA_DIR + '/yumex.ui') @@ -222,6 +218,7 @@ def can_close(self): else: return True + # noinspection PyUnusedLocal def on_delete_event(self, *args): if self.is_working: self.iconify() @@ -305,6 +302,7 @@ def load_custom_styling(self): else: self.load_theme() + # noinspection PyUnusedLocal def on_window_state(self, widget, event): # save window current maximized state self.cur_maximized = event.new_window_state & \ @@ -459,9 +457,9 @@ def legacy_cleanup(self): ############################################################################### def rerun_installmode(self, args): - '''call when yumex gui is already running and is idle + """call when yumex gui is already running and is idle and second instance is excuted in installmode - ''' + """ self.get_ui('content_box').hide() WIDGETS_HIDE = ['left_buttons', 'right_buttons'] for widget in WIDGETS_HIDE: @@ -606,7 +604,6 @@ def _setup_group_page(self): hb.set_direction(Gtk.Orientation.HORIZONTAL) self.groups = views.GroupView(self.queue_view, self) self.groups.connect('group-changed', self.on_group_changed) - #hb.pack_start(self.groups, True, True, 0) # sw.add(hb) sw.add(self.groups) sw = self.get_ui('group_pkg_sw') @@ -1147,7 +1144,7 @@ def on_filter_changed(self, widget, data): self.package_view.set_header_click(False) def on_queue_refresh(self, widget, total): - '''Handle content of the queue is changed.''' + """Handle content of the queue is changed.""" if total > 0: self.apply_button.set_sensitive(True) else: diff --git a/src/yumex/backend.py b/src/yumex/backend.py index 285e520..1b23056 100644 --- a/src/yumex/backend.py +++ b/src/yumex/backend.py @@ -25,14 +25,14 @@ class Package: - ''' + """ Base class for a package, must be implemented in a sub class - ''' + """ def __init__(self, backend): self.backend = backend self.name = None - # self.version = None + #self.version = None self.arch = None self.repository = None self.summary = None @@ -45,34 +45,34 @@ def __init__(self, backend): self.selected = False def __str__(self): - ''' + """ Return a string representation of the package - ''' + """ return self.fullname @property def fullname(self): - ''' + """ fullname for the package :name-version.arch - ''' + """ return "%s-%s.%s" % (self.name, self.version, self.arch) def get_attribute(self, attr): - ''' + """ get attribute for the package :param attr: - ''' + """ if hasattr(self, attr): return getattr(self, attr) else: return self.do_get_atributes(attr) def do_get_atributes(self, attr): - ''' + """ get non local attributes for the package must be implemented in a sub class :param attr: - ''' + """ raise NotImplementedError() def exception_handler(self, e): @@ -83,13 +83,13 @@ def exception_handler(self, e): class Backend: - ''' + """ Base package manager handling class it contains a cache for Package based objects, so we don't have to get the twice from the package manager. must be implemented in a sub class - ''' + """ def __init__(self, frontend, filters=False): if filters: @@ -112,17 +112,17 @@ def exception_handler(self, e): self.frontend.exception_handler(e) def get_packages(self, pkg_filter): - ''' Get a list of Package objects based on a filter + """ Get a list of Package objects based on a filter ('installed', 'available'...) - ''' + """ pkgs = self.cache._get_packages(pkg_filter) return pkgs class BaseFilter: - '''Used as base for filters, there can filter a list of packages + """Used as base for filters, there can filter a list of packages based on a different conditions - ''' + """ def __init__(self, name, active=False): self.name = name @@ -132,7 +132,7 @@ def run(self, pkgs): if not self.active: return pkgs - def change(self): + def change(self, archs): pass def set_active(self, state): @@ -140,9 +140,9 @@ def set_active(self, state): class ArchFilter(BaseFilter): - ''' + """ Arch Filter to filter a list of packages by arch - ''' + """ def __init__(self, name, active=False): BaseFilter.__init__(self, name, active) @@ -158,9 +158,9 @@ def change(self, archs): class Filters: - ''' + """ Container to contain a number of filters based on the BaseFilter class - ''' + """ def __init__(self): self._filters = {} @@ -176,9 +176,7 @@ def delete(self, name): def run(self, pkgs): flt_pkgs = pkgs for name in self._filters: - #logger.debug('pre: %s : pkgs : %s' % (name,len(flt_pkgs))) flt_pkgs = self._filters[name].run(flt_pkgs) - #logger.debug('post: %s pkgs : %s' % (name,len(flt_pkgs))) return flt_pkgs def get(self, name): @@ -189,34 +187,34 @@ def get(self, name): class PackageCache: - ''' + """ Package cache to contain packages from backend, so we dont have get them more than once. - ''' + """ def __init__(self): - ''' + """ setup the cache - ''' + """ for flt in const.ACTIONS_FILTER.values(): setattr(self, flt, set()) self._populated = [] self._index = {} def reset(self): - ''' + """ reset the cache - ''' + """ for flt in const.ACTIONS_FILTER.values(): setattr(self, flt, set()) self._populated = [] self._index = {} def _get_packages(self, pkg_filter): - ''' + """ get a list of packages from the cache @param pkg_filter: the type of packages to get - ''' + """ pkgs = list(getattr(self, str(pkg_filter))) return pkgs @@ -224,8 +222,8 @@ def is_populated(self, pkg_filter): return str(pkg_filter) in self._populated def populate(self, pkg_filter, pkgs): - ''' - ''' + """ + """ self.find_packages(pkgs) self._populated.append(str(pkg_filter)) @@ -252,25 +250,25 @@ def find_packages(self, packages): class PackageCacheWithFilters(PackageCache): - ''' Package cache to contain packages from backend, + """ Package cache to contain packages from backend, so we dont have get them more than once. This version has filtering, so we can filter packages by fx. arch - ''' + """ def __init__(self): - ''' + """ setup the cache - ''' + """ PackageCache.__init__(self) self.filters = Filters() arch_flt = ArchFilter('arch') self.filters.add(arch_flt) def _get_packages(self, pkg_filter): - ''' + """ get a list of packages from the cache @param pkg_filter: the type of packages to get - ''' + """ pkgs = PackageCache._get_packages(self, str(pkg_filter)) pkgs = self.filters.run(pkgs) return pkgs diff --git a/src/yumex/config.py b/src/yumex/config.py index 070af9c..09cf5a1 100644 --- a/src/yumex/config.py +++ b/src/yumex/config.py @@ -263,8 +263,8 @@ def parse(self, url): return url def _schemelist(self): - '''Return a user friendly list of the allowed schemes - ''' + """Return a user friendly list of the allowed schemes + """ if len(self.schemes) < 1: return 'empty' elif len(self.schemes) == 1: @@ -578,8 +578,7 @@ def __init__(self): option.setup(self, name) def __str__(self): - out = [] - out.append('[%s]' % self._section) + out = ['[%s]' % self._section] for name, value in self.iteritems(): out.append('%s: %r' % (name, value)) return '\n'.join(out) @@ -660,7 +659,7 @@ def iteritems(self): """ # Use dir() so that we see inherited options too for name in self.iterkeys(): - yield (name, getattr(self, name)) + yield name, getattr(self, name) def write(self, fileobj, section=None, always=()): """Write out the configuration to a file-like object. diff --git a/src/yumex/const.py b/src/yumex/const.py index 24b5ea0..e773afa 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -55,9 +55,9 @@ '/usr/bin/rpm --eval %_arch', shell=True).decode("utf-8")[:-1] ARCH_DICT = { - "x86_64": set(['x86_64', 'i686', 'i386', 'noarch']), - "i386": set(['i686', 'i386', 'noarch']), - "arm": set(['armv7hl', 'noarch']) + "x86_64": {'x86_64', 'i686', 'i386', 'noarch'}, + "i386": {'i686', 'i386', 'noarch'}, + "arm": {'armv7hl', 'noarch'} } # arch for this platform @@ -66,7 +66,7 @@ else: # use x86_64 as fallback PLATFORM_ARCH = ARCH_DICT['x86_64'] -DBUS_ERR_RE = re.compile(r'.*GDBus.Error:([\w\.]*): (.*)$') +DBUS_ERR_RE = re.compile(r'.*GDBus.Error:([\w.]*): (.*)$') # Constants diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index bd7e594..2061747 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -82,7 +82,7 @@ def filename(self): """RPM filename of a package.""" # the full path for at localinstall is stored in repoid if self.action == 'li': - return self.repoid + return self.repository else: return "%s-%s.%s.%s.rpm" % (self.name, self.version, self.release, self.arch) @@ -228,7 +228,7 @@ def on_RPMProgress(self, package, action, te_current, self.frontend.infobar.message_sub(action_msg % name) else: logger.info("RPM Progress: Undefinded action {}".format(action)) - if ts_current > 0 and ts_current <= ts_total: + if 0 < ts_current <= ts_total: frac = float(ts_current) / float(ts_total) self.frontend.infobar.set_progress(frac, label=num) @@ -239,8 +239,6 @@ def on_GPGImport(self, pkg_id, userid, hexkeyid, keyurl, timestamp): def on_DownloadStart(self, num_files, num_bytes): """Starting a new parallel download batch.""" - #values = (num_files, num_bytes) - #print('on_DownloadStart : %s' % (repr(values))) self._files_to_download = num_files self._files_downloaded = 0 self.frontend.infobar.set_progress(0.0) @@ -255,15 +253,11 @@ def on_DownloadStart(self, num_files, num_bytes): def on_DownloadProgress(self, name, frac, total_frac, total_files): """Progress for a single element in the batch.""" - #values = (name, frac, total_frac, total_files) - #print('on_DownloadProgress : %s' % (repr(values))) num = '( %d/%d )' % (self._files_downloaded, self._files_to_download) self.frontend.infobar.set_progress(total_frac, label=num) def on_DownloadEnd(self, name, status, msg): """Download of af single element ended.""" - #values = (name, status, msg) - #print('on_DownloadEnd : %s' % (repr(values))) if status == -1 or status == 2: # download OK or already exists logger.debug('Downloaded : %s', name) self._files_downloaded += 1 @@ -328,7 +322,7 @@ def _update_config_options(self): def to_pkg_tuple(self, pkg_id): """Get package nevra & repoid from an package pkg_id""" (n, e, v, r, a, repo_id) = str(pkg_id).split(',') - return (n, e, v, r, a, repo_id) + return n, e, v, r, a, repo_id def _make_pkg_object(self, pkgs, flt): """Get a list Package objects from a list of pkg_ids & attrs. @@ -449,6 +443,8 @@ def search(self, search_attrs, keys, match_all, newest_only, tags): :param search_attrs: package attrs to search in :param keys: keys to search for :param match_all: match all keys + :param newest_only: + :param tags: """ attrs = ['summary', 'size', 'action'] pkgs = self.Search(search_attrs, keys, attrs, match_all, diff --git a/src/yumex/gui/dialogs.py b/src/yumex/gui/dialogs.py index 6ace52a..f9fbc65 100644 --- a/src/yumex/gui/dialogs.py +++ b/src/yumex/gui/dialogs.py @@ -117,7 +117,7 @@ def get_settings(self): self.get_themes() def on_clean_instonly(self, *args): - '''Handler for clean_instonly switch''' + """Handler for clean_instonly switch""" widget = self.base.ui.get_object('pref_clean_instonly') state = widget.get_active() postfix = 'installonly_limit' @@ -224,10 +224,10 @@ def clear(self): self.store.clear() def setup_view(self, view): - ''' + """ Setup the TreeView @param view: the TreeView widget - ''' + """ model = Gtk.TreeStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING) @@ -240,13 +240,13 @@ def setup_view(self, view): return model def create_text_column(self, hdr, view, colno, size=None): - ''' + """ Create at TreeViewColumn @param hdr: column header text @param view: the TreeView widget @param colno: the TreeStore column containing data for the column - @param min_width: the min column view (optional) - ''' + @param size: the min column view (optional) + """ cell = Gtk.CellRendererText() # Size Column column = Gtk.TreeViewColumn(hdr, cell, markup=colno) column.set_resizable(True) @@ -256,10 +256,11 @@ def create_text_column(self, hdr, view, colno, size=None): view.append_column(column) def populate(self, pkglist, dnl_size): - ''' + """ Populate the TreeView with data @param pkglist: list containing view data - ''' + @param dnl_size: + """ model = self.store self.store.clear() total_size = 0 @@ -307,7 +308,7 @@ def yes_no_dialog(window, msg, add_msg=None): dialog.set_transient_for(window) rc = dialog.run() dialog.destroy() - return(rc == Gtk.ResponseType.YES) + return rc == Gtk.ResponseType.YES def ask_for_gpg_import(window, values): diff --git a/src/yumex/gui/views.py b/src/yumex/gui/views.py index f14ed7a..c82df6e 100644 --- a/src/yumex/gui/views.py +++ b/src/yumex/gui/views.py @@ -33,26 +33,27 @@ class SelectionView(Gtk.TreeView): - ''' + """ A Base view with an selection column - ''' + """ def __init__(self): - ''' + """ init the view - @param widget: the gtk TreeView widget - ''' + """ Gtk.TreeView.__init__(self) self.store = None def create_text_column_num(self, hdr, colno, resize=True, size=None, markup=False): - ''' + """ Create a TreeViewColumn with data from a TreeStore column @param hdr: column header text @param colno: TreeStore column to get the data from @param resize: is resizable - ''' + @param size: + @param markup: + """ cell = Gtk.CellRendererText() if markup: column = Gtk.TreeViewColumn(hdr, cell, markup=colno) @@ -86,7 +87,6 @@ def create_text_column(self, hdr, prop, size, sortcol=None, self.append_column(column) if click_handler: column.set_clickable(True) - #column.connect('clicked', click_handler) label = Gtk.Label(label=hdr) label.show() column.set_widget(label) @@ -101,11 +101,9 @@ def create_text_column(self, hdr, prop, size, sortcol=None, def create_selection_colunm(self, attr, click_handler=None, popup_handler=None, tooltip=None, icon=None): - '''Create an selection column, there get data via property function + """Create an selection column, there get data via property function and a key attr - - @param attr: key attr for property funtion - ''' + """ # Setup a selection column using a object attribute cell1 = Gtk.CellRendererToggle() # Selection cell1.set_property('activatable', True) @@ -133,10 +131,12 @@ def create_selection_colunm(self, attr, click_handler=None, widget.set_tooltip_text(tooltip) def create_selection_column_num(self, num, data_func=None, tooltip=None): - ''' + """ Create an selection column, there get data an TreeStore Column @param num: TreeStore column to get data from - ''' + @param data_func: + @param tooltip: + """ # Setup a selection column using a column num column = Gtk.TreeViewColumn(None, None) @@ -165,10 +165,9 @@ def create_selection_column_num(self, num, data_func=None, tooltip=None): def create_selection_text_column(self, hdr, select_func, text_attr, size=200): - ''' + """ Create an selection column, there get data an TreeStore Column - @param num: TreeStore column to get data from - ''' + """ # Setup a selection column using a column num column = Gtk.TreeViewColumn(hdr, None) @@ -188,28 +187,28 @@ def create_selection_text_column(self, hdr, select_func, text_attr, return column def get_data_text(self, column, cell, model, iterator, prop): - '''property function to get string data from a object in + """property function to get string data from a object in the TreeStore based on an attributes key - ''' + """ obj = model.get_value(iterator, 0) if obj: cell.set_property('text', getattr(obj, prop)) cell.set_property('foreground-rgba', obj.color) def get_data_bool(self, column, cell, model, iterator, prop): - '''Property function to get boolean data from a object in + """Property function to get boolean data from a object in the TreeStore based on an attributes key - ''' + """ obj = model.get_value(iterator, 0) cell.set_property("visible", True) if obj: cell.set_property("active", getattr(obj, prop)) def on_toggled(self, widget, path): - ''' + """ selection togged handler overload in child class - ''' + """ pass @@ -240,9 +239,9 @@ def __init__(self, qview, group_mode=False): self._click_header_active = False def _setup_model(self): - ''' + """ Setup the model and view - ''' + """ store = Gtk.ListStore(GObject.TYPE_PYOBJECT, str) self.set_model(store) if self.group_mode: @@ -357,7 +356,6 @@ def on_package_downgrade(self, widget, event, pkg, do_pkg): """Downgrade package right click menu handler""" if event.button == 1: # Left Click logger.debug('downgrade to : %s ', str(do_pkg)) - #pkg.action = 'do' pkg.queued = 'do' pkg.selected = True pkg.downgrade_po = do_pkg @@ -398,9 +396,9 @@ def on_section_header_clicked_group(self, widget): self._last_selected = [] def on_cursor_changed(self, widget): - ''' + """ a new group is selected in group view - ''' + """ if widget.get_selection(): (model, iterator) = widget.get_selection().get_selected() if model is not None and iterator is not None: @@ -412,9 +410,9 @@ def set_header_click(self, state): self._click_header_state = "" def select_all(self): - ''' + """ Select all packages in the view - ''' + """ for el in self.store: obj = el[0] if not obj.queued == obj.action: @@ -425,9 +423,9 @@ def select_all(self): self.queue_draw() def deselect_all(self): - ''' + """ Deselect all packages in the view - ''' + """ for el in self.store: obj = el[0] if obj.queued == obj.action: @@ -520,10 +518,10 @@ def on_toggled(self, widget, path): self.queueView.refresh() def togglePackage(self, obj): - ''' + """ Toggle the package queue status @param obj: - ''' + """ if obj.action == 'do' or obj.queued == 'do': self._toggle_downgrade(obj) else: @@ -568,9 +566,9 @@ def _toggle_downgrade(self, obj): self.queue_draw() def install_all(self): - ''' + """ Select all packages in the view - ''' + """ for el in self.store: obj = el[0] if not obj.queued == obj.action and obj.action == 'i': @@ -581,9 +579,9 @@ def install_all(self): self.queue_draw() def remove_all(self): - ''' + """ Select all packages in the view - ''' + """ for el in self.store: obj = el[0] if not obj.queued == obj.action and obj.action == 'r': @@ -595,16 +593,14 @@ def remove_all(self): class PackageQueue: - ''' + """ A Queue class to store selected packages/groups and the pending actions - ''' + """ def __init__(self): self.packages = {} self._setup_packages() - self.groups = {} - self.groups['i'] = {} - self.groups['r'] = {} + self.groups = {'i': {}, 'r': {}} self._name_arch_index = {} def _setup_packages(self): @@ -615,9 +611,7 @@ def clear(self): del self.packages self.packages = {} self._setup_packages() - self.groups = {} - self.groups['i'] = {} - self.groups['r'] = {} + self.groups = {'i': {}, 'r': {}} self._name_arch_index = {} def get(self, action=None): @@ -659,11 +653,11 @@ def has_pkg_with_name_arch(self, pkg): return na in self._name_arch_index def add_group(self, grp, action): - ''' + """ @param grp: Group object @param action: - ''' + """ logger.debug('add_group : %s - %s', grp.id, action) grps = self.groups[action] if grp.id not in grps: @@ -671,11 +665,11 @@ def add_group(self, grp, action): grp.selected = True def remove_group(self, grp, action): - ''' + """ @param grp: Group object @param action: - ''' + """ logger.debug('removeGroup : %s - %s', grp.id, action) grps = self.groups[action] if grp.id in grps: @@ -683,17 +677,17 @@ def remove_group(self, grp, action): grp.selected = False def remove_all_groups(self): - ''' + """ remove all groups from queue - ''' + """ for action in ('i', 'r'): for grp in self.groups[action]: self.remove_group(grp, action) def remove_groups(self, group_names): - ''' + """ remove groups from queue based on list of grp_ids - ''' + """ for action in ('i', 'r'): new_dict = {} grps = self.groups[action] @@ -736,9 +730,9 @@ def __init__(self, queue_menu): remove_menu.connect('activate', self.deleteSelected) def _setup_model(self): - ''' + """ Setup the model and view - ''' + """ model = Gtk.TreeStore(GObject.TYPE_STRING, GObject.TYPE_STRING) self.set_model(model) cell1 = Gtk.CellRendererText() @@ -773,21 +767,21 @@ def deleteSelected(self, widget=None): self.refresh() def on_QueueView_button_press_event(self, treeview, event): - ''' + """ Mouse button clicked in package view handler :param treeview: :param event: - ''' + """ if event.button == 3: # Right Click popup = self.queue_menu popup.popup(None, None, None, None, event.button, event.time) return True def filter_pkgs_from_list(self, rlist): - ''' + """ return packages in queue where str(pkg) is in a list @param rlist: - ''' + """ rclist = [] for action in const.QUEUE_PACKAGE_TYPES: pkg_list = self.queue.packages[action] @@ -920,9 +914,9 @@ def populate(self, data): self.is_populated = True def on_cursor_changed(self, widget): - ''' + """ a new History element is selected in history view - ''' + """ if widget.get_selection(): (model, iterator) = widget.get_selection().get_selected() if model is not None and iterator is not None: @@ -1195,7 +1189,6 @@ def setup_view(self): category = Gtk.CellRendererText() column.pack_start(category, False) - #column.add_attribute(category, 'markup', 1) column.set_cell_data_func(category, self.get_data_text, 'name') self.append_column(column) @@ -1203,9 +1196,9 @@ def setup_view(self): return model def get_data_text(self, column, cell, model, iterator, prop): - '''property function to get string data from a object in the + """property function to get string data from a object in the TreeStore based on an attributes key - ''' + """ obj = model.get_value(iterator, 0) if obj: cell.set_property('text', getattr(obj, prop)) @@ -1234,9 +1227,9 @@ def on_toggled(self, widget, path): self.queueView.refresh() def on_cursor_changed(self, widget): - ''' + """ a new group is selected in group view - ''' + """ if widget.get_selection(): (model, iterator) = widget.get_selection().get_selected() if model is not None and iterator is not None: @@ -1253,7 +1246,6 @@ def populate(self, data): self._groups = data self.set_model(self.model) for cat, catgrps in data: - #print( cat, catgrps) # cat: [category_id, category_name, category_desc] (catid, name, desc) = cat obj = Group(catid, name, desc, False, True) @@ -1310,10 +1302,10 @@ def grp_pixbuf(self, column, cell, model, iterator, data=None): cell.set_property('visible', False) def _get_pix(self, fn): - ''' + """ Get a pix buffer from a file, resize it to 24 px, if needed @param fn: - ''' + """ imgsize = 24 pix = GdkPixbuf.Pixbuf.new_from_file(fn) if pix.get_height() != imgsize or pix.get_width() != imgsize: diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 6de51b5..3140cb0 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -50,7 +50,7 @@ def __init__(self, ui): self.spinner = ui.get_object("info_spinner") def _show_infobar(self, show=True): - ''' Show or hide the info bar''' + """ Show or hide the info bar""" if show == self._is_visible: # check if infobar already is in the wanted state return self.infobar.set_reveal_child(show) @@ -88,7 +88,7 @@ def check_info(self): self.message(_("Getting Package Metadata")) def set_progress(self, frac, label=None): - if frac >= 0.0 and frac <= 1.0: + if 0.0 <= frac <= 1.0: self._show_infobar() self.progress.set_fraction(frac) # make sure that the main label is shown, else the progress @@ -418,13 +418,13 @@ def on_url_event(self, tag, widget, event, iterator): self._url_handler(url) def on_mouse_motion(self, widget, event, data=None): - ''' + """ Mouse movement handler for TextView :param widget: :param event: :param data: - ''' + """ window = widget.get_window(Gtk.TextWindowType.WIDGET) # Get x,y pos for widget w, x, y, mask = window.get_pointer() @@ -469,9 +469,9 @@ def add_url(self, text, url, newline=False): class PackageInfo(PackageDetails): - ''' + """ class for handling the Package Information view - ''' + """ def __init__(self, window, base): PackageDetails.__init__(self, window, self._url_handler) @@ -487,21 +487,21 @@ def on_filter_changed(self, widget, data): self.update() def set_package(self, pkg): - ''' + """ Set current active package to show information about in the Package Info view. :param pkg: package to set as active package - ''' + """ self.current_package = pkg self.win.set_working(True, True) self.update() self.win.set_working(False) def update(self): - ''' + """ update the information in the Package info view - ''' + """ self.clear() if self.current_package: if self.active_filter == 'desc': @@ -587,7 +587,6 @@ def _write_update_info(self, upd_info): head += ("%14s " % _("Release")) + ": %(id)s\n" head += ("%14s " % _("Type")) + ": " head += const.ADVISORY_TYPES[upd_info['type']] + "\n" - #head += ("%14s " % _("Status")) + ": %(status)s\n" head += ("%14s " % _("Issued")) + ": %(updated)s\n" head = head % upd_info @@ -612,18 +611,6 @@ def _write_update_info(self, upd_info): self.write(bug_msg) header = " " - # Add our CVE references - # if upd_info['references']: - # cves = [r for r in upd_info['references'] - # if r and r['type'] == 'cve'] - # if len(cves): - #cvelist = "" - #header = "CVE" - # for cve in cves: - #cvelist += "%14s : %s\n" % (header, cve['id']) - #header = " " - #head += cvelist[:-1].rstrip() + '\n\n' - desc = upd_info['description'] head += "\n%14s : %s\n" % (_("Description"), yumex.misc.format_block(desc, 17)) diff --git a/src/yumex/misc.py b/src/yumex/misc.py index eee58ca..6246ee0 100644 --- a/src/yumex/misc.py +++ b/src/yumex/misc.py @@ -73,7 +73,7 @@ def dbus_dnfsystem(cmd): def to_pkg_tuple(pkg_id): """Find the real package nevre & repoid from an package pkg_id""" (n, e, v, r, a, repo_id) = str(pkg_id).split(',') - return (n, e, v, r, a, repo_id) + return n, e, v, r, a, repo_id def list_to_string(pkg_list, first_delimitier, delimiter): @@ -119,12 +119,12 @@ def color_to_hex(color): def is_url(url): urls = re.findall( r'^http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+~]|' - r'[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', url) + r'[!*(),]|%[0-9a-fA-F][0-9a-fA-F])+', url) return urls def format_block(block, indent): - ''' Format a block of text so they get the same indentation''' + """ Format a block of text so they get the same indentation""" spaces = " " * indent lines = str(block).split('\n') result = lines[0] + "\n" @@ -144,9 +144,9 @@ def get_style_color(widget): def doGtkEvents(): - ''' + """ - ''' + """ while Gtk.events_pending(): # process Gtk events Gtk.main_iteration() @@ -225,7 +225,7 @@ def format_number(number, SI=0, space=' '): else: fmt = '%.0f%s%s' - return(fmt % (float(number or 0), space, symbols[depth])) + return fmt % (float(number or 0), space, symbols[depth]) def notify(summary, body): @@ -318,9 +318,9 @@ class SessionConf(config.BaseConfig): class Config(object): - ''' + """ Yum Extender Configuration class - ''' + """ WRITE_ALWAYS = ['autostart', 'update_interval', 'update_startup_delay', 'autocheck_updates', 'update_notify', 'update_showicon'] diff --git a/src/yumex/updater.py b/src/yumex/updater.py index bc20cbf..a7985f9 100644 --- a/src/yumex/updater.py +++ b/src/yumex/updater.py @@ -83,18 +83,18 @@ def __on_closed(self, notification): class _UpdateTimestamp: - ''' + """ a persistent timestamp. e.g. for storing the last update check - ''' + """ def __init__(self, file_name=TIMESTAMP_FILE): self.__time_file = file_name self.__last_time = -1 def get_last_time_diff(self): - ''' + """ returns time difference to last check in seconds >=0 or -1 on error - ''' + """ now = int(time.time()) if self.__last_time == -1: try: From ef7a77d416695c3912aa91da931df6cfd2c72b95 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sat, 29 May 2021 16:29:58 +0200 Subject: [PATCH 125/133] Code cleanup. --- src/yumex/backend.py | 3 --- src/yumex/dnf_backend.py | 16 ++++++---------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/yumex/backend.py b/src/yumex/backend.py index 1b23056..5b5e454 100644 --- a/src/yumex/backend.py +++ b/src/yumex/backend.py @@ -32,14 +32,11 @@ class Package: def __init__(self, backend): self.backend = backend self.name = None - #self.version = None self.arch = None self.repository = None self.summary = None - # self.description = None self.size = None self.action = None - # self.color = 'black' self.queued = False self.recent = False self.selected = False diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 2061747..5933ce6 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -43,8 +43,8 @@ def __init__(self, po_tuple, action, backend): (n, e, v, r, a, repo_id) = yumex.misc.to_pkg_tuple(self.pkg_id) self.name = n self.epoch = e - self.ver = v - self.rel = r + self.version = v + self.release = r self.arch = a self.repository = repo_id self.visible = True @@ -55,6 +55,10 @@ def __init__(self, po_tuple, action, backend): self.sizeM = yumex.misc.format_number(size) # cache self._description = None + self.action = action + self.queued = False + self.recent = False + self.selected = False def __str__(self): """String representation of the package object.""" @@ -69,14 +73,6 @@ def get_attribute(self, attr): """Get a given attribute for a package.""" return self.backend.GetAttribute(self.pkg_id, attr) - @property - def version(self): - return self.ver - - @property - def release(self): - return self.rel - @property def filename(self): """RPM filename of a package.""" From 86ce001ea6a31392be86a745230040b18c83f159 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sat, 29 May 2021 16:38:15 +0200 Subject: [PATCH 126/133] Fix: AttributeError: 'InfoProgressBar' object has no attribute 'show_progress' --- src/yumex/dnf_backend.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 5933ce6..48672c6 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -180,13 +180,12 @@ def __init__(self, frontend): def on_TransactionEvent(self, event, data): if event == 'start-run': - self.frontend.infobar.show_progress(True) + pass elif event == 'download': self.frontend.infobar.message(_('Downloading packages')) elif event == 'pkg-to-download': self._dnl_packages = data elif event == 'signature-check': - # self.frontend.infobar.show_progress(False) self.frontend.infobar.set_progress(0.0) self.frontend.infobar.message(_('Checking package signatures')) self.frontend.infobar.set_progress(1.0) @@ -196,18 +195,16 @@ def on_TransactionEvent(self, event, data): # User don't care pass elif event == 'run-transaction': - self.frontend.infobar.show_progress(True) self.frontend.infobar.message(_('Applying changes to the system')) self.frontend.infobar.message_sub('') elif event == 'verify': - self.frontend.infobar.show_progress(True) self.frontend.infobar.message(_('Verify changes on the system')) self.frontend.infobar.message_sub('') # elif event == '': elif event == 'fail': - self.frontend.infobar.show_progress(False) + self.frontend.infobar.hide() elif event == 'end-run': - self.frontend.infobar.show_progress(False) + self.frontend.infobar.hide() else: logger.debug('TransactionEvent : %s', event) From 16f1062be95e9e7a70ff5089da083a6f5ceac5b4 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sat, 29 May 2021 16:47:45 +0200 Subject: [PATCH 127/133] Joined Package & DnfPackage, no need for an abstract class --- src/yumex/backend.py | 55 ---------------------------------------- src/yumex/dnf_backend.py | 11 +++++--- 2 files changed, 8 insertions(+), 58 deletions(-) diff --git a/src/yumex/backend.py b/src/yumex/backend.py index 5b5e454..c39da39 100644 --- a/src/yumex/backend.py +++ b/src/yumex/backend.py @@ -24,61 +24,6 @@ logger = logging.getLogger('yumex.backend') -class Package: - """ - Base class for a package, must be implemented in a sub class - """ - - def __init__(self, backend): - self.backend = backend - self.name = None - self.arch = None - self.repository = None - self.summary = None - self.size = None - self.action = None - self.queued = False - self.recent = False - self.selected = False - - def __str__(self): - """ - Return a string representation of the package - """ - return self.fullname - - @property - def fullname(self): - """ - fullname for the package :name-version.arch - """ - return "%s-%s.%s" % (self.name, self.version, self.arch) - - def get_attribute(self, attr): - """ - get attribute for the package - :param attr: - """ - if hasattr(self, attr): - return getattr(self, attr) - else: - return self.do_get_atributes(attr) - - def do_get_atributes(self, attr): - """ - get non local attributes for the package - must be implemented in a sub class - :param attr: - """ - raise NotImplementedError() - - def exception_handler(self, e): - """ - send exceptions to the frontend - """ - self.backend.frontend.exception_handler(e) - - class Backend: """ Base package manager handling class diff --git a/src/yumex/dnf_backend.py b/src/yumex/dnf_backend.py index 48672c6..ab5c276 100644 --- a/src/yumex/dnf_backend.py +++ b/src/yumex/dnf_backend.py @@ -32,11 +32,11 @@ logger = logging.getLogger('yumex.yum_backend') -class DnfPackage(yumex.backend.Package): - """Abstract package object for a package in the package system.""" +class DnfPackage: + """package object for a package in the package system.""" def __init__(self, po_tuple, action, backend): - yumex.backend.Package.__init__(self, backend) + self.backend = backend (pkg_id, summary, size) = po_tuple self.pkg_id = pkg_id self.action = action @@ -156,6 +156,11 @@ def is_update(self): """Package is an update/replacement to another package.""" return self.action == 'o' or self.action == 'u' + def exception_handler(self, e): + """ + send exceptions to the frontend + """ + self.backend.frontend.exception_handler(e) class DnfRootBackend(yumex.backend.Backend, dnfdaemon.client.Client): """Backend to do all the dnf related actions """ From 3fe93f3aca22ddcf9c84d761e2ec3b4ba82720a7 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Sun, 30 May 2021 20:25:30 +0200 Subject: [PATCH 128/133] reworked the look of the infobar --- src/yumex.ui | 77 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/src/yumex.ui b/src/yumex.ui index 0e2bcd8..cf8da1a 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -909,30 +909,27 @@ start Yum Extender True + info_content True False vertical - - - info_content + + True False - 10 - 10 - 10 - 10 - True - 6 - 5 + 5 + 5 True False start - 15 + baseline + 5 + 5 - + @@ -941,46 +938,68 @@ start Yum Extender - + + 25 + 25 True False - center + 10 + 5 10 - 10 - True + 5 + True - 1 - 1 + 0 + 0 + True False start - 20 + baseline + 10 + 10 + 0.5 - - + - 1 - 2 + 2 + 0 - - 40 - 40 + + progress + 400 True False - True + end + center + 10 + 10 + 10 + 10 - 0 + 4 + 0 + + + + + True + False + True + right + + + 3 0 - 3 From b92762d5114b808917eef69fc57872ccdb0497d5 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 4 Jun 2021 07:18:39 +0200 Subject: [PATCH 129/133] Make ui tweaks --- misc/themes/Dracula.theme | 8 ++++++ src/yumex.ui | 56 ++++++++++++++++++++++++++------------- src/yumex/gui/widgets.py | 14 +++++----- yumex-dnf.spec | 1 + 4 files changed, 53 insertions(+), 26 deletions(-) diff --git a/misc/themes/Dracula.theme b/misc/themes/Dracula.theme index 47cf459..36fa32b 100644 --- a/misc/themes/Dracula.theme +++ b/misc/themes/Dracula.theme @@ -61,6 +61,8 @@ paned separator{ #yumex_infobox text { background: @bg_color; color: @text_color; + font-family: 'Noto Sans', sans-serif; + font-family: 'Noto Sans', sans-serif; } #yumex_infobox .frame { @@ -78,6 +80,7 @@ paned separator{ #info_selector row:hover { color: @text_color; + transition: all 200ms ease-in 100ms; } #info_selector row.activatable:selected { @@ -87,6 +90,8 @@ paned separator{ border-left-width: 4px; border-left-color: @secondary; border-radius: 2px; + transition: all 200ms ease-in 100ms; + } /* Views */ @@ -123,12 +128,14 @@ paned separator{ border-left-color: @secondary; border-radius: 2px; /*padding-left: 10px;*/ + transition: all 200ms ease-in 100ms; } #package_sidebar row.activatable:hover { color: @text_color; background: @primary; + transition: all 200ms ease-in 100ms; } /* Package View */ @@ -211,4 +218,5 @@ paned separator{ #yumex_search button:hover { color: @text_color; background: @primary_light; + transition: all 200ms ease-in 100ms; } diff --git a/src/yumex.ui b/src/yumex.ui index cf8da1a..8a22ddf 100644 --- a/src/yumex.ui +++ b/src/yumex.ui @@ -753,44 +753,48 @@ start Yum Extender description #3584e4 - Normal - Monospace - 0.90 + Noto Sans + Noto Sans + 12 changelog-header #e01b24 - Normal - Monospace - 0.90 + Noto Sans + Noto Sans + 500 + 14 changelog-header_dark #e01b24 - Normal - Monospace - 0.90 + Noto Sans + Noto Sans + 500 + 14 changelog_dark #3584e4 - Normal - Monospace - 0.90 + Noto Sans + Noto Sans + semi-condensed + 14 changelog #3584e4 - Normal - Monospace + Noto Sans + Noto Sans + semi-condensed 0.90 @@ -800,7 +804,7 @@ start Yum Extender #3584e4 Normal Monospace - 0.90 + 11 @@ -809,16 +813,18 @@ start Yum Extender #3584e4 Normal Monospace - 0.90 + 12 + 0 description_dark #3584e4 - Normal - Monospace - 0.90 + Noto Sans + Noto Sans + semi-condensed + 12 @@ -1099,6 +1105,9 @@ start Yum Extender False start Updates + + + @@ -1116,6 +1125,9 @@ start Yum Extender False start Installed + + + @@ -1133,6 +1145,9 @@ start Yum Extender False start Available + + + @@ -1150,6 +1165,9 @@ start Yum Extender False start All + + + diff --git a/src/yumex/gui/widgets.py b/src/yumex/gui/widgets.py index 3140cb0..9c22361 100644 --- a/src/yumex/gui/widgets.py +++ b/src/yumex/gui/widgets.py @@ -593,7 +593,7 @@ def _write_update_info(self, upd_info): # if upd_info['updated'] and upd_info['updated'] != upd_info['issued']: # head += " Updated : %s" % upd_info['updated'] - self.write(head) + self.write(head, 'filelist') head = "" # Add our bugzilla references @@ -606,16 +606,16 @@ def _write_update_info(self, upd_info): for bz in bzs: (typ, bug, title, url) = bz bug_msg = '- %s' % title - self.write("%14s : " % header, newline=False) + self.write("%14s : " % header, 'filelist', newline=False) self.add_url(bug, url) - self.write(bug_msg) + self.write(bug_msg, 'filelist') header = " " desc = upd_info['description'] head += "\n%14s : %s\n" % (_("Description"), yumex.misc.format_block(desc, 17)) head += "\n" - self.write(head) + self.write(head, 'filelist') def _show_changelog(self): self.base.set_working(True, False) @@ -649,7 +649,7 @@ def _show_filelist(self): filelist = self.current_package.filelist if filelist: for fname in sorted(filelist): - self.write(fname) + self.write(fname, 'filelist') else: self.write(_("No filelist information is available")) self.base.set_working(False, False) @@ -659,10 +659,10 @@ def _show_requirements(self): reqs = self.current_package.requirements if reqs: for key in reqs: - self.write(key) + self.write(key, 'filelist') for pkg_id in reqs[key]: pkg = yumex.misc.pkg_id_to_full_name(pkg_id) - self.write(' --> {}'.format(pkg)) + self.write(' --> {}'.format(pkg), 'filelist') self.base.set_working(False, False) diff --git a/yumex-dnf.spec b/yumex-dnf.spec index b3d82ef..b4d7ebc 100644 --- a/yumex-dnf.spec +++ b/yumex-dnf.spec @@ -23,6 +23,7 @@ Requires: python3-pyxdg Requires: python3-dbus Requires: python3-cairo Requires: libnotify +Requires: google-noto-sans-fonts %description Graphical package tool for maintain packages on the system From 0c8a02ed725451899f2bac57d149bb97d190e806 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 4 Jun 2021 07:21:50 +0200 Subject: [PATCH 130/133] need python 3.8 --- yumex-dnf.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yumex-dnf.spec b/yumex-dnf.spec index b4d7ebc..772c497 100644 --- a/yumex-dnf.spec +++ b/yumex-dnf.spec @@ -14,7 +14,7 @@ BuildArch: noarch BuildRequires: desktop-file-utils BuildRequires: gettext BuildRequires: intltool -BuildRequires: python3-devel +BuildRequires: python3-devel >= 3.8 BuildRequires: make Requires: python3-dnfdaemon >= 0.3.10 From 0e3b04fe07f3b231a6751dec3cc2b7327df43622 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 4 Jun 2021 07:22:37 +0200 Subject: [PATCH 131/133] add PyCharm project config --- .idea/.gitignore | 3 +++ .idea/inspectionProfiles/Project_Default.xml | 11 +++++++++++ .idea/inspectionProfiles/profiles_settings.xml | 7 +++++++ .idea/misc.xml | 4 ++++ .idea/modules.xml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ .idea/yumex-dnf.iml | 14 ++++++++++++++ 7 files changed, 53 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/yumex-dnf.iml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..53f0707 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..dd4c951 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d56657a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..bf952be --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/yumex-dnf.iml b/.idea/yumex-dnf.iml new file mode 100644 index 0000000..d4bcf08 --- /dev/null +++ b/.idea/yumex-dnf.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file From b8e9116d3d6c64e8e9d21e370ec1ba8956c6630d Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 4 Jun 2021 07:39:10 +0200 Subject: [PATCH 132/133] bumped version to 4.4.0 --- src/yumex/const.py | 2 +- yumex-dnf.spec | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/yumex/const.py b/src/yumex/const.py index e773afa..a2786da 100644 --- a/src/yumex/const.py +++ b/src/yumex/const.py @@ -27,7 +27,7 @@ from yumex.misc import _ -VERSION = "4.4.3" +VERSION = "4.4.0" NEEDED_DAEMON_API = 2 # The needed dnfdaemon API version diff --git a/yumex-dnf.spec b/yumex-dnf.spec index 772c497..628b51c 100644 --- a/yumex-dnf.spec +++ b/yumex-dnf.spec @@ -1,7 +1,7 @@ %global appname yumex Name: %{appname}-dnf -Version: 4.3.3 +Version: 4.4.0 Release: 1%{?dist} Summary: Yum Extender graphical package management tool @@ -69,6 +69,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %changelog +* Fri Jun 4 2021 Tim Lauridsen 4.4.0-1 +- bumped release to 4.4.0 (dev) + * Wed May 11 2016 Tim Lauridsen 4.3.3-1 - bumped release to 4.3.3 (dev) From dfc327556a32bf292bff1b929d12c5b1fea68753 Mon Sep 17 00:00:00 2001 From: Tim Lauridsen Date: Fri, 4 Jun 2021 07:39:10 +0200 Subject: [PATCH 133/133] updated ChangeLog --- ChangeLog | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/ChangeLog b/ChangeLog index 26e2d95..1207d92 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,130 @@ +2021-06-04 Tim Lauridsen + + * bumped version to 4.4.0 + * add PyCharm project config + * Make ui tweaks + +2021-05-29 Tim Lauridsen + + * Joined Package & DnfPackage, no need for an abstract class + * Code cleanup. + * Code cleanup. Lint fixes PEP8 fixes remove uncommented code + +2021-05-28 Tim Lauridsen + + * cleanup Infobar & rename some methods + * import sorting can be a mess :-) + * Fixed Lint issues & code formatting + +2021-05-24 Tim Lauridsen + + * disable group selection as group support is broken in dnfdaemon + +2021-05-23 Tim Lauridsen + + * Update 2 theme and remove one (too ugly) + +2021-05-22 Tim Lauridsen + + * Update One-Dark & Material-Green to changed CSS naming in .ui + * * UI cleanup * improve Dracula Theme * Remove color selection from pref. * + Add Dark mode switch to pref. + * Update copyright year & version to match spec + * * Added System (light + dark) there only set pkg list colors. * Add + Material-Green Theme * Added support for macro colors in themes + +2021-05-21 Tim Lauridsen + + * Added new themes and support for selecting themes in preferences. + +2021-05-20 Tim Lauridsen + + * Initial support for themes + +2021-05-17 Tim Lauridsen + + * Transfix pull, *.po update + +2019-09-01 Tim Lauridsen + + * better handling of RPM Progress events + * Fix colors to look better ona dark theme + +2016-11-18 Rafal Luzynski + + * Internationalization: Plurals fixed All occurrences of "P_" replaced with + "ngettext" which is correctly understood by gettext tools. Also ngettext() + applied to few more messages where it seemed to be necessary to distinguish + between plural and singular. At the same time, a reference to no longer + existing old_init.py removed from POTFILES.in. Closes #139 + +2016-08-29 Vaughan Agrez + + * Release version should be 4.3.3 + +2016-05-23 Christian Stadelmann + + * Improve error message markup Before this change, there was a space missing + after the first string and all packages were tried to print on one line. + * Fix pylint logging-not-lazy warnings ID:logging-not-lazy Specify string + format arguments as logging function parameters Reason: Performance, see + pylint documentation. + * deduplicate _fullname() function + * Remove old __future__ statements In python 2.x, some features were + optional, which required us to mark them as required using __future__. + "absolute_import" and "print_function" are available by default from 3.0 on, + thus these statements are not required any more. + * resort imports pylint: ID:wrong-import-order standard import […] comes + before […] New order: 1. imports from python standard library [empty line] + 2. imports from gi, hawkey, other system installed libraries [empty line] 3. + imports from dnfdaemon [empty line] 4. imports from yumex modules + * Fix pylint info simplifiable-if-statement ID:simplifiable-if-statement The + if statement can be replaced with 'return bool(test)' + * Don't use built-in symbols as variables any more + * Fix more pylint warnings related to whitespace and line length E271 + multiple spaces after keyword E302 expected 2 blank lines, found 1 W292 no + newline at end of file limit line length to 80 characters + * Remove possible logging-related bugs + * Remove unnecessary imports + * Fix pylint: anomalous-backslash-in-string warnings + ID:anomalous-backslash-in-string Anomalous backslash in string: […] String + constant might be missing an r prefix. + * Fix collection-related pylint warnings E713 test for membership should be + 'not in' + * Fix intendation-related pylint warnings Fix some pylint warnings related + to indentation: E122 continuation line missing indentation or outdented E124 + closing bracket does not match visual indentation E125 continuation line with + same indent as next logical line E127 continuation line over-indented for + visual indent E128 continuation line under-indented for visual indent E131 + continuation line unaligned for hanging indent + +2016-05-19 Christian Stadelmann + + * About Dialog: make window transient (#116) Windows without parents are + discouraged. Before this change and with G_ENABLE_DIAGNOSTIC=1 you'll see the + warning Gtk-Message: GtkDialog mapped without a transient parent. This is + discouraged. when opening the AboutDialog. + +2016-05-18 Tim Lauridsen + + * make the repo selection save work (#107) + +2016-05-16 Christian Stadelmann + + * Set window header margin only on non-gnome platforms Following the + discussion in #108 (and my own proposal) it looks like: 1. on gnome, header + margin breaks consistency with other applications 2. on non-gnome, header + margins are needed to ensure that window header and headerbox are not + touching each other + +2016-05-14 Christian Stadelmann + + * Put Popover creation into glade (yumex.ui) file + +2016-05-13 Tim Lauridsen + + * Only use a headerbar, when running gnome (#108) + 2016-04-29 Tim Lauridsen * Add python based ChangeLog generation without email addrs