[gnome-software/wip/mak/swcatalog: 1/2] Find AppStream metadata in every possible location




commit 290c53b2acb83c798b113f12067f8d5ac65cf116
Author: Matthias Klumpp <matthias tenstral net>
Date:   Mon Mar 7 16:27:15 2022 +0100

    Find AppStream metadata in every possible location
    
    AppStream Metadata can currently be found in:
    Modern:
     MetaInfo data:
      /usr/share/metainfo
     Catalog Data:
      /usr/share/swcatalog/(xml|yaml)
      /var/(lib|cache)/swcatalog/(xml|yaml)
    
    Legacy:
     MetaInfo Data:
      /usr/share/appdata
     Catalog Data:
      /usr/share/app-info/(xml|xmls|yaml)
      /var/(lib|cache)/app-info/(xml|xmls|yaml)
    
    With this patch, we search them all, and don't monitor any locations
    that have a compatibility symlink.
    
    See
    https://www.freedesktop.org/software/appstream/docs/chap-CollectionData.html#spec-asxml-filenaming
    for information on AppStream collection data locations.

 contrib/org.gnome.SoftwareDevel.json |   4 ++
 data/assets/meson.build              |   4 +-
 doc/vendor-customisation.md          |   2 +-
 lib/gs-external-appstream-utils.c    |   6 +--
 plugins/core/gs-plugin-appstream.c   | 100 ++++++++++++++++++++++-------------
 5 files changed, 72 insertions(+), 44 deletions(-)
---
diff --git a/contrib/org.gnome.SoftwareDevel.json b/contrib/org.gnome.SoftwareDevel.json
index 4f7e0f90b..be4a5340c 100644
--- a/contrib/org.gnome.SoftwareDevel.json
+++ b/contrib/org.gnome.SoftwareDevel.json
@@ -25,9 +25,13 @@
         "--filesystem=/var/lib/flatpak",
         "--env=FLATPAK_SYSTEM_DIR=/var/lib/flatpak",
         "--filesystem=xdg-data/flatpak",
+        "--filesystem=/usr/share/metainfo:ro",
+        "--filesystem=/usr/share/swcatalog:ro",
         "--filesystem=/usr/share/appdata:ro",
         "--filesystem=/usr/share/app-info:ro",
+        "--filesystem=/var/lib/swcatalog:ro",
         "--filesystem=/var/lib/app-info:ro",
