Skip to content
[org.gnome.boxes]
recommended-downloads-url='https://git.launchpad.net/~ubuntu-desktop/gnome-boxes/plain/recommended-downloads.xml?h=jammy'
From: Felipe Borges <felipeborges@gnome.org>
Date: Tue, 12 Apr 2022 14:39:06 +0200
Subject: assistant: Fetch recommended downloads from an URL
---
data/ui/assistant/pages/downloads-page.ui | 29 +++++++++++++++++++++--------
src/assistant/downloads-page.vala | 17 ++++++++++++++---
src/assistant/index-page.vala | 4 +++-
src/downloader.vala | 2 +-
src/util-app.vala | 28 +++++++++++++++++++++++++++-
5 files changed, 66 insertions(+), 14 deletions(-)
diff --git a/data/ui/assistant/pages/downloads-page.ui b/data/ui/assistant/pages/downloads-page.ui
index d49d514..5625758 100644
--- a/data/ui/assistant/pages/downloads-page.ui
+++ b/data/ui/assistant/pages/downloads-page.ui
@@ -11,15 +11,28 @@
<property name="margin-end">20</property>
<child>
- <object class="GtkListBox" id="recommended_listbox">
+ <object class="GtkStack" id="stack">
<property name="visible">True</property>
- <property name="vexpand">True</property>
- <property name="selection-mode">none</property>
- <property name="margin">20</property>
- <signal name="row-activated" handler="on_listbox_row_activated"/>
- <style>
- <class name="content"/>
- </style>
+
+ <child>
+ <object class="GtkSpinner">
+ <property name="visible">True</property>
+ <property name="active">True</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkListBox" id="recommended_listbox">
+ <property name="visible">True</property>
+ <property name="vexpand">True</property>
+ <property name="selection-mode">none</property>
+ <property name="margin">20</property>
+ <signal name="row-activated" handler="on_listbox_row_activated"/>
+ <style>
+ <class name="content"/>
+ </style>
+ </object>
+ </child>
</object>
</child>
</object>
diff --git a/src/assistant/downloads-page.vala b/src/assistant/downloads-page.vala
index ce8fe2c..1b63b0a 100644
--- a/src/assistant/downloads-page.vala
+++ b/src/assistant/downloads-page.vala
@@ -16,6 +16,8 @@ public enum AssistantDownloadsPageView {
[GtkChild]
private unowned Gtk.ListBox listbox;
[GtkChild]
+ private unowned Gtk.Stack stack;
+ [GtkChild]
private unowned Gtk.ListBox recommended_listbox;
public Gtk.SearchEntry search_entry = new Gtk.SearchEntry ();
@@ -59,7 +61,6 @@ public enum AssistantDownloadsPageView {
recommended_model = new GLib.ListStore (typeof (Osinfo.Media));
recommended_listbox.bind_model (recommended_model, create_downloads_entry);
- populate_recommended_list.begin ();
show_more_button = new Gtk.Button () {
visible = true,
@@ -87,12 +88,22 @@ private void set_visible_view () {
}
}
- private async void populate_recommended_list () {
- foreach (var media in yield get_recommended_downloads ()) {
+ public async void populate_recommended_list () {
+ if (recommended_model.get_n_items () != 0)
+ return;
+
+ var os_list = yield fetch_recommended_downloads_from_net ();
+ if (os_list == null)
+ os_list = yield get_recommended_downloads ();
+
+ foreach (var media in os_list) {
if (media != null) {
recommended_model.append (media);
}
}
+
+ if (recommended_model.get_n_items () > 0)
+ stack.set_visible_child (recommended_listbox);
}
private Gtk.Widget create_downloads_entry (Object item) {
diff --git a/src/assistant/index-page.vala b/src/assistant/index-page.vala
index a5b68d6..43674f4 100644
--- a/src/assistant/index-page.vala
+++ b/src/assistant/index-page.vala
@@ -180,9 +180,11 @@ private async void on_select_file_button_clicked () {
}
[GtkCallback]
- private void on_download_an_os_button_clicked () {
+ private async void on_download_an_os_button_clicked () {
stack.set_visible_child (recommended_downloads_page);
+ yield recommended_downloads_page.populate_recommended_list ();
+
dialog.previous_button.label = _("Previous");
}
}
diff --git a/src/downloader.vala b/src/downloader.vala
index 90b03db..8294813 100644
--- a/src/downloader.vala
+++ b/src/downloader.vala
@@ -125,7 +125,7 @@ public async File download (File remote_file,
return cached_file;
}
- private async void download_from_http (Download download, Cancellable? cancellable = null) throws GLib.Error {
+ public async void download_from_http (Download download, Cancellable? cancellable = null) throws GLib.Error {
var msg = new Soup.Message ("GET", download.uri);
msg.response_body.set_accumulate (false);
var address = msg.get_address ();
diff --git a/src/util-app.vala b/src/util-app.vala
index 061cbee..6388ce5 100644
--- a/src/util-app.vala
+++ b/src/util-app.vala
@@ -178,10 +178,34 @@ else if (media_url.contains ("dvd"))
}
public async GLib.List<Osinfo.Media>? get_recommended_downloads () {
+ return yield parse_recommended_downloads_file (
+ "resource:///org/gnome/Boxes/recommended-downloads.xml");
+ }
+
+ private const string GNOME_UPSTREAM_RECOMMENDED_DOWNLOADS = "https://gnome.pages.gitlab.gnome.org/gnome-boxes-logos/recommended-downloads.xml";
+ public async GLib.List<Osinfo.Media>? fetch_recommended_downloads_from_net () {
+ var remote_file = GLib.File.new_for_uri (GNOME_UPSTREAM_RECOMMENDED_DOWNLOADS);
+ string cached_path = get_logo_cache ("recommended-downloads.xml");
+ GLib.File cached_file = GLib.File.new_for_path (cached_path);
+
+ var download = new Download (remote_file, cached_file, new ActivityProgress ());
+ try {
+ yield Downloader.get_default ().download_from_http (download);
+ } catch (GLib.Error error) {
+ warning ("Failed to download recommended-downloads file: %s", error.message);
+
+ if (!cached_file.query_exists ())
+ return null;
+ }
+
+ return yield parse_recommended_downloads_file (cached_file.get_uri ());
+ }
+
+ private async GLib.List<Osinfo.Media>? parse_recommended_downloads_file (string uri) {
uint8[] contents;
try {
- File file = File.new_for_uri ("resource:///org/gnome/Boxes/recommended-downloads.xml");
+ File file = File.new_for_uri (uri);
file.load_contents (null, out contents, null);
} catch (GLib.Error e) {
@@ -205,6 +229,8 @@ public async GLib.List<Osinfo.Media>? get_recommended_downloads () {
var os_db = MediaManager.get_default ().os_db;
for (Xml.Node* iter = root->children; iter != null; iter = iter->next) {
var os_id = iter->get_prop ("id");
+ if (os_id == null)
+ continue;
Osinfo.Os? os;
try {
From: Felipe Borges <felipeborges@gnome.org>
Date: Mon, 5 Sep 2022 15:13:51 +0200
Subject: assistant: Load remote "Featured Downloads" in assistant's index
page
We were only loading them in the Download an OS page, but we also
show "Featured Downloads" at the main page of the VM creation assistant.
Fixes #845
---
src/assistant/index-page.vala | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/assistant/index-page.vala b/src/assistant/index-page.vala
index 43674f4..6494216 100644
--- a/src/assistant/index-page.vala
+++ b/src/assistant/index-page.vala
@@ -100,7 +100,11 @@ private async void populate_recommended_downloads_list () {
downloads_model.remove_all ();
medias_stack.set_visible_child (downloadable_sources_section);
- foreach (var media in yield get_recommended_downloads ()) {
+ var os_list = yield fetch_recommended_downloads_from_net ();
+ if (os_list == null)
+ os_list = yield get_recommended_downloads ();
+
+ foreach (var media in os_list) {
if (media != null) {
downloads_model.append (media);
}
From: Felipe Borges <felipeborges@gnome.org>
Date: Wed, 3 Aug 2022 13:44:21 +0200
Subject: downloadable-entry: Allow recommended-downloads to override media
properties
This way we can override name, download_url and subtitle for entries
in the recommended-downloads files.
---
src/assistant/downloadable-entry.vala | 5 +++--
src/util-app.vala | 12 ++++++++++++
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/src/assistant/downloadable-entry.vala b/src/assistant/downloadable-entry.vala
index 1427126..8fbb89a 100644
--- a/src/assistant/downloadable-entry.vala
+++ b/src/assistant/downloadable-entry.vala
@@ -6,8 +6,9 @@
this.os = media.os;
url = media.url;
- title = serialize_os_title (media);
- subtitle = media.os.vendor;
+
+ title = media.get_data ("title") ?? serialize_os_title (media);
+ subtitle = media.get_data ("subtitle") ?? media.os.vendor;
set_tooltip_text (media.url ?? title);
Downloader.fetch_os_logo.begin (media_image, os, 64);
diff --git a/src/util-app.vala b/src/util-app.vala
index ebc3802..84a83ad 100644
--- a/src/util-app.vala
+++ b/src/util-app.vala
@@ -253,6 +253,18 @@ private async GLib.List<Osinfo.Media>? parse_recommended_downloads_file (string
var media = os.get_media_list ().get_nth (0) as Osinfo.Media;
if (media.url != null || os_id.has_prefix ("http://redhat.com"))
list.append (media);
+
+ for (Xml.Node* child_iter = iter->children; child_iter != null; child_iter = child_iter->next) {
+ if (child_iter->type != Xml.ElementType.ELEMENT_NODE)
+ continue;
+
+ string content = child_iter->get_content ();
+ string node_name = child_iter->name;
+ if (node_name == "url")
+ media.url = content;
+ else
+ media.set_data (node_name, content);
+ }
}
return list;
From: Felipe Borges <felipeborges@gnome.org>
Date: Mon, 25 Apr 2022 15:02:00 +0200
Subject: recommended-downloads,
Allow configuring recommended-downloads source URL
One can set the org.gnome.boxes recommended-downloads-url gsetting
key to override the default value.
If the key is set to empty (""), Boxes will use the recommended-downloads.xml
file in cache, and if there's no cache, it fallbacks to the recommended-downloads.xml
file shipped/bundled in $SOURE/data/recommended-downloads.xml
---
data/org.gnome.boxes.gschema.xml | 6 ++++++
src/util-app.vala | 8 ++++++--
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/data/org.gnome.boxes.gschema.xml b/data/org.gnome.boxes.gschema.xml
index e3b0d31..91f52f0 100644
--- a/data/org.gnome.boxes.gschema.xml
+++ b/data/org.gnome.boxes.gschema.xml
@@ -54,5 +54,11 @@
<description>Variant array of shared folders’ names and path mapping</description>
</key>
+ <key name="recommended-downloads-url" type="s">
+ <default>'https://gnome.pages.gitlab.gnome.org/gnome-boxes-logos/recommended-downloads.xml'</default>
+ <summary>Recommended Downloads Source URL</summary>
+ <description>An URL pointing at a recommended-downloads.xml file</description>
+ </key>
+
</schema>
</schemalist>
diff --git a/src/util-app.vala b/src/util-app.vala
index 6388ce5..ebc3802 100644
--- a/src/util-app.vala
+++ b/src/util-app.vala
@@ -182,9 +182,13 @@ public async GLib.List<Osinfo.Media>? get_recommended_downloads () {
"resource:///org/gnome/Boxes/recommended-downloads.xml");
}
- private const string GNOME_UPSTREAM_RECOMMENDED_DOWNLOADS = "https://gnome.pages.gitlab.gnome.org/gnome-boxes-logos/recommended-downloads.xml";
public async GLib.List<Osinfo.Media>? fetch_recommended_downloads_from_net () {
- var remote_file = GLib.File.new_for_uri (GNOME_UPSTREAM_RECOMMENDED_DOWNLOADS);
+ var settings = App.app.main_window.settings;
+ var url = settings.get_string ("recommended-downloads-url");
+ if (url == null || url == "")
+ return null;
+
+ var remote_file = GLib.File.new_for_uri (url);
string cached_path = get_logo_cache ("recommended-downloads.xml");
GLib.File cached_file = GLib.File.new_for_path (cached_path);
From: Felipe Borges <felipeborges@gnome.org>
Date: Tue, 12 Apr 2022 11:46:33 +0200
Subject: recommended-downloads: Change XML syntax for Osinfo.id
---
data/recommended-downloads.xml | 12 ++++++++++--
src/util-app.vala | 2 +-
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/data/recommended-downloads.xml b/data/recommended-downloads.xml
index dd0660f..51b885f 100644
--- a/data/recommended-downloads.xml
+++ b/data/recommended-downloads.xml
@@ -9,6 +9,14 @@
available.
-->
<list>
- <os_id>http://ubuntu.com/ubuntu/</os_id>
- <os_id>http://ubuntu.com/ubuntu/20.04</os_id>
+ <os id="http://redhat.com/rhel/"/>
+ <os id="http://rockylinux.org/rocky/"/>
+ <os id="http://fedoraproject.org/fedora/"/>
+ <os id="http://fedoraproject.org/silverblue/"/>
+ <os id="http://ubuntu.com/ubuntu/"/>
+ <os id="http://opensuse.org/opensuse/15.4"/>
+ <os id="http://opensuse.org/opensuse/tumbleweed/"/>
+ <os id="http://debian.org/debian/"/>
+ <os id="http://endlessos.com/eos/"/>
+ <os id="http://gnome.org/gnome/nightly"/>
</list>
diff --git a/src/util-app.vala b/src/util-app.vala
index 5cb92dd..061cbee 100644
--- a/src/util-app.vala
+++ b/src/util-app.vala
@@ -204,7 +204,7 @@ public async GLib.List<Osinfo.Media>? get_recommended_downloads () {
GLib.List<Osinfo.Media> list = new GLib.List<Osinfo.Media> ();
var os_db = MediaManager.get_default ().os_db;
for (Xml.Node* iter = root->children; iter != null; iter = iter->next) {
- var os_id = iter->get_content ();
+ var os_id = iter->get_prop ("id");
Osinfo.Os? os;
try {
From: Felipe Borges <felipeborges@gnome.org>
Date: Wed, 10 Aug 2022 09:53:08 +0200
Subject: recommended-downloads: OpenSUSE thumbleweed ID shouldn't end with
"/"
---
data/recommended-downloads.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/recommended-downloads.xml b/data/recommended-downloads.xml
index c9bd0f1..6db6993 100644
--- a/data/recommended-downloads.xml
+++ b/data/recommended-downloads.xml
@@ -24,7 +24,7 @@
<os id="http://fedoraproject.org/silverblue/"/>
<os id="http://ubuntu.com/ubuntu/"/>
<os id="http://opensuse.org/opensuse/15.4"/>
- <os id="http://opensuse.org/opensuse/tumbleweed/"/>
+ <os id="http://opensuse.org/opensuse/tumbleweed"/>
<os id="http://debian.org/debian/"/>
<os id="http://endlessos.com/eos/"/>
<os id="http://gnome.org/gnome/nightly">
From: Felipe Borges <felipeborges@gnome.org>
Date: Thu, 4 Aug 2022 11:01:59 +0200
Subject: recommended-downloads: Update instructions and override example
This should explain to distributors how they can go about overriding
the recommended downloads and also override "title", "subtitle" and
"url" of a listing.
This is particularly useful when you want to promote a newly released
version of an operating system and that hasn't been shipped in an
osinfo-db release to your users yet.
---
data/recommended-downloads.xml | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/data/recommended-downloads.xml b/data/recommended-downloads.xml
index 51b885f..c9bd0f1 100644
--- a/data/recommended-downloads.xml
+++ b/data/recommended-downloads.xml
@@ -1,12 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
- These are OSes listed in the recommended section of the "Download an OS" page.
+ These are operating systems listed in the recommended section of the
+ "Download an OS" page.
- This list is powered by libosinfo, therefore the URLs are unique identifiers
- for each OS in osinfo-db.
+ This list is powered by libosinfo, therefore the IDs are unique identifiers
+ for each OS in osinfo-db. Use "osinfo-query os" in the CLI to list all available
+ operating systems and their respective IDs.
Downstreams are encouraged to tweak the list as they wish. Sorting is also
available.
+
+ "title", "subtitle" and "url" can be overwritten by distributors.
+
+ Distributors can host their own recommended-downloads.xml file, and point to it
+ with the org.gnome.boxes recommended-downloads-url gsetting.
+
+ See https://gitlab.gnome.org/GNOME/gnome-boxes/-/wikis/recommended-downloads.xml
-->
<list>
<os id="http://redhat.com/rhel/"/>
@@ -18,5 +27,9 @@
<os id="http://opensuse.org/opensuse/tumbleweed/"/>
<os id="http://debian.org/debian/"/>
<os id="http://endlessos.com/eos/"/>
- <os id="http://gnome.org/gnome/nightly"/>
+ <os id="http://gnome.org/gnome/nightly">
+ <title>GNOME OS Nightly</title>
+ <subtitle>The GNOME Project</subtitle>
+ <url>https://os.gnome.org/download/latest/gnome_os_installer.iso</url>
+ </os>
</list>
Update-recommended-downloads.patch
recommended-downloads-Change-XML-syntax-for-Osinfo.id.patch
assistant-Fetch-recommended-downloads-from-an-URL.patch
recommended-downloads-Allow-configuring-recommended-downl.patch
downloadable-entry-Allow-recommended-downloads-to-overrid.patch
recommended-downloads-Update-instructions-and-override-ex.patch
recommended-downloads-OpenSUSE-thumbleweed-ID-shouldn-t-e.patch
util-app-Make-recommended-downloads-parsing-handle-empty-.patch
assistant-Load-remote-Featured-Downloads-in-assistant-s-i.patch
From: Felipe Borges <felipeborges@gnome.org>
Date: Wed, 10 Aug 2022 09:54:41 +0200
Subject: util-app: Make recommended-downloads parsing handle empty media
lists
---
src/util-app.vala | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/util-app.vala b/src/util-app.vala
index 84a83ad..761a34e 100644
--- a/src/util-app.vala
+++ b/src/util-app.vala
@@ -250,7 +250,11 @@ private async GLib.List<Osinfo.Media>? parse_recommended_downloads_file (string
continue;
}
- var media = os.get_media_list ().get_nth (0) as Osinfo.Media;
+ var media_list = os.get_media_list ();
+ if (media_list == null || media_list.get_length () == 0)
+ continue;
+
+ var media = media_list.get_nth (0) as Osinfo.Media;
if (media.url != null || os_id.has_prefix ("http://redhat.com"))
list.append (media);