diff --git a/rigo/rigo/controllers/daemon.py b/rigo/rigo/controllers/daemon.py index a2f838b6d..4a6293670 100644 --- a/rigo/rigo/controllers/daemon.py +++ b/rigo/rigo/controllers/daemon.py @@ -945,14 +945,11 @@ class RigoServiceController(GObject.Object): if self._nc is not None: - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): def _key_func(x): return self._entropy.open_repository( x[1]).retrieveName(x[0]).lower() update.sort(key=_key_func) - finally: - self._entropy.rwsem().reader_release() def _on_upgrade(box): self._nc.remove(box) @@ -1028,12 +1025,9 @@ class RigoServiceController(GObject.Object): if self._confc is not None and self._nc is not None: - self._entropy.rwsem().reader_acquire() - try: - repository_id = self._entropy.installed_repository( - ).repository_id() - finally: - self._entropy.rwsem().reader_release() + with self._entropy.rwsem().reader(): + inst_repo = self._entropy.installed_repository() + repository_id = inst_repo.repository_id() config_updates = [] for root, source, dest, pkg_ids, auto in updates: @@ -1061,12 +1055,9 @@ class RigoServiceController(GObject.Object): "%s, normal: %s" % ( manual_package_ids, package_ids)) - self._entropy.rwsem().reader_acquire() - try: - repository_id = self._entropy.installed_repository( - ).repository_id() - finally: - self._entropy.rwsem().reader_release() + with self._entropy.rwsem().reader(): + inst_repo = self._entropy.installed_repository() + repository_id = inst_repo.repository_id() if manual_package_ids or package_ids: manual_apps = [] @@ -1121,11 +1112,8 @@ class RigoServiceController(GObject.Object): # so that Entropy.repositories() and other internal # metadata is consistent with the newly available # repositories. - self._entropy.rwsem().writer_acquire() - try: + with self._entropy.rwsem().writer(): self._entropy._validate_repositories() - finally: - self._entropy.rwsem().writer_release() local_activity = LocalActivityStates.UPDATING_REPOSITORIES # we don't expect to fail here, it would @@ -1627,12 +1615,8 @@ class RigoServiceController(GObject.Object): """ Return the Entropy Package Groups object. """ - self._entropy.rwsem().reader_acquire() - try: - groups = self._entropy.get_package_groups() - return groups - finally: - self._entropy.rwsem().reader_release() + with self._entropy.rwsem().reader(): + return self._entropy.get_package_groups() def list_repositories(self): """ @@ -1640,8 +1624,8 @@ class RigoServiceController(GObject.Object): repository_id. Each list item is a tuple composed by (repository_id, description, enabled/disabled) """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): + settings = self._entropy.Settings() repo_data = settings['repositories'] available = repo_data['available'] @@ -1657,8 +1641,6 @@ class RigoServiceController(GObject.Object): repositories.sort(key=lambda x: x[0]) return repositories - finally: - self._entropy.rwsem().reader_release() def enable_repository(self, repository_id): """ @@ -1971,8 +1953,7 @@ class RigoServiceController(GObject.Object): """ Release all the local package file repositories. """ - self._entropy.rwsem().writer_acquire() - try: + with self._entropy.rwsem().writer(): while True: try: repository_id = self._package_repositories.popleft() @@ -1980,8 +1961,6 @@ class RigoServiceController(GObject.Object): break self._entropy.remove_repository( repository_id) - finally: - self._entropy.rwsem().writer_release() def _release_local_resources(self, clear_avc=True, clear_avc_silent=False, @@ -1992,8 +1971,8 @@ class RigoServiceController(GObject.Object): For example, leaving EntropyRepository objects open would cause sqlite3 to deadlock. """ - self._entropy.rwsem().writer_acquire() - try: + with self._entropy.rwsem().writer(): + if clear_avc and self._avc is not None: if clear_avc_silent: self._avc.clear_silent_safe() @@ -2002,8 +1981,6 @@ class RigoServiceController(GObject.Object): self._entropy.close_repositories() if clear_callback is not None: clear_callback() - finally: - self._entropy.rwsem().writer_release() def _please_wait(self, show): """ @@ -2614,23 +2591,21 @@ class RigoServiceController(GObject.Object): """ Forward Application Package Install request to RigoDaemon. """ - self._entropy.rwsem().writer_acquire() - try: - package_matches = self._entropy.add_package_repository( - package_path) - except EntropyPackageException as exc: - def _notify(): - msg = _("Package Install Error: %s") % (exc,) - box = self.ServiceNotificationBox( - prepare_markup(msg), - Gtk.MessageType.ERROR, - context_id=self.PKG_INSTALL_CONTEXT_ID) - box.add_destroy_button(_("Okay")) - self._nc.append(box) - GLib.idle_add(_notify) - return - finally: - self._entropy.rwsem().writer_release() + with self._entropy.rwsem().writer(): + try: + package_matches = self._entropy.add_package_repository( + package_path) + except EntropyPackageException as exc: + def _notify(): + msg = _("Package Install Error: %s") % (exc,) + box = self.ServiceNotificationBox( + prepare_markup(msg), + Gtk.MessageType.ERROR, + context_id=self.PKG_INSTALL_CONTEXT_ID) + box.add_destroy_button(_("Okay")) + self._nc.append(box) + GLib.idle_add(_notify) + return accepted = False accepted_count = 0 @@ -2648,13 +2623,10 @@ class RigoServiceController(GObject.Object): accepted_count += 1 if accepted_count == 0: - self._entropy.rwsem().writer_acquire() - try: + with self._entropy.rwsem().writer(): for repository_id in repository_ids: self._entropy.remove_repository( repository_id) - finally: - self._entropy.rwsem().writer_release() else: for repository_id in repository_ids: self._package_repositories.append( @@ -2763,8 +2735,8 @@ class RigoServiceController(GObject.Object): Examine Applications that are going to be upgraded looking for licenses to read and accept. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): + outcome = self._entropy.calculate_updates() update = outcome['update'] @@ -2775,9 +2747,6 @@ class RigoServiceController(GObject.Object): if not licenses: return True - finally: - self._entropy.rwsem().reader_release() - license_map = {} for lic_id, pkg_matches in licenses.items(): obj = license_map.setdefault(lic_id, []) diff --git a/rigo/rigo/models/application.py b/rigo/rigo/models/application.py index 8ebcf2286..cc8fbad52 100644 --- a/rigo/rigo/models/application.py +++ b/rigo/rigo/models/application.py @@ -975,8 +975,7 @@ class Application(object): @property def name(self): """Show user visible name""" - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) name = repo.retrieveName(self._pkg_id) if name is None: @@ -986,8 +985,6 @@ class Application(object): name = " ".join([x.capitalize() for x in \ name.replace("-"," ").split()]) return escape_markup(name) - finally: - self._entropy.rwsem().reader_release() @property def path(self): @@ -1018,11 +1015,8 @@ class Application(object): Return whether this Application object describes an Installed one. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): return self._is_installed_app() - finally: - self._entropy.rwsem().reader_release() def _is_installed_app(self): """ @@ -1086,19 +1080,15 @@ class Application(object): application (rather than the available one), or None if not installed. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): return self._get_installed() - finally: - self._entropy.rwsem().reader_release() def is_updatable(self): """ Return if Application can be updated. With "updated" we also mean "downgraded". """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): inst_repo = self._entropy.installed_repository() repo = self._entropy.open_repository(self._repo_id) if repo is inst_repo: @@ -1117,8 +1107,6 @@ class Application(object): return False else: return True - finally: - self._entropy.rwsem().reader_release() def _get_removal_queue(self): """ @@ -1136,8 +1124,7 @@ class Application(object): Please note that if the Application is not removable, None is returned. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): queue = self._get_removal_queue() if queue is None: return None @@ -1148,8 +1135,6 @@ class Application(object): self._service, pkg_match) remove.append(app) return remove - finally: - self._entropy.rwsem().reader_release() def is_removable(self): """ @@ -1160,8 +1145,7 @@ class Application(object): if installed is not self: return installed.is_removable() - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): removable = self._entropy.validate_package_removal( self._pkg_id) if removable: @@ -1172,8 +1156,6 @@ class Application(object): return True except DependenciesNotRemovable: return False - finally: - self._entropy.rwsem().reader_release() def _get_install_queue(self): """ @@ -1206,31 +1188,28 @@ class Application(object): Apps that would need to be removed of this Application is installed. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): + try: + apps = [] + queues = self._get_install_queue() + if queues is None: + return apps + install, removal = queues + del install - apps = [] - queues = self._get_install_queue() - if queues is None: + inst_repo = self._entropy.installed_repository() + inst_repo_id = inst_repo.repository_id() + for inst_pkg_id in removal: + app = Application( + self._entropy, self._entropy_ws, + self._service, (inst_pkg_id, inst_repo_id)) + apps.append(app) return apps - install, removal = queues - del install - inst_repo = self._entropy.installed_repository() - inst_repo_id = inst_repo.repository_id() - for inst_pkg_id in removal: - app = Application( - self._entropy, self._entropy_ws, - self._service, (inst_pkg_id, inst_repo_id)) - apps.append(app) - return apps - - except DependenciesNotFound: - return None - except DependenciesCollision: - return None - finally: - self._entropy.rwsem().reader_release() + except DependenciesNotFound: + return None + except DependenciesCollision: + return None def get_install_queue(self): """ @@ -1241,42 +1220,40 @@ class Application(object): None is returned. """ app_install, app_remove = [], [] - self._entropy.rwsem().reader_acquire() - try: - queues = self._get_install_queue() - if queues is None: + with self._entropy.rwsem().reader(): + + try: + queues = self._get_install_queue() + if queues is None: + return None + install, removal = queues + + for pkg_match in install: + app = Application( + self._entropy, self._entropy_ws, + self._service, pkg_match) + app_install.append(app) + + inst_repo = self._entropy.installed_repository() + inst_repo_id = inst_repo.repository_id() + for inst_pkg_id in removal: + app = Application( + self._entropy, self._entropy_ws, + self._service, (inst_pkg_id, inst_repo_id)) + app_remove.append(app) + + return app_install, app_remove + + except DependenciesNotFound as err: + const_debug_write( + __name__, + "get_install_queue: DependenciesNotFound: %s" % (err,)) + return None + except DependenciesCollision as err: + const_debug_write( + __name__, + "get_install_queue: DependenciesCollision: %s" % (err,)) return None - install, removal = queues - - for pkg_match in install: - app = Application( - self._entropy, self._entropy_ws, - self._service, pkg_match) - app_install.append(app) - - inst_repo = self._entropy.installed_repository() - inst_repo_id = inst_repo.repository_id() - for inst_pkg_id in removal: - app = Application( - self._entropy, self._entropy_ws, - self._service, (inst_pkg_id, inst_repo_id)) - app_remove.append(app) - - return app_install, app_remove - - except DependenciesNotFound as err: - const_debug_write( - __name__, - "get_install_queue: DependenciesNotFound: %s" % (err,)) - return None - except DependenciesCollision as err: - const_debug_write( - __name__, - "get_install_queue: DependenciesCollision: %s" % (err,)) - return None - - finally: - self._entropy.rwsem().reader_release() def accept_licenses(self, install_queue): """ @@ -1285,8 +1262,7 @@ class Application(object): value. """ pkg_map = dict((x.get_details().pkg, x) for x in install_queue) - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): license_map = {} licenses = self._entropy.get_licenses_to_accept( list(pkg_map.keys())) @@ -1296,33 +1272,28 @@ class Application(object): for pkg_match in pkg_matches: obj.append(pkg_map[pkg_match]) return license_map - finally: - self._entropy.rwsem().reader_release() def is_installable(self): """ Return if Application can be installed or it's masked or one of its dependencies are. """ - self._entropy.rwsem().reader_acquire() - try: - queues = self._get_install_queue() - if queues is None: + with self._entropy.rwsem().reader(): + try: + queues = self._get_install_queue() + if queues is None: + return False + install, removal = queues + + # check licenses + license_map = self.accept_licenses(install) + if license_map: + raise Application.AcceptLicenseError(license_map) + + except DependenciesNotFound: + return False + except DependenciesCollision: return False - install, removal = queues - - # check licenses - license_map = self.accept_licenses(install) - if license_map: - raise Application.AcceptLicenseError(license_map) - - except DependenciesNotFound: - return False - except DependenciesCollision: - return False - - finally: - self._entropy.rwsem().reader_release() return True @@ -1333,20 +1304,16 @@ class Application(object): The actual semantics of this method in softwarecenter seems quite ambiguous to me. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return repo.isPackageIdAvailable(self._pkg_id) - finally: - self._entropy.rwsem().reader_release() def get_markup(self): """ Get Application markup text. """ name = self.name - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) if self._vanished_callback is not None: if not repo.isPackageIdAvailable(self._pkg_id): @@ -1371,8 +1338,6 @@ class Application(object): escape_markup(tag), escape_markup(description)) return text - finally: - self._entropy.rwsem().reader_release() def search(self, keyword): """ @@ -1388,8 +1353,7 @@ class Application(object): """ Get Application markup text (extended version). """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) if self._vanished_callback is not None: if not repo.isPackageIdAvailable(self._pkg_id): @@ -1457,8 +1421,6 @@ class Application(object): installed_str, ) return text - finally: - self._entropy.rwsem().reader_release() def get_info_markup(self): """ @@ -1466,8 +1428,7 @@ class Application(object): """ app_store_url = build_application_store_url(self, "") - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): lic_url = "%s/license/" % (etpConst['packages_website_url'],) repo = self._entropy.open_repository(self._repo_id) @@ -1572,8 +1533,6 @@ class Application(object): more_txt, ) return text - finally: - self._entropy.rwsem().reader_release() def get_review_stats(self, _still_visible_cb=None, cached=False): """ @@ -1581,8 +1540,7 @@ class Application(object): information about this Application, like votes and number of downloads. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): stat = ReviewStats(self) stat.ratings_average = ReviewStats.NO_RATING @@ -1612,8 +1570,6 @@ class Application(object): # otherwise 0 is shown stat.downloads_total = down return stat - finally: - self._entropy.rwsem().reader_release() def get_icon(self, _still_visible_cb=None, cached=False): """ @@ -1623,8 +1579,7 @@ class Application(object): by the Document object (or None) and cache hit information (True if got from local cache, False if not in local cache) """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) key_slot = repo.retrieveKeySlot(self._pkg_id) if key_slot is None: @@ -1650,8 +1605,6 @@ class Application(object): icon, cache_hit)) return icon, cache_hit - finally: - self._entropy.rwsem().reader_release() def download_comments(self, callback, offset=0): """ @@ -1659,8 +1612,7 @@ class Application(object): In case of missing comments (locally), None is returned. The actual outcome of this method is a DocumentList object. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) key_slot = repo.retrieveKeySlot(self._pkg_id) if key_slot is None: @@ -1679,8 +1631,6 @@ class Application(object): const_debug_write(__name__, "Application{%s}.download_comments called" % ( self._pkg_match,)) - finally: - self._entropy.rwsem().reader_release() def download_images(self, callback, offset=0): """ @@ -1688,8 +1638,7 @@ class Application(object): In case of missing comments (locally), None is returned. The actual outcome of this method is a DocumentList object. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) key_slot = repo.retrieveKeySlot(self._pkg_id) if key_slot is None: @@ -1708,8 +1657,6 @@ class Application(object): const_debug_write(__name__, "Application{%s}.download_images called" % ( self._pkg_match,)) - finally: - self._entropy.rwsem().reader_release() def is_webservice_available(self): """ @@ -1754,13 +1701,10 @@ class Application(object): redraw_callback=self._redraw_callback) def __str__(self): - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) atom = repo.retrieveAtom(self._pkg_id) return "(%s: %s)" % (self._pkg_match, atom) - finally: - self._entropy.rwsem().reader_release() def __repr__(self): return str(self) @@ -1800,24 +1744,18 @@ class AppDetails(object): Application, the Channel of the original repository shall be returned). """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return self._app._source_repository_id(repo) - finally: - self._entropy.rwsem().reader_release() @property def description(self): """ Return Application short description. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return repo.retrieveDescription(self._pkg_id) - finally: - self._entropy.rwsem().reader_release() @property def error(self): @@ -1829,8 +1767,7 @@ class AppDetails(object): Return human readable representation of the installation date, if installed, or None otherwise. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) inst_repo = self._entropy.installed_repository() if repo is inst_repo: @@ -1841,8 +1778,6 @@ class AppDetails(object): if pkg_id != -1: return entropy.tools.convert_unix_time_to_human_time( float(inst_repo.retrieveCreationDate(pkg_id))) - finally: - self._entropy.rwsem().reader_release() @property def date(self): @@ -1850,52 +1785,41 @@ class AppDetails(object): Return human readable representation of the date the Application has been last updated. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return entropy.tools.convert_unix_time_to_human_time( float(repo.retrieveCreationDate(self._pkg_id))) - finally: - self._entropy.rwsem().reader_release() @property def licenses(self): """ Return list of license identifiers for Application. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) licenses = repo.retrieveLicense(self._pkg_id) if not licenses: return [] return licenses.split() - finally: - self._entropy.rwsem().reader_release() @property def downsize(self): """ Return the download size in bytes. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return repo.retrieveSize(self._pkg_id) - finally: - self._entropy.rwsem().reader_release() @property def disksize(self): """ Return the disk size in bytes. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return repo.retrieveOnDiskSize(self._pkg_id) - finally: - self._entropy.rwsem().reader_release() + @property def humansize(self): @@ -1940,37 +1864,28 @@ class AppDetails(object): """ Return unmangled package name belonging to this Application. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return repo.retrieveName(self._pkg_id) - finally: - self._entropy.rwsem().reader_release() @property def fullname(self): """ Return unmangled package name belonging to this Application. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return repo.retrieveAtom(self._pkg_id) - finally: - self._entropy.rwsem().reader_release() @property def pkgkey(self): """ Return unmangled package key name belonging to this Application. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) key, slot = repo.retrieveKeySlot(self._pkg_id) return key - finally: - self._entropy.rwsem().reader_release() @property def signing_key_id(self): @@ -1984,11 +1899,8 @@ class AppDetails(object): """ Return Application version (without revision and tag). """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): return self._version - finally: - self._entropy.rwsem().reader_release() @property def _version(self): @@ -2007,9 +1919,6 @@ class AppDetails(object): """ Return Application official Website URL or None. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repo = self._entropy.open_repository(self._repo_id) return repo.retrieveHomepage(self._pkg_id) - finally: - self._entropy.rwsem().reader_release() diff --git a/rigo/rigo/ui/gtk3/controllers/application.py b/rigo/rigo/ui/gtk3/controllers/application.py index 22c34461e..07a5c2519 100644 --- a/rigo/rigo/ui/gtk3/controllers/application.py +++ b/rigo/rigo/ui/gtk3/controllers/application.py @@ -590,11 +590,8 @@ class ApplicationViewController(GObject.Object): """ Logout from any configured repository. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repositories = self._entropy.repositories() - finally: - self._entropy.rwsem().reader_release() for repository in repositories: webserv = self._entropy_ws.get(repository) diff --git a/rigo/rigo/ui/gtk3/controllers/applications.py b/rigo/rigo/ui/gtk3/controllers/applications.py index 17ae7baa5..7616f5a88 100644 --- a/rigo/rigo/ui/gtk3/controllers/applications.py +++ b/rigo/rigo/ui/gtk3/controllers/applications.py @@ -171,10 +171,7 @@ class ApplicationsViewController(GObject.Object): search_cmd, search_args = split_text[0], split_text[1:] sort = False - show_exact = search_cmd == ApplicationsViewController.SHOW_EXACT_MATCH - - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): matches = [] use_fallback = True @@ -246,8 +243,6 @@ class ApplicationsViewController(GObject.Object): if sort: matches.sort(key=self._sort_key) return matches - finally: - self._entropy.rwsem().reader_release() def install(self, dependency, simulate=False): """ @@ -257,11 +252,9 @@ class ApplicationsViewController(GObject.Object): const_debug_write( __name__, "install: %s" % (dependency,)) - self._entropy.rwsem().reader_acquire() - try: + + with self._entropy.rwsem().reader(): pkg_match = self._entropy.atom_match(dependency) - finally: - self._entropy.rwsem().reader_release() pkg_id, pkg_repo = pkg_match if pkg_id == -1: @@ -317,13 +310,11 @@ class ApplicationsViewController(GObject.Object): const_debug_write( __name__, "remove: %s" % (dependency,)) - self._entropy.rwsem().reader_acquire() - try: + + with self._entropy.rwsem().reader(): inst_repo = self._entropy.installed_repository() pkg_repo = inst_repo.repository_id() pkg_id, rc = inst_repo.atomMatch(dependency) - finally: - self._entropy.rwsem().reader_release() if pkg_id == -1: const_debug_write( @@ -382,16 +373,13 @@ class ApplicationsViewController(GObject.Object): " %s" % (app,)) matches.append(app.get_details().pkg) else: - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): inst_repo = self._entropy.installed_repository() repo_name = inst_repo.repository_id() matches.extend( [(-2, repo_name), (-5, repo_name), (-10, repo_name)]) - finally: - self._entropy.rwsem().reader_release() if matches: self.set_many_safe(matches, @@ -403,13 +391,10 @@ class ApplicationsViewController(GObject.Object): __name__, "__simulate_orphaned_apps: " "%s" % (text,)) - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): inst_repo = self._entropy.installed_repository() pkg_ids = inst_repo.searchPackages(text, just_id=True) manual_pkg_ids, rc = inst_repo.atomMatch(text, multiMatch=True) - finally: - self._entropy.rwsem().reader_release() def _notify(): self._service._unsupported_applications_signal( @@ -479,11 +464,8 @@ class ApplicationsViewController(GObject.Object): self.remove(sim_str) def _do_optimize_mirrors(): - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repository_ids = self._entropy.repositories() - finally: - self._entropy.rwsem().reader_release() self._service.optimize_mirrors(repository_ids) special_keys_map = { @@ -561,8 +543,7 @@ class ApplicationsViewController(GObject.Object): Setup "not found" message label and layout """ nf_box = self._not_found_box - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): # now self._not_found_label is available meant_packages = self._entropy.get_meant_packages( search_text) @@ -582,8 +563,6 @@ class ApplicationsViewController(GObject.Object): prepare_markup(_("did you mean %s?")) % ( escape_markup(name), escape_markup(name),),) - finally: - self._entropy.rwsem().reader_release() self._not_found_label.set_markup(msg) @@ -773,11 +752,8 @@ class ApplicationsViewController(GObject.Object): self._prefc.append(pref) def _optimize_mirrors(): - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repository_ids = self._entropy.repositories() - finally: - self._entropy.rwsem().reader_release() self._service.optimize_mirrors(repository_ids) pref = Preference( 50, _("Optimize Download Speed"), diff --git a/rigo/rigo/ui/gtk3/controllers/notifications.py b/rigo/rigo/ui/gtk3/controllers/notifications.py index 4c2e4132b..938464f21 100644 --- a/rigo/rigo/ui/gtk3/controllers/notifications.py +++ b/rigo/rigo/ui/gtk3/controllers/notifications.py @@ -139,8 +139,7 @@ class UpperNotificationViewController(NotificationViewController): Execute connectivity check basing on Entropy Web Services availability. """ - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): repositories = self._entropy.repositories() available = False for repository_id in repositories: @@ -153,8 +152,6 @@ class UpperNotificationViewController(NotificationViewController): if not available: GLib.idle_add(self._notify_connectivity_issues) - finally: - self._entropy.rwsem().reader_release() def _notify_connectivity_issues(self): """ diff --git a/rigo/rigo/ui/gtk3/widgets/notifications.py b/rigo/rigo/ui/gtk3/widgets/notifications.py index c741b3301..3e0216202 100644 --- a/rigo/rigo/ui/gtk3/widgets/notifications.py +++ b/rigo/rigo/ui/gtk3/widgets/notifications.py @@ -559,15 +559,12 @@ class LicensesNotificationBox(NotificationBox): if not repos: return - self._entropy.rwsem().reader_acquire() - try: + with self._entropy.rwsem().reader(): for repo_id in repos: repo = self._entropy.open_repository(repo_id) license_text = repo.retrieveLicenseText(uri) if license_text is not None: break - finally: - self._entropy.rwsem().reader_release() if license_text is not None: tmp_fd, tmp_path = const_mkstemp(suffix=".txt")