diff --git a/rigo/rigo/ui/gtk3/widgets/notifications.py b/rigo/rigo/ui/gtk3/widgets/notifications.py
index 1df1aaf64..34c474f9e 100644
--- a/rigo/rigo/ui/gtk3/widgets/notifications.py
+++ b/rigo/rigo/ui/gtk3/widgets/notifications.py
@@ -447,17 +447,22 @@ class LicensesNotificationBox(NotificationBox):
self._entropy = entropy_client
self._licenses = license_map
- msg = _("%s Application or one of its "
- "dependencies is distributed with the following"
- " licenses: %s")
-
licenses = sorted(license_map.keys(),
key = lambda x: x.lower())
lic_txts = []
for lic in licenses:
lic_txt = "%s" % (lic, lic,)
lic_txts.append(lic_txt)
- msg = msg % (self._app.name, ", ".join(lic_txts),)
+
+ if app is None:
+ msg = _("You are required to review and accept"
+ " the following licenses before continuing: %s")
+ msg = msg % (", ".join(lic_txts),)
+ else:
+ msg = _("%s Application or one of its "
+ "dependencies is distributed with the following"
+ " licenses: %s")
+ msg = msg % (self._app.name, ", ".join(lic_txts),)
label = Gtk.Label()
label.set_markup(prepare_markup(msg))
@@ -529,6 +534,16 @@ class LicensesNotificationBox(NotificationBox):
with entropy.tools.codecs_fdopen(
tmp_fd, "w", etpConst['conf_encoding']) as tmp_f:
+ tmp_f.write("License: %s\n" % (
+ uri,))
+ apps = self._licenses.get(uri, [])
+ if apps:
+ tmp_f.write("Applications:\n")
+ for app in apps:
+ tmp_f.write("\t%s\n" % (app.name,))
+ if apps:
+ tmp_f.write("\n")
+ tmp_f.write("-" * 79 + "\n")
tmp_f.write(license_text)
tmp_f.flush()
subprocess.call(["xdg-open", tmp_path])
diff --git a/rigo/rigo_app.py b/rigo/rigo_app.py
index ab546e28b..c0f5493ba 100644
--- a/rigo/rigo_app.py
+++ b/rigo/rigo_app.py
@@ -1699,13 +1699,66 @@ class RigoServiceController(GObject.Object):
return accepted
+ def _upgrade_system_license_check(self):
+ """
+ Examine Applications that are going to be upgraded looking for
+ licenses to read and accept.
+ """
+ self._entropy.rwsem().reader_acquire()
+ try:
+ update, remove, fine, spm_fine = \
+ self._entropy.calculate_updates()
+ if not update:
+ return True
+ licenses = self._entropy.get_licenses_to_accept(update)
+ 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, [])
+ for pkg_match in pkg_matches:
+ app = Application(
+ self._entropy, self._entropy_ws,
+ pkg_match)
+ obj.append(app)
+
+ const_debug_write(
+ __name__,
+ "_system_upgrade_license_checks: "
+ "need to accept licenses: %s" % (license_map,))
+ ask_meta = {
+ 'sem': Semaphore(0),
+ 'forever': False,
+ 'res': None,
+ }
+ GLib.idle_add(self._notify_blocking_licenses,
+ ask_meta, None, license_map)
+ ask_meta['sem'].acquire()
+
+ const_debug_write(
+ __name__,
+ "_system_upgrade_license_checks: "
+ "unblock, accepted:: %s, forever: %s" % (
+ ask_meta['res'], ask_meta['forever'],))
+
+ if not ask_meta['res']:
+ return False
+ if ask_meta['forever']:
+ self._accept_licenses(license_map.keys())
+ return True
+
def _upgrade_system_checks(self):
"""
Examine System Upgrade Request before sending it to RigoDaemon.
"""
- # FIXME complete
- # add dep calculation checks
# add license check
+ accepted = self._upgrade_system_license_check()
+ if not accepted:
+ return False
+
return True
def _upgrade_system_unlocked(self, master, simulate):
@@ -2395,7 +2448,7 @@ class UpperNotificationViewController(NotificationViewController):
box.connect("update-request", self._on_update)
self.append(box)
- def _on_upgrade(self, *args):
+ def _on_upgrade(self, box):
"""
Callback requesting Packages Update.
"""