为什么“软件更新程序”在执行更新时说它正在“更新快照”,但实际上并非如此?

为什么“软件更新程序”在执行更新时说它正在“更新快照”,但实际上并非如此?

我一直想知道为什么软件更新工具(“更新管理器”)在执行包更新后会显示几秒钟“正在更新快照”,但实际上它并没有这样做。

相反,在软件更新程序完成后,我经常在终端中输入“sudo snap refresh”来查找是否有可用的 snap 更新并进行更新。(如果我不这样做,snap 更新将在一段时间后自动安装,但我希望在开始工作之前而不是在工作时获取所有最新更新。)

使用 Ubuntu 22.04,但它总是与 20.04 相同。

答案1

我认为“更新快照”这句话具有误导性。它并没有像你想象的那样运行,也没有像任何理性的人所期望的那样运行。

我看了一下更新管理器的代码,虽然我不是开发人员,但我想我明白发生了什么。

deb代码看起来像是说“更新 snap”,然后继续获取正在从 迁移到的snap 列表snap- 例如lxdfirefoxchromium-browser。然后它会处理它们(如果有的话),然后继续。正如您所期望的那样,它不会处理任何已安装的 snap。

消息“更新快照”可能应该是“处理 deb 到快照迁移”或类似的内容。

这是代码。

    def update_snaps(self):
        # update status and progress bar
        def update_status(status):
            GLib.idle_add(self.label_details.set_label, status)

        def update_progress(progress_bar):
            progress_bar.pulse()
            return True

        update_status(_("Updating snaps"))

        progress_bar = None
        progress_timer = None

        progress_bars = self.progressbar_slot.get_children()
        if progress_bars and isinstance(progress_bars[0], Gtk.ProgressBar):
            progress_bar = progress_bars[0]
            progress_timer = GLib.timeout_add(100, update_progress,
                                              progress_bar)

        # populate snap_list with deb2snap transitions
        snap_list = self.get_snap_transitions()

        if progress_timer:
            GLib.source_remove(progress_timer)
            progress_bar.set_fraction(0)

        # (un)install (un)seeded snap(s)
        try:
            client = Snapd.Client()
            client.connect_sync()
            index = 0
            count = len(snap_list)
            for snap, snap_object in snap_list.items():
                command = snap_object['command']
                if command == 'refresh':
                    update_status(_("Refreshing %s snap" % snap))
                    client.refresh_sync(snap, snap_object['channel'],
                                        self.update_snap_cb,
                                        progress_callback_data=(index, count,
                                                                progress_bar))
                elif command == 'remove':
                    update_status(_("Removing %s snap" % snap))
                    client.remove_sync(snap, self.update_snap_cb,
                                       progress_callback_data=(index, count,
                                                               progress_bar))
                else:
                    update_status(_("Installing %s snap" % snap))
                    client.install_sync(snap, snap_object['channel'],
                                        self.update_snap_cb,
                                        progress_callback_data=(index, count,
                                                                progress_bar))
                index += 1
        except GLib.Error as e:
            logging.debug("error updating snaps (%s)" % e)
            GLib.idle_add(self.window_main.start_error, False,
                          _("Upgrade only partially completed."),
                          _("An error occurred while updating snaps. "
                            "Please check your network connection."))
            return

        # continue with the rest of the updates
        GLib.idle_add(self.window_main.start_available)

相关内容