Merge lp:~robert-ancell/update-manager/ua-bionic-merge into lp:~ubuntu-core-dev/update-manager/bionic
- ua-bionic-merge
- Merge into bionic
Proposed by
Robert Ancell
Status: | Merged |
---|---|
Merged at revision: | 2841 |
Proposed branch: | lp:~robert-ancell/update-manager/ua-bionic-merge |
Merge into: | lp:~ubuntu-core-dev/update-manager/bionic |
Diff against target: |
353 lines (+112/-22) 5 files modified
UpdateManager/Core/UpdateList.py (+53/-13) UpdateManager/Dialogs.py (+4/-4) UpdateManager/UpdateManager.py (+28/-1) UpdateManager/UpdatesAvailable.py (+21/-4) debian/changelog (+6/-0) |
To merge this branch: | bzr merge lp:~robert-ancell/update-manager/ua-bionic-merge |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu Core Development Team | Pending | ||
Review via email: mp+435932@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Robert Ancell (robert-ancell) wrote : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'UpdateManager/Core/UpdateList.py' | |||
2 | --- UpdateManager/Core/UpdateList.py 2018-10-03 17:45:08 +0000 | |||
3 | +++ UpdateManager/Core/UpdateList.py 2023-01-18 03:42:01 +0000 | |||
4 | @@ -43,11 +43,12 @@ | |||
5 | 43 | 43 | ||
6 | 44 | 44 | ||
7 | 45 | class UpdateItem(): | 45 | class UpdateItem(): |
9 | 46 | def __init__(self, pkg, name, icon, to_remove): | 46 | def __init__(self, pkg, name, icon, to_remove, sensitive=True): |
10 | 47 | self.icon = icon | 47 | self.icon = icon |
11 | 48 | self.name = name | 48 | self.name = name |
12 | 49 | self.pkg = pkg | 49 | self.pkg = pkg |
13 | 50 | self.to_remove = to_remove | 50 | self.to_remove = to_remove |
14 | 51 | self.sensitive = sensitive | ||
15 | 51 | 52 | ||
16 | 52 | def is_selected(self): | 53 | def is_selected(self): |
17 | 53 | if not self.to_remove: | 54 | if not self.to_remove: |
18 | @@ -59,13 +60,13 @@ | |||
19 | 59 | class UpdateGroup(UpdateItem): | 60 | class UpdateGroup(UpdateItem): |
20 | 60 | _depcache = {} | 61 | _depcache = {} |
21 | 61 | 62 | ||
24 | 62 | def __init__(self, pkg, name, icon, to_remove): | 63 | def __init__(self, pkg, name, icon, to_remove, sensitive=True): |
25 | 63 | UpdateItem.__init__(self, pkg, name, icon, to_remove) | 64 | UpdateItem.__init__(self, pkg, name, icon, to_remove, sensitive) |
26 | 64 | self._items = set() | 65 | self._items = set() |
27 | 65 | self._deps = set() | 66 | self._deps = set() |
28 | 66 | self.core_item = None | 67 | self.core_item = None |
29 | 67 | if pkg is not None: | 68 | if pkg is not None: |
31 | 68 | self.core_item = UpdateItem(pkg, name, icon, to_remove) | 69 | self.core_item = UpdateItem(pkg, name, icon, to_remove, sensitive) |
32 | 69 | self._items.add(self.core_item) | 70 | self._items.add(self.core_item) |
33 | 70 | 71 | ||
34 | 71 | @property | 72 | @property |
35 | @@ -74,10 +75,11 @@ | |||
36 | 74 | all_items.extend(self._items) | 75 | all_items.extend(self._items) |
37 | 75 | return sorted(all_items, key=lambda a: a.name.lower()) | 76 | return sorted(all_items, key=lambda a: a.name.lower()) |
38 | 76 | 77 | ||
40 | 77 | def add(self, pkg, cache=None, eventloop_callback=None, to_remove=False): | 78 | def add(self, pkg, cache=None, eventloop_callback=None, to_remove=False, |
41 | 79 | sensitive=True): | ||
42 | 78 | name = utils.get_package_label(pkg) | 80 | name = utils.get_package_label(pkg) |
43 | 79 | icon = Gio.ThemedIcon.new("package") | 81 | icon = Gio.ThemedIcon.new("package") |
45 | 80 | self._items.add(UpdateItem(pkg, name, icon, to_remove)) | 82 | self._items.add(UpdateItem(pkg, name, icon, to_remove, sensitive)) |
46 | 81 | # If the pkg is in self._deps, stop here. We have already calculated | 83 | # If the pkg is in self._deps, stop here. We have already calculated |
47 | 82 | # the recursive dependencies for this package, no need to do it again. | 84 | # the recursive dependencies for this package, no need to do it again. |
48 | 83 | if cache and pkg.name in cache and pkg.name not in self._deps: | 85 | if cache and pkg.name in cache and pkg.name not in self._deps: |
49 | @@ -153,27 +155,29 @@ | |||
50 | 153 | 155 | ||
51 | 154 | 156 | ||
52 | 155 | class UpdateApplicationGroup(UpdateGroup): | 157 | class UpdateApplicationGroup(UpdateGroup): |
54 | 156 | def __init__(self, pkg, application, to_remove): | 158 | def __init__(self, pkg, application, to_remove, sensitive=True): |
55 | 157 | name = application.get_display_name() | 159 | name = application.get_display_name() |
56 | 158 | icon = application.get_icon() | 160 | icon = application.get_icon() |
57 | 159 | super(UpdateApplicationGroup, self).__init__(pkg, name, icon, | 161 | super(UpdateApplicationGroup, self).__init__(pkg, name, icon, |
59 | 160 | to_remove) | 162 | to_remove, sensitive) |
60 | 161 | 163 | ||
61 | 162 | 164 | ||
62 | 163 | class UpdatePackageGroup(UpdateGroup): | 165 | class UpdatePackageGroup(UpdateGroup): |
64 | 164 | def __init__(self, pkg, to_remove): | 166 | def __init__(self, pkg, to_remove, sensitive=True): |
65 | 165 | name = utils.get_package_label(pkg) | 167 | name = utils.get_package_label(pkg) |
66 | 166 | icon = Gio.ThemedIcon.new("package") | 168 | icon = Gio.ThemedIcon.new("package") |
68 | 167 | super(UpdatePackageGroup, self).__init__(pkg, name, icon, to_remove) | 169 | super(UpdatePackageGroup, self).__init__(pkg, name, icon, to_remove, |
69 | 170 | sensitive) | ||
70 | 168 | 171 | ||
71 | 169 | 172 | ||
72 | 170 | class UpdateSystemGroup(UpdateGroup): | 173 | class UpdateSystemGroup(UpdateGroup): |
74 | 171 | def __init__(self, cache, to_remove): | 174 | def __init__(self, cache, to_remove, sensitive=True): |
75 | 172 | # Translators: the %s is a distro name, like 'Ubuntu' and 'base' as in | 175 | # Translators: the %s is a distro name, like 'Ubuntu' and 'base' as in |
76 | 173 | # the core components and packages. | 176 | # the core components and packages. |
77 | 174 | name = _("%s base") % utils.get_ubuntu_flavor_name(cache=cache) | 177 | name = _("%s base") % utils.get_ubuntu_flavor_name(cache=cache) |
78 | 175 | icon = Gio.ThemedIcon.new("distributor-logo") | 178 | icon = Gio.ThemedIcon.new("distributor-logo") |
80 | 176 | super(UpdateSystemGroup, self).__init__(None, name, icon, to_remove) | 179 | super(UpdateSystemGroup, self).__init__(None, name, icon, to_remove, |
81 | 180 | sensitive) | ||
82 | 177 | 181 | ||
83 | 178 | 182 | ||
84 | 179 | class UpdateOrigin(): | 183 | class UpdateOrigin(): |
85 | @@ -213,6 +217,7 @@ | |||
86 | 213 | self.update_groups = [] | 217 | self.update_groups = [] |
87 | 214 | self.security_groups = [] | 218 | self.security_groups = [] |
88 | 215 | self.kernel_autoremove_groups = [] | 219 | self.kernel_autoremove_groups = [] |
89 | 220 | self.ubuntu_pro_groups = [] | ||
90 | 216 | self.num_updates = 0 | 221 | self.num_updates = 0 |
91 | 217 | self.random = random.Random() | 222 | self.random = random.Random() |
92 | 218 | self.ignored_phased_updates = [] | 223 | self.ignored_phased_updates = [] |
93 | @@ -472,7 +477,7 @@ | |||
94 | 472 | 477 | ||
95 | 473 | return app_groups + pkg_groups | 478 | return app_groups + pkg_groups |
96 | 474 | 479 | ||
98 | 475 | def update(self, cache, eventloop_callback=None): | 480 | def update(self, cache, eventloop_callback=None, ua_security_packages=[]): |
99 | 476 | self.held_back = [] | 481 | self.held_back = [] |
100 | 477 | 482 | ||
101 | 478 | # do the upgrade | 483 | # do the upgrade |
102 | @@ -482,6 +487,34 @@ | |||
103 | 482 | upgrade_pkgs = [] | 487 | upgrade_pkgs = [] |
104 | 483 | kernel_autoremove_pkgs = [] | 488 | kernel_autoremove_pkgs = [] |
105 | 484 | 489 | ||
106 | 490 | class FakeUbuntuProPackageCandidate: | ||
107 | 491 | def __init__(self, source_name, version, size): | ||
108 | 492 | self.source_name = source_name | ||
109 | 493 | self.summary = source_name | ||
110 | 494 | self.description = source_name | ||
111 | 495 | self.version = version | ||
112 | 496 | self.size = size | ||
113 | 497 | self.downloadable = False | ||
114 | 498 | self.record = {} | ||
115 | 499 | |||
116 | 500 | class FakeUbuntuProPackage: | ||
117 | 501 | def __init__(self, package_name, version, size): | ||
118 | 502 | self.name = package_name | ||
119 | 503 | self.candidate = FakeUbuntuProPackageCandidate(package_name, | ||
120 | 504 | version, size) | ||
121 | 505 | self.marked_install = False | ||
122 | 506 | self.marked_upgrade = False | ||
123 | 507 | |||
124 | 508 | def mark_install(self): | ||
125 | 509 | pass | ||
126 | 510 | |||
127 | 511 | def mark_delete(self): | ||
128 | 512 | pass | ||
129 | 513 | fake_ua_packages = [] | ||
130 | 514 | for (package_name, version, size) in ua_security_packages: | ||
131 | 515 | fake_ua_packages.append(FakeUbuntuProPackage(package_name, | ||
132 | 516 | version, size)) | ||
133 | 517 | |||
134 | 485 | # Find all upgradable packages | 518 | # Find all upgradable packages |
135 | 486 | for pkg in cache: | 519 | for pkg in cache: |
136 | 487 | if pkg.is_upgradable or pkg.marked_install: | 520 | if pkg.is_upgradable or pkg.marked_install: |
137 | @@ -535,3 +568,10 @@ | |||
138 | 535 | eventloop_callback) | 568 | eventloop_callback) |
139 | 536 | self.kernel_autoremove_groups = self._make_groups( | 569 | self.kernel_autoremove_groups = self._make_groups( |
140 | 537 | cache, kernel_autoremove_pkgs, eventloop_callback, True) | 570 | cache, kernel_autoremove_pkgs, eventloop_callback, True) |
141 | 571 | if len(fake_ua_packages) > 0: | ||
142 | 572 | ubuntu_pro_group = UpdateGroup(None, | ||
143 | 573 | "Ubuntu Pro (enable in Settings…)", | ||
144 | 574 | None, False, False) | ||
145 | 575 | for package in fake_ua_packages: | ||
146 | 576 | ubuntu_pro_group.add(package) | ||
147 | 577 | self.ubuntu_pro_groups = [ubuntu_pro_group] | ||
148 | 538 | 578 | ||
149 | === modified file 'UpdateManager/Dialogs.py' | |||
150 | --- UpdateManager/Dialogs.py 2022-09-13 23:50:38 +0000 | |||
151 | +++ UpdateManager/Dialogs.py 2023-01-18 03:42:01 +0000 | |||
152 | @@ -161,10 +161,10 @@ | |||
153 | 161 | if self._is_livepatch_supported() and \ | 161 | if self._is_livepatch_supported() and \ |
154 | 162 | self.settings_button and \ | 162 | self.settings_button and \ |
155 | 163 | self.settings.get_int('launch-count') >= 4: | 163 | self.settings.get_int('launch-count') >= 4: |
160 | 164 | self.set_desc(_("<b>Tip:</b> You can use Livepatch to " | 164 | self.set_desc(_("<b>Tip:</b> You can use Livepatch with " |
161 | 165 | "keep your computer more secure between " | 165 | "Ubuntu Pro to keep your computer more " |
162 | 166 | "restarts.")) | 166 | "secure between restarts.")) |
163 | 167 | self.settings_button.set_label(_("Settings & Livepatch…")) | 167 | self.settings_button.set_label(_("Settings & Pro…")) |
164 | 168 | return | 168 | return |
165 | 169 | 169 | ||
166 | 170 | needs_reschedule = False | 170 | needs_reschedule = False |
167 | 171 | 171 | ||
168 | === modified file 'UpdateManager/UpdateManager.py' | |||
169 | --- UpdateManager/UpdateManager.py 2022-09-13 23:50:56 +0000 | |||
170 | +++ UpdateManager/UpdateManager.py 2023-01-18 03:42:01 +0000 | |||
171 | @@ -36,6 +36,7 @@ | |||
172 | 36 | 36 | ||
173 | 37 | import apt_pkg | 37 | import apt_pkg |
174 | 38 | import distro_info | 38 | import distro_info |
175 | 39 | import json | ||
176 | 39 | import os | 40 | import os |
177 | 40 | import subprocess | 41 | import subprocess |
178 | 41 | import sys | 42 | import sys |
179 | @@ -85,6 +86,7 @@ | |||
180 | 85 | self.unity = UnitySupport() | 86 | self.unity = UnitySupport() |
181 | 86 | self.controller = None | 87 | self.controller = None |
182 | 87 | self.cache = None | 88 | self.cache = None |
183 | 89 | self.ua_security_packages = [] | ||
184 | 88 | self.update_list = None | 90 | self.update_list = None |
185 | 89 | self.meta_release = None | 91 | self.meta_release = None |
186 | 90 | self.hwe_replacement_packages = None | 92 | self.hwe_replacement_packages = None |
187 | @@ -247,6 +249,27 @@ | |||
188 | 247 | cancelled_update, error_occurred) | 249 | cancelled_update, error_occurred) |
189 | 248 | self._start_pane(pane) | 250 | self._start_pane(pane) |
190 | 249 | 251 | ||
191 | 252 | def _get_ua_security_status(self): | ||
192 | 253 | self.ua_security_packages = [] | ||
193 | 254 | try: | ||
194 | 255 | p = subprocess.Popen(['ua', 'security-status', '--format=json'], | ||
195 | 256 | stdout=subprocess.PIPE) | ||
196 | 257 | except OSError: | ||
197 | 258 | pass | ||
198 | 259 | else: | ||
199 | 260 | while p.poll() is None: | ||
200 | 261 | while Gtk.events_pending(): | ||
201 | 262 | Gtk.main_iteration() | ||
202 | 263 | time.sleep(0.05) | ||
203 | 264 | s = json.load(p.stdout) | ||
204 | 265 | for package in s.get('packages', []): | ||
205 | 266 | status = package.get('status', '') | ||
206 | 267 | if status == 'pending_attach': | ||
207 | 268 | name = package.get('name', '') | ||
208 | 269 | version = package.get('version', '') | ||
209 | 270 | size = package.get('download_size', 0) | ||
210 | 271 | self.ua_security_packages.append((name, version, size)) | ||
211 | 272 | |||
212 | 250 | def _make_available_pane(self, install_count, need_reboot=False, | 273 | def _make_available_pane(self, install_count, need_reboot=False, |
213 | 251 | cancelled_update=False, error_occurred=False): | 274 | cancelled_update=False, error_occurred=False): |
214 | 252 | self._check_hwe_support_status() | 275 | self._check_hwe_support_status() |
215 | @@ -406,9 +429,13 @@ | |||
216 | 406 | Gtk.main_iteration() | 429 | Gtk.main_iteration() |
217 | 407 | iterate() | 430 | iterate() |
218 | 408 | 431 | ||
219 | 432 | self._get_ua_security_status() | ||
220 | 433 | |||
221 | 409 | self.update_list = UpdateList(self) | 434 | self.update_list = UpdateList(self) |
222 | 410 | try: | 435 | try: |
224 | 411 | self.update_list.update(self.cache, eventloop_callback=iterate) | 436 | self.update_list.update(self.cache, eventloop_callback=iterate, |
225 | 437 | ua_security_packages=self. | ||
226 | 438 | ua_security_packages) | ||
227 | 412 | except SystemError as e: | 439 | except SystemError as e: |
228 | 413 | header = _("Could not calculate the upgrade") | 440 | header = _("Could not calculate the upgrade") |
229 | 414 | desc = _("An unresolvable problem occurred while " | 441 | desc = _("An unresolvable problem occurred while " |
230 | 415 | 442 | ||
231 | === modified file 'UpdateManager/UpdatesAvailable.py' | |||
232 | --- UpdateManager/UpdatesAvailable.py 2018-03-18 21:43:58 +0000 | |||
233 | +++ UpdateManager/UpdatesAvailable.py 2023-01-18 03:42:01 +0000 | |||
234 | @@ -74,7 +74,8 @@ | |||
235 | 74 | # - screen reader does not say "Downloaded" for downloaded updates | 74 | # - screen reader does not say "Downloaded" for downloaded updates |
236 | 75 | 75 | ||
237 | 76 | # list constants | 76 | # list constants |
239 | 77 | (LIST_NAME, LIST_UPDATE_DATA, LIST_SIZE, LIST_TOGGLE_ACTIVE) = range(4) | 77 | (LIST_NAME, LIST_UPDATE_DATA, LIST_SIZE, LIST_TOGGLE_ACTIVE, |
240 | 78 | LIST_SENSITIVE) = range(5) | ||
241 | 78 | 79 | ||
242 | 79 | # NetworkManager enums | 80 | # NetworkManager enums |
243 | 80 | from .Core.roam import NetworkManagerHelper | 81 | from .Core.roam import NetworkManagerHelper |
244 | @@ -261,7 +262,7 @@ | |||
245 | 261 | changes_buffer.create_tag("versiontag", weight=Pango.Weight.BOLD) | 262 | changes_buffer.create_tag("versiontag", weight=Pango.Weight.BOLD) |
246 | 262 | 263 | ||
247 | 263 | # the treeview (move into it's own code!) | 264 | # the treeview (move into it's own code!) |
249 | 264 | self.store = Gtk.TreeStore(str, GObject.TYPE_PYOBJECT, str, bool) | 265 | self.store = Gtk.TreeStore(str, GObject.TYPE_PYOBJECT, str, bool, bool) |
250 | 265 | self.treeview_update.set_model(None) | 266 | self.treeview_update.set_model(None) |
251 | 266 | 267 | ||
252 | 267 | self.image_restart.set_from_gicon(self.get_restart_icon(), | 268 | self.image_restart.set_from_gicon(self.get_restart_icon(), |
253 | @@ -293,6 +294,8 @@ | |||
254 | 293 | pkg_column.pack_start(pkg_toggle_renderer, False) | 294 | pkg_column.pack_start(pkg_toggle_renderer, False) |
255 | 294 | pkg_column.add_attribute(pkg_toggle_renderer, | 295 | pkg_column.add_attribute(pkg_toggle_renderer, |
256 | 295 | 'active', LIST_TOGGLE_ACTIVE) | 296 | 'active', LIST_TOGGLE_ACTIVE) |
257 | 297 | pkg_column.add_attribute(pkg_toggle_renderer, | ||
258 | 298 | 'sensitive', LIST_SENSITIVE) | ||
259 | 296 | pkg_column.set_cell_data_func(pkg_toggle_renderer, | 299 | pkg_column.set_cell_data_func(pkg_toggle_renderer, |
260 | 297 | self.pkg_toggle_renderer_data_func) | 300 | self.pkg_toggle_renderer_data_func) |
261 | 298 | 301 | ||
262 | @@ -319,6 +322,8 @@ | |||
263 | 319 | size_column = Gtk.TreeViewColumn(_("Download"), size_renderer, | 322 | size_column = Gtk.TreeViewColumn(_("Download"), size_renderer, |
264 | 320 | text=LIST_SIZE) | 323 | text=LIST_SIZE) |
265 | 321 | size_column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) | 324 | size_column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) |
266 | 325 | size_column.add_attribute(size_renderer, | ||
267 | 326 | 'sensitive', LIST_SENSITIVE) | ||
268 | 322 | self.treeview_update.append_column(size_column) | 327 | self.treeview_update.append_column(size_column) |
269 | 323 | 328 | ||
270 | 324 | self.treeview_update.set_headers_visible(True) | 329 | self.treeview_update.set_headers_visible(True) |
271 | @@ -404,8 +409,11 @@ | |||
272 | 404 | def restart_icon_renderer_data_func(self, cell_layout, renderer, model, | 409 | def restart_icon_renderer_data_func(self, cell_layout, renderer, model, |
273 | 405 | iter, user_data): | 410 | iter, user_data): |
274 | 406 | data = model.get_value(iter, LIST_UPDATE_DATA) | 411 | data = model.get_value(iter, LIST_UPDATE_DATA) |
275 | 412 | sensitive = model.get_value(iter, LIST_SENSITIVE) | ||
276 | 407 | path = model.get_path(iter) | 413 | path = model.get_path(iter) |
277 | 408 | 414 | ||
278 | 415 | renderer.set_sensitive(sensitive) | ||
279 | 416 | |||
280 | 409 | requires_restart = False | 417 | requires_restart = False |
281 | 410 | if data.item and data.item.pkg: | 418 | if data.item and data.item.pkg: |
282 | 411 | requires_restart = self.pkg_requires_restart(data.item.pkg) | 419 | requires_restart = self.pkg_requires_restart(data.item.pkg) |
283 | @@ -433,6 +441,7 @@ | |||
284 | 433 | if data.item: | 441 | if data.item: |
285 | 434 | activatable = data.item.pkg.name not in self.list.held_back | 442 | activatable = data.item.pkg.name not in self.list.held_back |
286 | 435 | inconsistent = False | 443 | inconsistent = False |
287 | 444 | renderer.set_sensitive(data.item.sensitive) | ||
288 | 436 | elif data.group: | 445 | elif data.group: |
289 | 437 | activatable = True | 446 | activatable = True |
290 | 438 | inconsistent = data.group.selection_is_inconsistent() | 447 | inconsistent = data.group.selection_is_inconsistent() |
291 | @@ -485,8 +494,11 @@ | |||
292 | 485 | def pkg_label_renderer_data_func(self, cell_layout, renderer, model, | 494 | def pkg_label_renderer_data_func(self, cell_layout, renderer, model, |
293 | 486 | iter, user_data): | 495 | iter, user_data): |
294 | 487 | data = model.get_value(iter, LIST_UPDATE_DATA) | 496 | data = model.get_value(iter, LIST_UPDATE_DATA) |
295 | 497 | sensitive = model.get_value(iter, LIST_SENSITIVE) | ||
296 | 488 | name = GLib.markup_escape_text(model.get_value(iter, LIST_NAME)) | 498 | name = GLib.markup_escape_text(model.get_value(iter, LIST_NAME)) |
297 | 489 | 499 | ||
298 | 500 | renderer.set_sensitive(sensitive) | ||
299 | 501 | |||
300 | 490 | if data.group: | 502 | if data.group: |
301 | 491 | markup = name | 503 | markup = name |
302 | 492 | elif data.item: | 504 | elif data.item: |
303 | @@ -997,6 +1009,7 @@ | |||
304 | 997 | name, | 1009 | name, |
305 | 998 | UpdateData(groups, None, None), | 1010 | UpdateData(groups, None, None), |
306 | 999 | humanize_size(total_size), | 1011 | humanize_size(total_size), |
307 | 1012 | True, | ||
308 | 1000 | True | 1013 | True |
309 | 1001 | ] | 1014 | ] |
310 | 1002 | return self.store.append(None, header_row) | 1015 | return self.store.append(None, header_row) |
311 | @@ -1020,7 +1033,8 @@ | |||
312 | 1020 | group.name, | 1033 | group.name, |
313 | 1021 | UpdateData(None, group, group_is_item), | 1034 | UpdateData(None, group, group_is_item), |
314 | 1022 | humanize_size(group.get_total_size()), | 1035 | humanize_size(group.get_total_size()), |
316 | 1023 | True | 1036 | True, |
317 | 1037 | group.sensitive | ||
318 | 1024 | ] | 1038 | ] |
319 | 1025 | group_iter = self.store.append(None, group_row) | 1039 | group_iter = self.store.append(None, group_row) |
320 | 1026 | 1040 | ||
321 | @@ -1031,7 +1045,8 @@ | |||
322 | 1031 | item.name, | 1045 | item.name, |
323 | 1032 | UpdateData(None, None, item), | 1046 | UpdateData(None, None, item), |
324 | 1033 | humanize_size(getattr(item.pkg.candidate, "size", 0)), | 1047 | humanize_size(getattr(item.pkg.candidate, "size", 0)), |
326 | 1034 | True | 1048 | True, |
327 | 1049 | group.sensitive | ||
328 | 1035 | ] | 1050 | ] |
329 | 1036 | self.store.append(group_iter, item_row) | 1051 | self.store.append(group_iter, item_row) |
330 | 1037 | 1052 | ||
331 | @@ -1063,6 +1078,8 @@ | |||
332 | 1063 | _("Unused kernel updates to be removed"), | 1078 | _("Unused kernel updates to be removed"), |
333 | 1064 | self.list.kernel_autoremove_groups) | 1079 | self.list.kernel_autoremove_groups) |
334 | 1065 | self._add_groups(self.list.kernel_autoremove_groups) | 1080 | self._add_groups(self.list.kernel_autoremove_groups) |
335 | 1081 | if self.list.ubuntu_pro_groups: | ||
336 | 1082 | self._add_groups(self.list.ubuntu_pro_groups) | ||
337 | 1066 | 1083 | ||
338 | 1067 | self.treeview_update.set_model(self.store) | 1084 | self.treeview_update.set_model(self.store) |
339 | 1068 | self.pkg_cell_area.indent_toplevel = ( | 1085 | self.pkg_cell_area.indent_toplevel = ( |
340 | 1069 | 1086 | ||
341 | === modified file 'debian/changelog' | |||
342 | --- debian/changelog 2022-09-13 23:51:20 +0000 | |||
343 | +++ debian/changelog 2023-01-18 03:42:01 +0000 | |||
344 | @@ -1,3 +1,9 @@ | |||
345 | 1 | update-manager (1:18.04.11.15) bionic; urgency=medium | ||
346 | 2 | |||
347 | 3 | * Show pending Ubuntu pro packages (LP: #1990450) | ||
348 | 4 | |||
349 | 5 | -- Robert Ancell <robert.ancell@canonical.com> Wed, 18 Jan 2023 15:09:17 +1300 | ||
350 | 6 | |||
351 | 1 | update-manager (1:18.04.11.14) bionic; urgency=medium | 7 | update-manager (1:18.04.11.14) bionic; urgency=medium |
352 | 2 | 8 | ||
353 | 3 | * tests/test_meta_release_core.py: switch a test from using lucid to bionic | 9 | * tests/test_meta_release_core.py: switch a test from using lucid to bionic |
Merged because this has been uploaded as a SRU.