+        "--filesystem=/var/cache/swcatalog:ro",
         "--filesystem=/var/cache/app-info:ro"
     ],
     "modules": [
diff --git a/data/assets/meson.build b/data/assets/meson.build
index 2f0ed4b51..956875fc2 100644
--- a/data/assets/meson.build
+++ b/data/assets/meson.build
@@ -1,11 +1,11 @@
 if get_option('default_featured_apps')
   install_data('org.gnome.Software.Featured.xml',
-    install_dir : join_paths(get_option('datadir'), 'app-info', 'xmls'),
+    install_dir : join_paths(get_option('datadir'), 'swcatalog', 'xml'),
   )
 endif
 
 if get_option('hardcoded_popular')
   install_data('org.gnome.Software.Popular.xml',
-    install_dir : join_paths(get_option('datadir'), 'app-info', 'xmls'),
+    install_dir : join_paths(get_option('datadir'), 'swcatalog', 'xml'),
   )
 endif
diff --git a/doc/vendor-customisation.md b/doc/vendor-customisation.md
index 6e7d3d9bf..9e8b556a9 100644
--- a/doc/vendor-customisation.md
+++ b/doc/vendor-customisation.md
@@ -114,7 +114,7 @@ highlighted as required, all of which involve providing an additional appstream
 file which sets the additional metainfo for those applications.
 
 The main approach is to ship an additional distro-specific appstream file in
-`${DATADIR}/app-info/xmls`, providing and updating it via normal distribution
+`${DATADIR}/swcatalog/xml`, providing and updating it via normal distribution
 channels. For example, by packaging it in its own package which is updated
 regularly.
 
diff --git a/lib/gs-external-appstream-utils.c b/lib/gs-external-appstream-utils.c
index 54cd20d4f..b3e1ddd29 100644
--- a/lib/gs-external-appstream-utils.c
+++ b/lib/gs-external-appstream-utils.c
@@ -54,7 +54,7 @@
 
 #include "gs-external-appstream-utils.h"
 
-#define APPSTREAM_SYSTEM_DIR LOCALSTATEDIR "/cache/app-info/xmls"
+#define APPSTREAM_SYSTEM_DIR LOCALSTATEDIR "/cache/swcatalog/xml"
 
 G_DEFINE_QUARK (gs-external-appstream-error-quark, gs_external_appstream_error)
 
@@ -174,8 +174,8 @@ refresh_url_async (GSettings           *settings,
                target_file_path = gs_external_appstream_utils_get_file_cache_path (basename);
        else
                target_file_path = g_build_filename (g_get_user_data_dir (),
-                                                    "app-info",
-                                                    "xmls",
+                                                    "swcatalog",
+                                                    "xml",
                                                     basename,
                                                     NULL);
 
diff --git a/plugins/core/gs-plugin-appstream.c b/plugins/core/gs-plugin-appstream.c
index b04a4e427..897a0fa1a 100644
--- a/plugins/core/gs-plugin-appstream.c
+++ b/plugins/core/gs-plugin-appstream.c
@@ -584,6 +584,51 @@ gs_plugin_appstream_load_appstream (GsPluginAppstream  *self,
        return TRUE;
 }
 
+static void
+gs_add_appstream_catalog_location (GPtrArray *locations, const gchar *root)
+{
+       g_autofree gchar *catalog_path = NULL;
+       g_autofree gchar *catalog_legacy_path = NULL;
+       gboolean ignore_legacy_path = FALSE;
+
+       catalog_path = g_build_filename (root, "swcatalog", NULL);
+       catalog_legacy_path = g_build_filename (root, "app-info", NULL);
+
+       /* ignore compatibility symlink if one exists, so we don't scan the same location twice */
+       if (g_file_test (catalog_legacy_path, G_FILE_TEST_IS_SYMLINK)) {
+               g_autofree gchar *link_target = g_file_read_link (catalog_legacy_path, NULL);
+               if (link_target != NULL) {
+                       if (g_strcmp0 (link_target, catalog_path) == 0) {
+                               ignore_legacy_path = TRUE;
+                               g_debug ("Ignoring legacy AppStream catalog location '%s'.", 
catalog_legacy_path);
+                       }
+               }
+       }
+
+       g_ptr_array_add (locations,
+                        g_build_filename (catalog_path, "xml", NULL));
+       g_ptr_array_add (locations,
+                        g_build_filename (catalog_path, "yaml", NULL));
+
+       if (!ignore_legacy_path) {
+               g_ptr_array_add (locations,
+                                g_build_filename (catalog_legacy_path, "xml", NULL));
+               g_ptr_array_add (locations,
+                                g_build_filename (catalog_legacy_path, "xmls", NULL));
+               g_ptr_array_add (locations,
+                                g_build_filename (catalog_legacy_path, "yaml", NULL));
+       }
+}
+
+static void
+gs_add_appstream_metainfo_location (GPtrArray *locations, const gchar *root)
+{
+       g_ptr_array_add (locations,
+                        g_build_filename (root, "metainfo", NULL));
+       g_ptr_array_add (locations,
+                        g_build_filename (root, "appdata", NULL));
+}
+
 static gboolean
 gs_plugin_appstream_check_silo (GsPluginAppstream  *self,
                                 GCancellable       *cancellable,
@@ -655,31 +700,22 @@ gs_plugin_appstream_check_silo (GsPluginAppstream  *self,
                xb_builder_source_add_fixup (source, fixup2);
                xb_builder_import_source (builder, source);
        } else {
+               g_autofree gchar *state_cache_dir = NULL;
+               g_autofree gchar *state_lib_dir = NULL;
+
                /* add search paths */
-               g_ptr_array_add (parent_appstream,
-                                g_build_filename (DATADIR, "app-info", "xmls", NULL));
-               g_ptr_array_add (parent_appstream,
-                                g_build_filename (DATADIR, "app-info", "yaml", NULL));
-               g_ptr_array_add (parent_appdata,
-                                g_build_filename (DATADIR, "appdata", NULL));
-               g_ptr_array_add (parent_appdata,
-                                g_build_filename (DATADIR, "metainfo", NULL));
-               g_ptr_array_add (parent_appstream,
-                                g_build_filename (LOCALSTATEDIR, "cache", "app-info", "xmls", NULL));
-               g_ptr_array_add (parent_appstream,
-                                g_build_filename (LOCALSTATEDIR, "cache", "app-info", "yaml", NULL));
-               g_ptr_array_add (parent_appstream,
-                                g_build_filename (LOCALSTATEDIR, "lib", "app-info", "xmls", NULL));
-               g_ptr_array_add (parent_appstream,
-                                g_build_filename (LOCALSTATEDIR, "lib", "app-info", "yaml", NULL));
+               gs_add_appstream_catalog_location (parent_appstream, DATADIR);
+               gs_add_appstream_metainfo_location (parent_appdata, DATADIR);
+
+               state_cache_dir = g_build_filename (LOCALSTATEDIR, "cache", NULL);
+               gs_add_appstream_catalog_location (parent_appstream, state_cache_dir);
+               state_lib_dir = g_build_filename (LOCALSTATEDIR, "lib", NULL);
+               gs_add_appstream_catalog_location (parent_appstream, state_lib_dir);
+
 #ifdef ENABLE_EXTERNAL_APPSTREAM
                /* check for the corresponding setting */
-               if (!g_settings_get_boolean (self->settings, "external-appstream-system-wide")) {
-                       g_ptr_array_add (parent_appstream,
-                                        g_build_filename (g_get_user_data_dir (), "app-info", "xmls", NULL));
-                       g_ptr_array_add (parent_appstream,
-                                        g_build_filename (g_get_user_data_dir (), "app-info", "yaml", NULL));
-               }
+               if (!g_settings_get_boolean (self->settings, "external-appstream-system-wide"))
+                       gs_add_appstream_catalog_location (parent_appstream, g_get_user_data_dir ());
 #endif
 
                /* Add the normal system directories if the installation prefix
@@ -687,24 +723,12 @@ gs_plugin_appstream_check_silo (GsPluginAppstream  *self,
                 * development builds. It’s useful to still list the system apps
                 * during development. */
                if (g_strcmp0 (DATADIR, "/usr/share") != 0) {
-                       g_ptr_array_add (parent_appstream,
-                                        g_build_filename ("/usr/share", "app-info", "xmls", NULL));
-                       g_ptr_array_add (parent_appstream,
-                                        g_build_filename ("/usr/share", "app-info", "yaml", NULL));
-                       g_ptr_array_add (parent_appdata,
-                                        g_build_filename ("/usr/share", "appdata", NULL));
-                       g_ptr_array_add (parent_appdata,
-                                        g_build_filename ("/usr/share", "metainfo", NULL));
+                       gs_add_appstream_catalog_location (parent_appstream, "/usr/share");
+                       gs_add_appstream_metainfo_location (parent_appdata, "/usr/share");
                }
                if (g_strcmp0 (LOCALSTATEDIR, "/var") != 0) {
-                       g_ptr_array_add (parent_appstream,
-                                        g_build_filename ("/var", "cache", "app-info", "xmls", NULL));
-                       g_ptr_array_add (parent_appstream,
-                                        g_build_filename ("/var", "cache", "app-info", "yaml", NULL));
-                       g_ptr_array_add (parent_appstream,
-                                        g_build_filename ("/var", "lib", "app-info", "xmls", NULL));
-                       g_ptr_array_add (parent_appstream,
-                                        g_build_filename ("/var", "lib", "app-info", "yaml", NULL));
+                       gs_add_appstream_catalog_location (parent_appstream, "/var/cache");
+                       gs_add_appstream_catalog_location (parent_appstream, "/var/lib");
                }
 
                /* import all files */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]