Merge lp:~robert-ancell/update-manager/ua-focal-merge into lp:~ubuntu-core-dev/update-manager/jammy

Proposed by Robert Ancell
Status: Merged
Merge reported by: Sebastien Bacher
Merged at revision: not available
Proposed branch: lp:~robert-ancell/update-manager/ua-focal-merge
Merge into: lp:~ubuntu-core-dev/update-manager/jammy
Diff against target: 598 lines (+295/-53) (has conflicts)
6 files modified
UpdateManager/Core/UpdateList.py (+54/-13)
UpdateManager/Dialogs.py (+4/-4)
UpdateManager/UpdateManager.py (+99/-32)
UpdateManager/UpdatesAvailable.py (+21/-4)
debian/changelog (+109/-0)
tests/test_meta_release_core.py (+8/-0)
Text conflict in UpdateManager/UpdateManager.py
Text conflict in debian/changelog
Text conflict in tests/test_meta_release_core.py
To merge this branch: bzr merge lp:~robert-ancell/update-manager/ua-focal-merge
Reviewer Review Type Date Requested Status
Ubuntu Core Development Team Pending
Review via email: mp+435931@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Robert Ancell (robert-ancell) wrote :

Merged because this has been uploaded as a SRU.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'UpdateManager/Core/UpdateList.py'
--- UpdateManager/Core/UpdateList.py 2021-02-05 21:17:38 +0000
+++ UpdateManager/Core/UpdateList.py 2023-01-18 03:41:43 +0000
@@ -44,11 +44,12 @@
4444
4545
46class UpdateItem():46class UpdateItem():
47 def __init__(self, pkg, name, icon, to_remove):47 def __init__(self, pkg, name, icon, to_remove, sensitive=True):
48 self.icon = icon48 self.icon = icon
49 self.name = name49 self.name = name
50 self.pkg = pkg50 self.pkg = pkg
51 self.to_remove = to_remove51 self.to_remove = to_remove
52 self.sensitive = sensitive
5253
53 def is_selected(self):54 def is_selected(self):
54 if not self.to_remove:55 if not self.to_remove:
@@ -60,13 +61,13 @@
60class UpdateGroup(UpdateItem):61class UpdateGroup(UpdateItem):
61 _depcache = {}62 _depcache = {}
6263
63 def __init__(self, pkg, name, icon, to_remove):64 def __init__(self, pkg, name, icon, to_remove, sensitive=True):
64 UpdateItem.__init__(self, pkg, name, icon, to_remove)65 UpdateItem.__init__(self, pkg, name, icon, to_remove, sensitive)
65 self._items = set()66 self._items = set()
66 self._deps = set()67 self._deps = set()
67 self.core_item = None68 self.core_item = None
68 if pkg is not None:69 if pkg is not None:
69 self.core_item = UpdateItem(pkg, name, icon, to_remove)70 self.core_item = UpdateItem(pkg, name, icon, to_remove, sensitive)
70 self._items.add(self.core_item)71 self._items.add(self.core_item)
7172
72 @property73 @property
@@ -75,10 +76,11 @@
75 all_items.extend(self._items)76 all_items.extend(self._items)
76 return sorted(all_items, key=lambda a: a.name.lower())77 return sorted(all_items, key=lambda a: a.name.lower())
7778
78 def add(self, pkg, cache=None, eventloop_callback=None, to_remove=False):79 def add(self, pkg, cache=None, eventloop_callback=None, to_remove=False,
80 sensitive=True):
79 name = utils.get_package_label(pkg)81 name = utils.get_package_label(pkg)
80 icon = Gio.ThemedIcon.new("package")82 icon = Gio.ThemedIcon.new("package")
81 self._items.add(UpdateItem(pkg, name, icon, to_remove))83 self._items.add(UpdateItem(pkg, name, icon, to_remove, sensitive))
82 # If the pkg is in self._deps, stop here. We have already calculated84 # If the pkg is in self._deps, stop here. We have already calculated
83 # the recursive dependencies for this package, no need to do it again.85 # the recursive dependencies for this package, no need to do it again.
84 if cache and pkg.name in cache and pkg.name not in self._deps:86 if cache and pkg.name in cache and pkg.name not in self._deps:
@@ -154,27 +156,29 @@
154156
155157
156class UpdateApplicationGroup(UpdateGroup):158class UpdateApplicationGroup(UpdateGroup):
157 def __init__(self, pkg, application, to_remove):159 def __init__(self, pkg, application, to_remove, sensitive=True):
158 name = application.get_display_name()160 name = application.get_display_name()
159 icon = application.get_icon()161 icon = application.get_icon()
160 super(UpdateApplicationGroup, self).__init__(pkg, name, icon,162 super(UpdateApplicationGroup, self).__init__(pkg, name, icon,
161 to_remove)163 to_remove, sensitive)
162164
163165
164class UpdatePackageGroup(UpdateGroup):166class UpdatePackageGroup(UpdateGroup):
165 def __init__(self, pkg, to_remove):167 def __init__(self, pkg, to_remove, sensitive=True):
166 name = utils.get_package_label(pkg)168 name = utils.get_package_label(pkg)
167 icon = Gio.ThemedIcon.new("package")169 icon = Gio.ThemedIcon.new("package")
168 super(UpdatePackageGroup, self).__init__(pkg, name, icon, to_remove)170 super(UpdatePackageGroup, self).__init__(pkg, name, icon, to_remove,
171 sensitive)
169172
170173
171class UpdateSystemGroup(UpdateGroup):174class UpdateSystemGroup(UpdateGroup):
172 def __init__(self, cache, to_remove):175 def __init__(self, cache, to_remove, sensitive=True):
173 # Translators: the %s is a distro name, like 'Ubuntu' and 'base' as in176 # Translators: the %s is a distro name, like 'Ubuntu' and 'base' as in
174 # the core components and packages.177 # the core components and packages.
175 name = _("%s base") % utils.get_ubuntu_flavor_name(cache=cache)178 name = _("%s base") % utils.get_ubuntu_flavor_name(cache=cache)
176 icon = Gio.ThemedIcon.new("distributor-logo")179 icon = Gio.ThemedIcon.new("distributor-logo")
177 super(UpdateSystemGroup, self).__init__(None, name, icon, to_remove)180 super(UpdateSystemGroup, self).__init__(None, name, icon, to_remove,
181 sensitive)
178182
179183
180class UpdateOrigin():184class UpdateOrigin():
@@ -216,6 +220,7 @@
216 self.security_groups = []220 self.security_groups = []
217 self.kernel_autoremove_groups = []221 self.kernel_autoremove_groups = []
218 self.duplicate_groups = []222 self.duplicate_groups = []
223 self.ubuntu_pro_groups = []
219 self.num_updates = 0224 self.num_updates = 0
220 self.random = random.Random()225 self.random = random.Random()
221 self.ignored_phased_updates = []226 self.ignored_phased_updates = []
@@ -464,7 +469,8 @@
464469
465 return app_groups + pkg_groups470 return app_groups + pkg_groups
466471
467 def update(self, cache, eventloop_callback=None, duplicate_packages=[]):472 def update(self, cache, eventloop_callback=None, duplicate_packages=[],
473 ua_security_packages=[]):
468 self.held_back = []474 self.held_back = []
469475
470 # do the upgrade476 # do the upgrade
@@ -476,6 +482,34 @@
476 kernel_autoremove_pkgs = []482 kernel_autoremove_pkgs = []
477 duplicate_pkgs = []483 duplicate_pkgs = []
478484
485 class FakeUbuntuProPackageCandidate:
486 def __init__(self, source_name, version, size):
487 self.source_name = source_name
488 self.summary = source_name
489 self.description = source_name
490 self.version = version
491 self.size = size
492 self.downloadable = False
493 self.record = {}
494
495 class FakeUbuntuProPackage:
496 def __init__(self, package_name, version, size):
497 self.name = package_name
498 self.candidate = FakeUbuntuProPackageCandidate(package_name,
499 version, size)
500 self.marked_install = False
501 self.marked_upgrade = False
502
503 def mark_install(self):
504 pass
505
506 def mark_delete(self):
507 pass
508 fake_ua_packages = []
509 for (package_name, version, size) in ua_security_packages:
510 fake_ua_packages.append(FakeUbuntuProPackage(package_name,
511 version, size))
512
479 # Find all upgradable packages513 # Find all upgradable packages
480 for pkg in cache:514 for pkg in cache:
481 if pkg.is_upgradable or pkg.marked_install:515 if pkg.is_upgradable or pkg.marked_install:
@@ -541,3 +575,10 @@
541 cache, kernel_autoremove_pkgs, eventloop_callback, True)575 cache, kernel_autoremove_pkgs, eventloop_callback, True)
542 self.duplicate_groups = self._make_groups(576 self.duplicate_groups = self._make_groups(
543 cache, duplicate_pkgs, eventloop_callback, True)577 cache, duplicate_pkgs, eventloop_callback, True)
578 if len(fake_ua_packages) > 0:
579 ubuntu_pro_group = UpdateGroup(None,
580 "Ubuntu Pro (enable in Settings…)",
581 None, False, False)
582 for package in fake_ua_packages:
583 ubuntu_pro_group.add(package)
584 self.ubuntu_pro_groups = [ubuntu_pro_group]
544585
=== modified file 'UpdateManager/Dialogs.py'
--- UpdateManager/Dialogs.py 2021-01-05 20:24:02 +0000
+++ UpdateManager/Dialogs.py 2023-01-18 03:41:43 +0000
@@ -168,10 +168,10 @@
168 self.settings_button and \168 self.settings_button and \
169 self._has_livepatch_settings_ui() and \169 self._has_livepatch_settings_ui() and \
170 self.settings.get_int('launch-count') >= 4:170 self.settings.get_int('launch-count') >= 4:
171 self.set_desc(_("<b>Tip:</b> You can use Livepatch to "171 self.set_desc(_("<b>Tip:</b> You can use Livepatch with "
172 "keep your computer more secure between "172 "Ubuntu Pro to keep your computer more "
173 "restarts."))173 "secure between restarts."))
174 self.settings_button.set_label(_("Settings & Livepatch…"))174 self.settings_button.set_label(_("Settings & Pro…"))
175 return175 return
176176
177 needs_reschedule = False177 needs_reschedule = False
178178
=== modified file 'UpdateManager/UpdateManager.py'
--- UpdateManager/UpdateManager.py 2021-12-10 20:29:40 +0000
+++ UpdateManager/UpdateManager.py 2023-01-18 03:41:43 +0000
@@ -35,7 +35,12 @@
35 DeprecationWarning)35 DeprecationWarning)
3636
37import distro_info37import distro_info
38import fnmatch38<<<<<<< TREE
39import fnmatch
40=======
41import fnmatch
42import json
43>>>>>>> MERGE-SOURCE
39import os44import os
40import subprocess45import subprocess
41import sys46import sys
@@ -85,6 +90,7 @@
85 self.unity = UnitySupport()90 self.unity = UnitySupport()
86 self.controller = None91 self.controller = None
87 self.cache = None92 self.cache = None
93 self.ua_security_packages = []
88 self.update_list = None94 self.update_list = None
89 self.meta_release = None95 self.meta_release = None
90 self.hwe_replacement_packages = None96 self.hwe_replacement_packages = None
@@ -247,27 +253,72 @@
247 cancelled_update, error_occurred)253 cancelled_update, error_occurred)
248 self._start_pane(pane)254 self._start_pane(pane)
249255
250 def _check_oem_metapackages(self):256<<<<<<< TREE
251 di = distro_info.UbuntuDistroInfo()257 def _check_oem_metapackages(self):
252 codename = get_dist()258 di = distro_info.UbuntuDistroInfo()
253 lts = di.is_lts(codename)259 codename = get_dist()
254 if not lts:260 lts = di.is_lts(codename)
255 return None261 if not lts:
256 OEM_PATH = os.path.join(GLib.get_user_runtime_dir(),262 return None
257 "ubuntu-drivers-oem.package-list")263 OEM_PATH = os.path.join(GLib.get_user_runtime_dir(),
258 if not os.path.exists(OEM_PATH):264 "ubuntu-drivers-oem.package-list")
259 return None265 if not os.path.exists(OEM_PATH):
260266 return None
261 # Packages that aren't installed but apply to this system267
262 with open(OEM_PATH, 'r') as f:268 # Packages that aren't installed but apply to this system
263 self.oem_metapackages |= set(f.read().splitlines())269 with open(OEM_PATH, 'r') as f:
264270 self.oem_metapackages |= set(f.read().splitlines())
265 # Packages that are already installed271
266 for pkg in self.cache:272 # Packages that are already installed
267 if fnmatch.fnmatch(pkg.name, 'oem-*-meta') \273 for pkg in self.cache:
268 and pkg.installed:274 if fnmatch.fnmatch(pkg.name, 'oem-*-meta') \
269 self.oem_metapackages.add(pkg)275 and pkg.installed:
270276 self.oem_metapackages.add(pkg)
277
278=======
279 def _check_oem_metapackages(self):
280 di = distro_info.UbuntuDistroInfo()
281 codename = get_dist()
282 lts = di.is_lts(codename)
283 if not lts:
284 return None
285 OEM_PATH = os.path.join(GLib.get_user_runtime_dir(),
286 "ubuntu-drivers-oem.package-list")
287 if not os.path.exists(OEM_PATH):
288 return None
289
290 # Packages that aren't installed but apply to this system
291 with open(OEM_PATH, 'r') as f:
292 self.oem_metapackages |= set(f.read().splitlines())
293
294 # Packages that are already installed
295 for pkg in self.cache:
296 if fnmatch.fnmatch(pkg.name, 'oem-*-meta') \
297 and pkg.installed:
298 self.oem_metapackages.add(pkg)
299
300 def _get_ua_security_status(self):
301 self.ua_security_packages = []
302 try:
303 p = subprocess.Popen(['ua', 'security-status', '--format=json'],
304 stdout=subprocess.PIPE)
305 except OSError:
306 pass
307 else:
308 while p.poll() is None:
309 while Gtk.events_pending():
310 Gtk.main_iteration()
311 time.sleep(0.05)
312 s = json.load(p.stdout)
313 for package in s.get('packages', []):
314 status = package.get('status', '')
315 if status == 'pending_attach':
316 name = package.get('name', '')
317 version = package.get('version', '')
318 size = package.get('download_size', 0)
319 self.ua_security_packages.append((name, version, size))
320
321>>>>>>> MERGE-SOURCE
271 def _make_available_pane(self, install_count, need_reboot=False,322 def _make_available_pane(self, install_count, need_reboot=False,
272 cancelled_update=False, error_occurred=False):323 cancelled_update=False, error_occurred=False):
273 self._check_hwe_support_status()324 self._check_hwe_support_status()
@@ -421,19 +472,35 @@
421 Gtk.main_iteration()472 Gtk.main_iteration()
422 iterate()473 iterate()
423474
424 self._check_oem_metapackages()475<<<<<<< TREE
425476 self._check_oem_metapackages()
426 for pkgname in self.oem_metapackages:477
427 try:478 for pkgname in self.oem_metapackages:
428 if not self.cache[pkgname].is_installed:479 try:
429 self.cache[pkgname].mark_install()480 if not self.cache[pkgname].is_installed:
430 except SystemError:481 self.cache[pkgname].mark_install()
431 pass482 except SystemError:
432483 pass
484
485=======
486 self._check_oem_metapackages()
487
488 self._get_ua_security_status()
489
490 for pkgname in self.oem_metapackages:
491 try:
492 if not self.cache[pkgname].is_installed:
493 self.cache[pkgname].mark_install()
494 except SystemError:
495 pass
496
497>>>>>>> MERGE-SOURCE
433 self.update_list = UpdateList(self)498 self.update_list = UpdateList(self)
434 try:499 try:
435 self.update_list.update(self.cache, eventloop_callback=iterate,500 self.update_list.update(self.cache, eventloop_callback=iterate,
436 duplicate_packages=self.duplicate_packages)501 duplicate_packages=self.duplicate_packages,
502 ua_security_packages=self.
503 ua_security_packages)
437 except SystemError as e:504 except SystemError as e:
438 header = _("Could not calculate the upgrade")505 header = _("Could not calculate the upgrade")
439 desc = _("An unresolvable problem occurred while "506 desc = _("An unresolvable problem occurred while "
440507
=== modified file 'UpdateManager/UpdatesAvailable.py'
--- UpdateManager/UpdatesAvailable.py 2020-12-14 11:10:57 +0000
+++ UpdateManager/UpdatesAvailable.py 2023-01-18 03:41:43 +0000
@@ -74,7 +74,8 @@
74# - screen reader does not say "Downloaded" for downloaded updates74# - screen reader does not say "Downloaded" for downloaded updates
7575
76# list constants76# list constants
77(LIST_NAME, LIST_UPDATE_DATA, LIST_SIZE, LIST_TOGGLE_ACTIVE) = range(4)77(LIST_NAME, LIST_UPDATE_DATA, LIST_SIZE, LIST_TOGGLE_ACTIVE,
78 LIST_SENSITIVE) = range(5)
7879
79# NetworkManager enums80# NetworkManager enums
80from .Core.roam import NetworkManagerHelper81from .Core.roam import NetworkManagerHelper
@@ -261,7 +262,7 @@
261 changes_buffer.create_tag("versiontag", weight=Pango.Weight.BOLD)262 changes_buffer.create_tag("versiontag", weight=Pango.Weight.BOLD)
262263
263 # the treeview (move into it's own code!)264 # the treeview (move into it's own code!)
264 self.store = Gtk.TreeStore(str, GObject.TYPE_PYOBJECT, str, bool)265 self.store = Gtk.TreeStore(str, GObject.TYPE_PYOBJECT, str, bool, bool)
265 self.treeview_update.set_model(None)266 self.treeview_update.set_model(None)
266267
267 self.image_restart.set_from_gicon(self.get_restart_icon(),268 self.image_restart.set_from_gicon(self.get_restart_icon(),
@@ -293,6 +294,8 @@
293 pkg_column.pack_start(pkg_toggle_renderer, False)294 pkg_column.pack_start(pkg_toggle_renderer, False)
294 pkg_column.add_attribute(pkg_toggle_renderer,295 pkg_column.add_attribute(pkg_toggle_renderer,
295 'active', LIST_TOGGLE_ACTIVE)296 'active', LIST_TOGGLE_ACTIVE)
297 pkg_column.add_attribute(pkg_toggle_renderer,
298 'sensitive', LIST_SENSITIVE)
296 pkg_column.set_cell_data_func(pkg_toggle_renderer,299 pkg_column.set_cell_data_func(pkg_toggle_renderer,
297 self.pkg_toggle_renderer_data_func)300 self.pkg_toggle_renderer_data_func)
298301
@@ -319,6 +322,8 @@
319 size_column = Gtk.TreeViewColumn(_("Download"), size_renderer,322 size_column = Gtk.TreeViewColumn(_("Download"), size_renderer,
320 text=LIST_SIZE)323 text=LIST_SIZE)
321 size_column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)324 size_column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
325 size_column.add_attribute(size_renderer,
326 'sensitive', LIST_SENSITIVE)
322 self.treeview_update.append_column(size_column)327 self.treeview_update.append_column(size_column)
323328
324 self.treeview_update.set_headers_visible(True)329 self.treeview_update.set_headers_visible(True)
@@ -404,8 +409,11 @@
404 def restart_icon_renderer_data_func(self, cell_layout, renderer, model,409 def restart_icon_renderer_data_func(self, cell_layout, renderer, model,
405 iter, user_data):410 iter, user_data):
406 data = model.get_value(iter, LIST_UPDATE_DATA)411 data = model.get_value(iter, LIST_UPDATE_DATA)
412 sensitive = model.get_value(iter, LIST_SENSITIVE)
407 path = model.get_path(iter)413 path = model.get_path(iter)
408414
415 renderer.set_sensitive(sensitive)
416
409 requires_restart = False417 requires_restart = False
410 if data.item and data.item.pkg:418 if data.item and data.item.pkg:
411 requires_restart = self.pkg_requires_restart(data.item.pkg)419 requires_restart = self.pkg_requires_restart(data.item.pkg)
@@ -433,6 +441,7 @@
433 if data.item:441 if data.item:
434 activatable = data.item.pkg.name not in self.list.held_back442 activatable = data.item.pkg.name not in self.list.held_back
435 inconsistent = False443 inconsistent = False
444 renderer.set_sensitive(data.item.sensitive)
436 elif data.group:445 elif data.group:
437 activatable = True446 activatable = True
438 inconsistent = data.group.selection_is_inconsistent()447 inconsistent = data.group.selection_is_inconsistent()
@@ -485,8 +494,11 @@
485 def pkg_label_renderer_data_func(self, cell_layout, renderer, model,494 def pkg_label_renderer_data_func(self, cell_layout, renderer, model,
486 iter, user_data):495 iter, user_data):
487 data = model.get_value(iter, LIST_UPDATE_DATA)496 data = model.get_value(iter, LIST_UPDATE_DATA)
497 sensitive = model.get_value(iter, LIST_SENSITIVE)
488 name = GLib.markup_escape_text(model.get_value(iter, LIST_NAME))498 name = GLib.markup_escape_text(model.get_value(iter, LIST_NAME))
489499
500 renderer.set_sensitive(sensitive)
501
490 if data.group:502 if data.group:
491 markup = name503 markup = name
492 elif data.item:504 elif data.item:
@@ -1000,6 +1012,7 @@
1000 name,1012 name,
1001 UpdateData(groups, None, None),1013 UpdateData(groups, None, None),
1002 humanize_size(total_size),1014 humanize_size(total_size),
1015 True,
1003 True1016 True
1004 ]1017 ]
1005 return self.store.append(None, header_row)1018 return self.store.append(None, header_row)
@@ -1023,7 +1036,8 @@
1023 group.name,1036 group.name,
1024 UpdateData(None, group, group_is_item),1037 UpdateData(None, group, group_is_item),
1025 humanize_size(group.get_total_size()),1038 humanize_size(group.get_total_size()),
1026 True1039 True,
1040 group.sensitive
1027 ]1041 ]
1028 group_iter = self.store.append(None, group_row)1042 group_iter = self.store.append(None, group_row)
10291043
@@ -1034,7 +1048,8 @@
1034 item.name,1048 item.name,
1035 UpdateData(None, None, item),1049 UpdateData(None, None, item),
1036 humanize_size(getattr(item.pkg.candidate, "size", 0)),1050 humanize_size(getattr(item.pkg.candidate, "size", 0)),
1037 True1051 True,
1052 group.sensitive
1038 ]1053 ]
1039 self.store.append(group_iter, item_row)1054 self.store.append(group_iter, item_row)
10401055
@@ -1077,6 +1092,8 @@
1077 _("Duplicate packages to be removed"),1092 _("Duplicate packages to be removed"),
1078 self.list.duplicate_groups)1093 self.list.duplicate_groups)
1079 self._add_groups(self.list.duplicate_groups)1094 self._add_groups(self.list.duplicate_groups)
1095 if self.list.ubuntu_pro_groups:
1096 self._add_groups(self.list.ubuntu_pro_groups)
10801097
1081 self.treeview_update.set_model(self.store)1098 self.treeview_update.set_model(self.store)
1082 self.pkg_cell_area.indent_toplevel = (1099 self.pkg_cell_area.indent_toplevel = (
10831100
=== modified file 'UpdateManager/backend/__init__.py'
=== modified file 'debian/changelog'
--- debian/changelog 2022-12-01 19:09:52 +0000
+++ debian/changelog 2023-01-18 03:41:43 +0000
@@ -1,3 +1,4 @@
1<<<<<<< TREE
1update-manager (1:22.04.10) jammy; urgency=medium2update-manager (1:22.04.10) jammy; urgency=medium
23
3 [ Renan Rodrigo ]4 [ Renan Rodrigo ]
@@ -218,6 +219,114 @@
218219
219 -- Brian Murray <brian@ubuntu.com> Wed, 27 May 2020 13:29:24 -0700220 -- Brian Murray <brian@ubuntu.com> Wed, 27 May 2020 13:29:24 -0700
220221
222=======
223update-manager (1:20.04.10.12) focal; urgency=medium
224
225 * Show pending Ubuntu pro packages (LP: #1990450)
226
227 -- Robert Ancell <robert.ancell@canonical.com> Wed, 18 Jan 2023 15:03:27 +1300
228
229update-manager (1:20.04.10.11) focal; urgency=medium
230
231 [ Renan Rodrigo ]
232 * ubuntu-security-status: Don't show ESM Apps information when the service
233 is disabled, and prefer 'pro security-status' when it is available.
234 (LP: #1991533)
235
236 -- Brian Murray <brian@ubuntu.com> Thu, 01 Dec 2022 11:10:57 -0800
237
238update-manager (1:20.04.10.10) focal; urgency=medium
239
240 * ubuntu-security-status: Check if ESM for Apps is enabled or if it is not
241 in beta before displaying information about the packages available from
242 there. Additionally, improve pluralization in a couple of locations.
243 (LP: #1955471)
244
245 -- Brian Murray <brian@ubuntu.com> Fri, 14 Jan 2022 10:28:42 -0800
246
247update-manager (1:20.04.10.9) focal; urgency=medium
248
249 * ubuntu-security-status: use ubuntu-advantage-tools to determine whether or
250 not livepatch or esm are enabled and if the system is attached. Thanks to
251 Chad Smith for the patch. (LP: #1938043)
252
253 -- Brian Murray <brian@ubuntu.com> Fri, 03 Sep 2021 15:17:22 -0700
254
255update-manager (1:20.04.10.8) focal; urgency=medium
256
257 * tests/test_meta_release_core.py: switch a test from using lucid to bionic
258 as precise was removed from the archive. (LP: #1929865)
259
260 -- Brian Murray <brian@ubuntu.com> Thu, 27 May 2021 13:36:54 -0700
261
262update-manager (1:20.04.10.7) focal; urgency=medium
263
264 * tests/test_update_list.py: rewrite how APT::VersionedKernelPackages is set.
265 (LP: #1924809)
266 * debian/tests/control: add apt to the list of Depends.
267
268 -- Brian Murray <brian@ubuntu.com> Fri, 16 Apr 2021 16:25:21 -0700
269
270update-manager (1:20.04.10.6) focal; urgency=medium
271
272 * UpdateManager/Core/UpdateList.py: change to a regex from a static list
273 of packages to be grouped under Ubuntu Base (LP: #1902025)
274 * Clean up apt cache binary files left behind by tests
275 * Rename meta_pkgs to ubuntu_base_pkgs to make it more clear to the
276 reader which packages should be included
277 * Add tests in to ensure Ubuntu base packages are not grouped when
278 staged for removal (LP: #1912718)
279
280 -- William 'jawn-smith' Wilson <william.wilson@canonical.com> Wed, 10 Feb 2021 14:39:27 -0600
281
282update-manager (1:20.04.10.5) focal; urgency=medium
283
284 * UpdateManager/backend/__init__.py: Really make commit_oem a no-op in the
285 base class to avoid crash when people force synaptic backend (LP: #1913732)
286 * Fix typo in previous changelog
287
288 -- Julian Andres Klode <juliank@ubuntu.com> Fri, 29 Jan 2021 17:43:01 +0100
289
290update-manager (1:20.04.10.4) focal; urgency=medium
291
292 * Revert previous change to UpdateList.py, as it breaks kernel
293 autoremoval (LP: #1912718)
294 * UpdateManager/backend/__init__.py: Make commit_oem a no-op in the base
295 class to avoid crash when people force synaptic backend (LP: #1913732)
296
297 -- Julian Andres Klode <juliank@ubuntu.com> Fri, 29 Jan 2021 12:50:23 +0100
298
299update-manager (1:20.04.10.3) focal; urgency=medium
300
301 [ Julian Andres Klode ]
302 * UpdateManager/backend/__init__.py: Fix unbound local variables regression
303 introduced by the previous SRU (See LP 1910556), and correct comment
304
305 [ William Wilson ]
306 * UpdateManager/Core/UpdateList.py: change to a regex from a static list
307 of packages to be grouped under Ubuntu Base (LP: #1902025)
308
309 -- Brian Murray <brian@ubuntu.com> Wed, 13 Jan 2021 08:35:58 -0800
310
311update-manager (1:20.04.10.2) focal; urgency=medium
312
313 [ Iain Lane & Julian Andres Klode ]
314 * Support post install enablement of OEM-enabled devices (LP: #1908050)
315
316 -- Julian Andres Klode <juliank@ubuntu.com> Mon, 14 Dec 2020 12:24:18 +0100
317
318update-manager (1:20.04.10.1) focal; urgency=medium
319
320 * UpdateManager/UpdateManager.py: when refreshing the cache and encountering
321 an error return rather than trying to use the undefined cache which causes
322 crashes. Additionally, don't present the dialog with a "Try Again" button
323 which won't do anything. (LP: #1826213)
324 * Fix hang in apturl-gtk. (LP: #1874591)
325 * Fix crash in snap updates when refreshing the cache fails. (LP: #1880987)
326
327 -- Brian Murray <brian@ubuntu.com> Wed, 03 Jun 2020 10:18:00 -0700
328
329>>>>>>> MERGE-SOURCE
221update-manager (1:20.04.10) focal; urgency=medium330update-manager (1:20.04.10) focal; urgency=medium
222331
223 * Fix intermittent hang during snap updates (LP: #1874469).332 * Fix intermittent hang during snap updates (LP: #1874469).
224333
=== modified file 'debian/control'
=== modified file 'tests/test_meta_release_core.py'
--- tests/test_meta_release_core.py 2022-01-26 23:05:32 +0000
+++ tests/test_meta_release_core.py 2023-01-18 03:41:43 +0000
@@ -9,8 +9,12 @@
9import random9import random
10import sys10import sys
11import tempfile11import tempfile
12<<<<<<< TREE
12import time13import time
13import unittest14import unittest
15=======
16import glob
17>>>>>>> MERGE-SOURCE
14try:18try:
15 from test.support import EnvironmentVarGuard19 from test.support import EnvironmentVarGuard
16except ImportError:20except ImportError:
@@ -181,7 +185,11 @@
181 ltses = [supported for supported in di.supported()185 ltses = [supported for supported in di.supported()
182 if di.is_lts(supported)]186 if di.is_lts(supported)]
183 with EnvironmentVarGuard() as environ:187 with EnvironmentVarGuard() as environ:
188<<<<<<< TREE
184 environ["META_RELEASE_FAKE_CODENAME"] = ltses[-2]189 environ["META_RELEASE_FAKE_CODENAME"] = ltses[-2]
190=======
191 environ["META_RELEASE_FAKE_CODENAME"] = "bionic"
192>>>>>>> MERGE-SOURCE
185 meta = MetaReleaseCore(forceDownload=True)193 meta = MetaReleaseCore(forceDownload=True)
186 while meta.downloading:194 while meta.downloading:
187 time.sleep(0.1)195 time.sleep(0.1)

Subscribers

People subscribed via source and target branches