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




commit c51b0fb74cfb1a42b38ec31d14d95f3666f01af9
Author: Matthias Klumpp <matthias tenstral net>
Date:   Fri Feb 25 03:02: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..55afe2d99 100644
--- a/contrib/org.gnome.SoftwareDevel.json
+++ b/contrib/org.gnome.SoftwareDevel.json
@@ -25,6 +25,10 @@
         "--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=/var/lib/swcatalog:ro",
+        "--filesystem=/var/cache/swcatalog:ro",
         "--filesystem=/usr/share/appdata:ro",
         "--filesystem=/usr/share/app-info:ro",
         "--filesystem=/var/lib/app-info:ro",
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 23462c0db..4d9b5eee1 100644
--- a/lib/gs-external-appstream-utils.c
+++ b/lib/gs-external-appstream-utils.c
@@ -14,7 +14,7 @@
 
 #include "gs-external-appstream-utils.h"
 
-#define APPSTREAM_SYSTEM_DIR LOCALSTATEDIR "/cache/app-info/xmls"
+#define APPSTREAM_SYSTEM_DIR LOCALSTATEDIR "/cache/swcatalog/xml"
 
 gchar *
 gs_external_appstream_utils_get_file_cache_path (const gchar *file_name)
@@ -228,8 +228,8 @@ gs_external_appstream_refresh_user (GsPlugin      *plugin,
 
        /* check age */
        fullpath = g_build_filename (g_get_user_data_dir (),
-                                    "app-info",
-                                    "xmls",
+                                    "swcatalog",
+                                    "xml",
                                     basename,
                                     NULL);
        file = g_file_new_for_path (fullpath);
diff --git a/plugins/core/gs-plugin-appstream.c b/plugins/core/gs-plugin-appstream.c
index cde6a5c2c..6d37abb9c 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]