diff --git a/data/flatpak-manifest.schema.json b/data/flatpak-manifest.schema.json index 9f921985..cbb522a6 100644 --- a/data/flatpak-manifest.schema.json +++ b/data/flatpak-manifest.schema.json @@ -1451,10 +1451,22 @@ "description": "Any appdata (metainfo) file with this name will be renamed to a name based on id during the cleanup phase.", "type": "string" }, + "rename-mime-file": { + "description": "Any mimetypes file with this name will me renamed to a name based on id during the cleanup phase.", + "type": "string" + }, "rename-icon": { "description": "Any icon with this name will be renamed to a name based on id during the cleanup phase. Note that this is the icon name, not the full filenames, so it should not include a filename extension.", "type": "string" }, + "rename-mime-icons": { + "type": "array", + "description": "Any mime icons with any of these names will be renamed to a name prefixed with id during the cleanup phase. Note that this is the icon name, not the full filenames, so it should not include a filename extension.", + "items": { + "description": "Icon name to rename.", + "type": "string" + } + }, "appdata-license": { "description": "Replace the appdata (metainfo) project_license field with this string. This is useful as the upstream license is typically only about the application itself, whereas the bundled app can contain other licenses too.", "type": "string" diff --git a/doc/flatpak-manifest.xml b/doc/flatpak-manifest.xml index a84ca9fe..4ce2523e 100644 --- a/doc/flatpak-manifest.xml +++ b/doc/flatpak-manifest.xml @@ -261,10 +261,18 @@ (string) Any appdata (metainfo) file with this name will be renamed to a name based on id during the cleanup phase. + + (string) + Any mimetypes file with this name will me renamed to a name based on id during the cleanup phase. (since 1.4.0) + (string) Any icon with this name will be renamed to a name based on id during the cleanup phase. Note that this is the icon name, not the full filenames, so it should not include a filename extension. + + (array of string) + Any mime icons with any of these names will be renamed to a name prefixed with id during the cleanup phase. Note that this is the icon name, not the full filenames, so it should not include a filename extension. (since 1.4.0) + (string) Replace the appdata (metainfo) diff --git a/src/builder-manifest.c b/src/builder-manifest.c index 3cbbdff2..8a4f99cf 100644 --- a/src/builder-manifest.c +++ b/src/builder-manifest.c @@ -90,8 +90,10 @@ struct BuilderManifest char **tags; char *rename_desktop_file; char *rename_appdata_file; + char *rename_mime_file; char *appdata_license; char *rename_icon; + char **rename_mime_icons; gboolean copy_icon; char *desktop_file_name_prefix; char *desktop_file_name_suffix; @@ -160,8 +162,10 @@ enum { PROP_TAGS, PROP_RENAME_DESKTOP_FILE, PROP_RENAME_APPDATA_FILE, + PROP_RENAME_MIME_FILE, PROP_APPDATA_LICENSE, PROP_RENAME_ICON, + PROP_RENAME_MIME_ICONS, PROP_COPY_ICON, PROP_DESKTOP_FILE_NAME_PREFIX, PROP_DESKTOP_FILE_NAME_SUFFIX, @@ -212,8 +216,10 @@ builder_manifest_finalize (GObject *object) g_strfreev (self->tags); g_free (self->rename_desktop_file); g_free (self->rename_appdata_file); + g_free (self->rename_mime_file); g_free (self->appdata_license); g_free (self->rename_icon); + g_free (self->rename_mime_icons); g_free (self->desktop_file_name_prefix); g_free (self->desktop_file_name_suffix); @@ -450,6 +456,10 @@ builder_manifest_get_property (GObject *object, g_value_set_string (value, self->rename_appdata_file); break; + case PROP_RENAME_MIME_FILE: + g_value_set_string (value, self->rename_mime_file); + break; + case PROP_APPDATA_LICENSE: g_value_set_string (value, self->appdata_license); break; @@ -458,6 +468,10 @@ builder_manifest_get_property (GObject *object, g_value_set_string (value, self->rename_icon); break; + case PROP_RENAME_MIME_ICONS: + g_value_set_boxed (value, self->rename_mime_icons); + break; + case PROP_DESKTOP_FILE_NAME_PREFIX: g_value_set_string (value, self->desktop_file_name_prefix); break; @@ -711,6 +725,11 @@ builder_manifest_set_property (GObject *object, self->rename_appdata_file = g_value_dup_string (value); break; + case PROP_RENAME_MIME_FILE: + g_free (self->rename_mime_file); + self->rename_mime_file = g_value_dup_string (value); + break; + case PROP_APPDATA_LICENSE: g_free (self->appdata_license); self->appdata_license = g_value_dup_string (value); @@ -721,6 +740,12 @@ builder_manifest_set_property (GObject *object, self->rename_icon = g_value_dup_string (value); break; + case PROP_RENAME_MIME_ICONS: + tmp = self->rename_mime_icons; + self->rename_mime_icons = g_strdupv (g_value_get_boxed (value)); + g_strfreev (tmp); + break; + case PROP_DESKTOP_FILE_NAME_PREFIX: g_free (self->desktop_file_name_prefix); self->desktop_file_name_prefix = g_value_dup_string (value); @@ -1040,6 +1065,13 @@ builder_manifest_class_init (BuilderManifestClass *klass) "", NULL, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_RENAME_MIME_FILE, + g_param_spec_string ("rename-mime-file", + "", + "", + NULL, + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_APPDATA_LICENSE, g_param_spec_string ("appdata-license", @@ -1054,6 +1086,13 @@ builder_manifest_class_init (BuilderManifestClass *klass) "", NULL, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_RENAME_MIME_ICONS, + g_param_spec_boxed ("rename-mime-icons", + "", + "", + G_TYPE_STRV, + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_COPY_ICON, g_param_spec_boolean ("copy-icon", @@ -1865,8 +1904,10 @@ builder_manifest_checksum_for_cleanup (BuilderManifest *self, builder_cache_checksum_strv (cache, self->cleanup_commands); builder_cache_checksum_str (cache, self->rename_desktop_file); builder_cache_checksum_str (cache, self->rename_appdata_file); + builder_cache_checksum_str (cache, self->rename_mime_file); builder_cache_checksum_str (cache, self->appdata_license); builder_cache_checksum_str (cache, self->rename_icon); + builder_cache_checksum_strv (cache, self->rename_mime_icons); builder_cache_checksum_boolean (cache, self->copy_icon); builder_cache_checksum_str (cache, self->desktop_file_name_prefix); builder_cache_checksum_str (cache, self->desktop_file_name_suffix); @@ -2169,7 +2210,13 @@ command (GFile *app_dir, return builder_maybe_host_spawnv (NULL, NULL, 0, error, (const char * const *)args->pdata, NULL); } -typedef gboolean (*ForeachFileFunc) (BuilderManifest *self, +typedef struct { + const char *rename_icon; + gboolean copy_icon; + const char *id; +} ForeachFile; + +typedef gboolean (*ForeachFileFunc) (ForeachFile *self, int source_parent_fd, const char *source_name, const char *full_dir, @@ -2180,7 +2227,7 @@ typedef gboolean (*ForeachFileFunc) (BuilderManifest *self, GError **error); static gboolean -foreach_file_helper (BuilderManifest *self, +foreach_file_helper (ForeachFile *self, ForeachFileFunc func, int source_parent_fd, const char *source_name, @@ -2242,7 +2289,7 @@ foreach_file_helper (BuilderManifest *self, } static gboolean -foreach_file (BuilderManifest *self, +foreach_file (ForeachFile *self, ForeachFileFunc func, gboolean *found, GFile *root, @@ -2257,15 +2304,16 @@ foreach_file (BuilderManifest *self, } static gboolean -rename_icon_cb (BuilderManifest *self, - int source_parent_fd, - const char *source_name, - const char *full_dir, - const char *rel_dir, - struct stat *stbuf, - gboolean *found, - int depth, - GError **error) +_rename_icon (ForeachFile *self, + int source_parent_fd, + const char *source_name, + const char *full_dir, + const char *rel_dir, + gboolean prefix, + struct stat *stbuf, + gboolean *found, + int depth, + GError **error) { if (g_str_has_prefix (source_name, self->rename_icon)) { @@ -2275,8 +2323,12 @@ rename_icon_cb (BuilderManifest *self, g_str_has_prefix (source_name + strlen (self->rename_icon), "-symbolic."))) { const char *extension = source_name + strlen (self->rename_icon); - g_autofree char *new_name = g_strconcat (self->id, extension, NULL); + g_autofree char *new_name; int res; + if (!prefix) + new_name = g_strconcat (self->id, extension, NULL); + else + new_name = g_strconcat (self->id, ".", source_name, NULL); *found = TRUE; @@ -2307,6 +2359,40 @@ rename_icon_cb (BuilderManifest *self, return TRUE; } +static gboolean +rename_icon_cb (ForeachFile *self, + int source_parent_fd, + const char *source_name, + const char *full_dir, + const char *rel_dir, + struct stat *stbuf, + gboolean *found, + int depth, + GError **error) +{ + return _rename_icon (self, + source_parent_fd, source_name, + full_dir, rel_dir, FALSE, + stbuf, found, depth, error); +} + +static gboolean +rename_mime_icon_cb (ForeachFile *self, + int source_parent_fd, + const char *source_name, + const char *full_dir, + const char *rel_dir, + struct stat *stbuf, + gboolean *found, + int depth, + GError **error) +{ + return _rename_icon (self, + source_parent_fd, source_name, + full_dir, rel_dir, TRUE, + stbuf, found, depth, error); +} + static int cmpstringp (const void *p1, const void *p2) { @@ -2459,6 +2545,147 @@ builder_manifest_find_appdata_file (BuilderManifest *self, return NULL; } +/* Perform `rename-mime-file` */ +static gboolean +_cleanup_rename_mime_file (BuilderManifest *self, GFile *app_root, + GError **error) +{ + g_autoptr(GFile) applications_dir = g_file_resolve_relative_path (app_root, "share/mime/packages"); + g_autoptr(GFile) src = g_file_get_child (applications_dir, self->rename_mime_file); + g_autofree char *mime_basename = g_strdup_printf ("%s.xml", self->id); + g_autoptr(GFile) dest = g_file_get_child (applications_dir, mime_basename); + + g_print ("Renaming %s to %s\n", self->rename_mime_file, mime_basename); + if (!g_file_move (src, dest, 0, NULL, NULL, NULL, error)) + return FALSE; + + return TRUE; +} + +static gboolean +_rename_mime_icon (BuilderManifest *self, const char *rename_icon, + GFile *icons_dir, + GError **error) +{ + gboolean found_icon = FALSE; + + ForeachFile renamer; + renamer.rename_icon = rename_icon; + renamer.copy_icon = self->copy_icon; + renamer.id = self->id; + if (!foreach_file (&renamer, rename_mime_icon_cb, &found_icon, icons_dir, error)) + return FALSE; + + if (!found_icon) + { + g_autofree char *icon_path = g_file_get_path (icons_dir); + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "icon %s not found below %s", + rename_icon, icon_path); + return FALSE; + } + + return TRUE; +} + +/* Rename the icons inside the mime_file. + * + * The problem is that they may not be in the file as there is an + * automatic mapping of mimetypes with icon name, so we have to add + * them to he mime file in that case. + */ +static gboolean +_cleanup_mime_file_rename_icons (char **rename_mime_icons, + GFile *mime_file, + const char *id, GError **error) +{ + FlatpakXml *n_root; + g_autoptr(FlatpakXml) xml_root = NULL; + g_autoptr(GInputStream) in = NULL; + g_autoptr(GString) new_contents = NULL; + + in = (GInputStream *) g_file_read (mime_file, NULL, error); + if (!in) + return FALSE; + xml_root = flatpak_xml_parse (in, FALSE, NULL, error); + if (!xml_root) + return FALSE; + + n_root = flatpak_xml_find (xml_root, "mime-info", NULL); + + for (char **current = rename_mime_icons; *current; current++) + { + FlatpakXml *n_type = NULL; + while ((n_type = flatpak_xml_find_next (n_root, "mime-type", n_type, NULL))) + { + FlatpakXml *n_icon = flatpak_xml_find (n_type, "icon", NULL); + if (!n_icon) + n_icon = flatpak_xml_find (n_type, "generic-icon", NULL); + if (n_icon) + { + const gchar *icon_name = flatpak_xml_attribute (n_icon, "name"); + if (g_strcmp0 (*current, icon_name) == 0) + { + g_autofree gchar *renamed_icon = g_strdup_printf ("%s.%s", id, icon_name); + flatpak_xml_set_attribute (n_icon, "name", renamed_icon); + } + } + else + { + g_autofree char* mimetype = g_strdup(flatpak_xml_attribute (n_type, "type")); + /* Convert the mime type to an icon name. */ + for (char *p = mimetype; *p; p++) + if (*p == '/') + *p = '-'; + + if (g_strcmp0(mimetype, *current) == 0) + { + g_autofree gchar *renamed_icon = g_strdup_printf ("%s.%s", id, *current); + const gchar *attrs[] = { "name", NULL }; + const gchar *vals[] = { renamed_icon, NULL }; + n_icon = flatpak_xml_new_with_attributes ("icon", attrs, vals); + flatpak_xml_add (n_type, g_steal_pointer (&n_icon)); + } + } + } + } + + new_contents = g_string_new (""); + flatpak_xml_to_string (xml_root, new_contents); + if (!g_file_set_contents (flatpak_file_get_path_cached (mime_file), + new_contents->str, + new_contents->len, + error)) + return FALSE; + + return TRUE; +} + +/* Perform `rename-mime-icons` */ +static gboolean +_cleanup_rename_mime_icons (BuilderManifest *self, GFile *app_root, + GError **error) +{ + g_autoptr(GFile) icons_dir = g_file_resolve_relative_path (app_root, "share/icons"); + g_autoptr(GFile) mime_dir; + g_autofree char *mime_basename; + g_autoptr(GFile) mime_file; + + for (char **current = self->rename_mime_icons; *current; current++) + if (!_rename_mime_icon (self, *current, icons_dir, error)) + return FALSE; + + mime_dir = g_file_resolve_relative_path (app_root, "share/mime/packages"); + mime_basename = g_strdup_printf ("%s.xml", self->id); + mime_file = g_file_get_child (mime_dir, mime_basename); + + if (!_cleanup_mime_file_rename_icons (self->rename_mime_icons, mime_file, + self->id, error)) + return FALSE; + + return TRUE; +} + gboolean builder_manifest_cleanup (BuilderManifest *self, BuilderCache *cache, @@ -2625,12 +2852,19 @@ builder_manifest_cleanup (BuilderManifest *self, } } + if (self->rename_mime_file != NULL) + if (!_cleanup_rename_mime_file (self, app_root, error)) + return FALSE; + if (self->rename_icon) { gboolean found_icon = FALSE; g_autoptr(GFile) icons_dir = g_file_resolve_relative_path (app_root, "share/icons"); - - if (!foreach_file (self, rename_icon_cb, &found_icon, icons_dir, error)) + ForeachFile renamer; + renamer.rename_icon = self->rename_icon; + renamer.copy_icon = self->copy_icon; + renamer.id = self->id; + if (!foreach_file (&renamer, rename_icon_cb, &found_icon, icons_dir, error)) return FALSE; if (!found_icon) @@ -2643,6 +2877,10 @@ builder_manifest_cleanup (BuilderManifest *self, } } + if (self->rename_mime_icons) + if (!_cleanup_rename_mime_icons (self, app_root, error)) + return FALSE; + if (self->rename_icon || self->desktop_file_name_prefix || self->desktop_file_name_suffix || diff --git a/src/builder-utils.c b/src/builder-utils.c index bd43c88b..e4d11ebe 100644 --- a/src/builder-utils.c +++ b/src/builder-utils.c @@ -1409,6 +1409,20 @@ flatpak_xml_new (const gchar *element_name) return node; } +FlatpakXml * +flatpak_xml_new_with_attributes (const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values) +{ + FlatpakXml *node = g_new0 (FlatpakXml, 1); + + node->element_name = g_strdup (element_name); + node->attribute_names = g_strdupv ((char **) attribute_names); + node->attribute_values = g_strdupv ((char **) attribute_values); + + return node; +} + FlatpakXml * flatpak_xml_new_text (const gchar *text) { @@ -1441,9 +1455,9 @@ xml_start_element (GMarkupParseContext *context, XmlData *data = user_data; FlatpakXml *node; - node = flatpak_xml_new (element_name); - node->attribute_names = g_strdupv ((char **) attribute_names); - node->attribute_values = g_strdupv ((char **) attribute_values); + node = flatpak_xml_new_with_attributes (element_name, + attribute_names, + attribute_values); flatpak_xml_add (data->current, node); data->current = node; @@ -1515,6 +1529,31 @@ flatpak_xml_free (FlatpakXml *node) g_free (node); } +const gchar * +flatpak_xml_attribute (FlatpakXml *node, const gchar* name) +{ + if (node->attribute_names) + for (int i = 0; node->attribute_names[i] != NULL; i++) + if (g_strcmp0(node->attribute_names[i], name) == 0) + return node->attribute_values[i]; + + return NULL; +} + +gboolean +flatpak_xml_set_attribute (FlatpakXml *node, const gchar* name, const gchar* value) +{ + if (node->attribute_names) + for (int i = 0; node->attribute_names[i] != NULL; i++) + if (g_strcmp0(node->attribute_names[i], name) == 0) + { + g_free (node->attribute_values[i]); + node->attribute_values[i] = g_strdup (value); + return TRUE; + } + + return FALSE; +} void flatpak_xml_to_string (FlatpakXml *node, GString *res) @@ -1535,9 +1574,11 @@ flatpak_xml_to_string (FlatpakXml *node, GString *res) { for (i = 0; node->attribute_names[i] != NULL; i++) { - g_string_append_printf (res, " %s=\"%s\"", - node->attribute_names[i], - node->attribute_values[i]); + g_autofree char* attr = + g_markup_printf_escaped (" %s=\"%s\"", + node->attribute_names[i], + node->attribute_values[i]); + g_string_append (res, attr); } } if (node->first_child == NULL) @@ -1594,12 +1635,29 @@ FlatpakXml * flatpak_xml_find (FlatpakXml *node, const char *type, FlatpakXml **prev_child_out) +{ + return flatpak_xml_find_next (node, type, NULL, prev_child_out); +} + +FlatpakXml * +flatpak_xml_find_next (FlatpakXml *node, + const char *type, + FlatpakXml *sibling, + FlatpakXml **prev_child_out) { FlatpakXml *child = NULL; FlatpakXml *prev_child = NULL; - child = node->first_child; - prev_child = NULL; + if (!sibling) + { + child = node->first_child; + prev_child = NULL; + } + else + { + child = sibling->next_sibling; + prev_child = sibling; + } while (child != NULL) { FlatpakXml *next = child->next_sibling; diff --git a/src/builder-utils.h b/src/builder-utils.h index 615d06d7..0b24b272 100644 --- a/src/builder-utils.h +++ b/src/builder-utils.h @@ -169,6 +169,9 @@ struct FlatpakXml }; FlatpakXml *flatpak_xml_new (const gchar *element_name); +FlatpakXml *flatpak_xml_new_with_attributes (const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values); FlatpakXml *flatpak_xml_new_text (const gchar *text); void flatpak_xml_add (FlatpakXml *parent, FlatpakXml *node); @@ -177,13 +180,26 @@ FlatpakXml *flatpak_xml_parse (GInputStream *in, gboolean compressed, GCancellable *cancellable, GError **error); +const gchar *flatpak_xml_attribute (FlatpakXml *node, + const gchar *name); +gboolean flatpak_xml_set_attribute (FlatpakXml *node, + const gchar *name, + const gchar *value); void flatpak_xml_to_string (FlatpakXml *node, GString *res); FlatpakXml *flatpak_xml_unlink (FlatpakXml *node, FlatpakXml *prev_sibling); +/** Find the first child of `type`. */ FlatpakXml *flatpak_xml_find (FlatpakXml *node, const char *type, FlatpakXml **prev_child_out); +/** Find the next child from sibling. If `sibling` is NULL, it's + * equivalant to calling `flatpak_xml_find()`. + */ +FlatpakXml *flatpak_xml_find_next (FlatpakXml *node, + const char *type, + FlatpakXml *sibling, + FlatpakXml **prev_child_out); GBytes * flatpak_read_stream (GInputStream *in, gboolean null_terminate, diff --git a/tests/Hello.desktop b/tests/Hello.desktop new file mode 100644 index 00000000..46fbd76f --- /dev/null +++ b/tests/Hello.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Hello +Exec=hello2.sh +Icon=Hello +MimeType=x-test/Hello; diff --git a/tests/Hello.xml b/tests/Hello.xml new file mode 100644 index 00000000..c1e2be1f --- /dev/null +++ b/tests/Hello.xml @@ -0,0 +1,17 @@ + + + + Hello Document + + + + + + + + + Goodbye Document + + + + diff --git a/tests/Makefile.am.inc b/tests/Makefile.am.inc index 00ea4a8d..d9602222 100644 --- a/tests/Makefile.am.inc +++ b/tests/Makefile.am.inc @@ -21,6 +21,9 @@ dist_installed_test_data = \ tests/libtest.sh \ tests/org.test.Hello.png \ tests/org.test.Hello.desktop \ + tests/Hello.desktop \ + tests/org.test.Hello.xml \ + tests/Hello.xml \ tests/source1.json \ tests/source2.json \ tests/test.json \ diff --git a/tests/meson.build b/tests/meson.build index b82a64ea..6ec405d1 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -89,6 +89,9 @@ if get_option('installed_tests') 'org.test.Deprecated.SHA1.file.yaml', 'org.test.Hello.png', 'org.test.Hello.desktop', + 'Hello.desktop', + 'org.test.Hello.xml', + 'Hello.xml', 'org.test.Python.json', 'org.test.Python2.json', 'session.conf.in', diff --git a/tests/org.test.Hello.desktop b/tests/org.test.Hello.desktop index 7a2a6046..21fddcd6 100644 --- a/tests/org.test.Hello.desktop +++ b/tests/org.test.Hello.desktop @@ -3,5 +3,5 @@ Version=1.0 Type=Application Name=Hello Exec=hello2.sh -Icon=org.test.Hello +Icon=org.test.Hello2 MimeType=x-test/Hello; diff --git a/tests/org.test.Hello.xml b/tests/org.test.Hello.xml new file mode 100644 index 00000000..8d96de43 --- /dev/null +++ b/tests/org.test.Hello.xml @@ -0,0 +1,18 @@ + + + + Hello Document + + + + + + + + + + Goodbye Document + + + + diff --git a/tests/test-builder.sh b/tests/test-builder.sh index 2c9199f8..31075814 100755 --- a/tests/test-builder.sh +++ b/tests/test-builder.sh @@ -41,7 +41,10 @@ cp $(dirname $0)/test.json . cp $(dirname $0)/test.yaml . cp $(dirname $0)/test-runtime.json . cp $(dirname $0)/0001-Add-test-logo.patch . +cp $(dirname $0)/Hello.desktop . +cp $(dirname $0)/Hello.xml . cp $(dirname $0)/org.test.Hello.desktop . +cp $(dirname $0)/org.test.Hello.xml . mkdir include1 cp $(dirname $0)/module1.json include1/ cp $(dirname $0)/module1.yaml include1/ @@ -70,8 +73,13 @@ for MANIFEST in test.json test.yaml test-rename.json ; do assert_has_file appdir/files/cleaned_up > out assert_has_file appdir/files/share/icons/hicolor/64x64/apps/org.test.Hello2.png + assert_has_file appdir/files/share/icons/hicolor/64x64/mimetypes/org.test.Hello2.application-x-hello.png + assert_has_file appdir/files/share/icons/hicolor/64x64/mimetypes/org.test.Hello2.application-x-goodbye.png assert_has_file appdir/files/share/applications/org.test.Hello2.desktop + assert_has_file appdir/files/share/mime/packages/org.test.Hello2.xml + xmllint appdir/files/share/mime/packages/org.test.Hello2.xml >&2 + assert_file_has_content appdir/files/out '^foo$' assert_file_has_content appdir/files/out2 '^foo2$' diff --git a/tests/test-rename.json b/tests/test-rename.json index af39465d..a8ee82d6 100644 --- a/tests/test-rename.json +++ b/tests/test-rename.json @@ -10,6 +10,11 @@ ], "rename-icon": "Hello", "rename-desktop-file": "Hello.desktop", + "rename-mime-file": "Hello.xml", + "rename-mime-icons": [ + "application-x-hello", + "application-x-goodbye" + ], "build-options" : { "cflags": "-O2 -g", "cxxflags": "-O2 -g", @@ -31,9 +36,14 @@ "post-install": [ "touch /app/bin/file.cleanup", "mkdir -p /app/share/icons/hicolor/64x64/apps/", + "mkdir -p /app/share/icons/hicolor/64x64/mimetypes/", "cp org.test.Hello.png /app/share/icons/hicolor/64x64/apps/Hello.png", + "cp org.test.Hello.png /app/share/icons/hicolor/64x64/mimetypes/application-x-hello.png", + "cp org.test.Hello.png /app/share/icons/hicolor/64x64/mimetypes/application-x-goodbye.png", "mkdir -p /app/share/applications", - "cp org.test.Hello.desktop /app/share/applications/Hello.desktop" + "cp Hello.desktop /app/share/applications/", + "mkdir -p /app/share/mime/packages", + "cp Hello.xml /app/share/mime/packages/" ], "make-args": ["BAR=2" ], "make-install-args": ["BAR=3" ], @@ -51,7 +61,11 @@ }, { "type": "file", - "path": "org.test.Hello.desktop" + "path": "Hello.desktop" + }, + { + "type": "file", + "path": "Hello.xml" }, { "type": "script", diff --git a/tests/test.json b/tests/test.json index def26f47..c58ae9ca 100644 --- a/tests/test.json +++ b/tests/test.json @@ -29,9 +29,14 @@ "post-install": [ "touch /app/bin/file.cleanup", "mkdir -p /app/share/icons/hicolor/64x64/apps/", + "mkdir -p /app/share/icons/hicolor/64x64/mimetypes/", "cp org.test.Hello.png /app/share/icons/hicolor/64x64/apps/$FLATPAK_ID.png", + "cp org.test.Hello.png /app/share/icons/hicolor/64x64/mimetypes/$FLATPAK_ID.application-x-hello.png", + "cp org.test.Hello.png /app/share/icons/hicolor/64x64/mimetypes/$FLATPAK_ID.application-x-goodbye.png", "mkdir -p /app/share/applications", - "cp org.test.Hello.desktop /app/share/applications/$FLATPAK_ID.desktop" + "cp org.test.Hello.desktop /app/share/applications/$FLATPAK_ID.desktop", + "mkdir -p /app/share/mime/packages", + "cp org.test.Hello.xml /app/share/mime/packages/$FLATPAK_ID.xml" ], "make-args": ["BAR=2" ], "make-install-args": ["BAR=3" ], @@ -56,6 +61,10 @@ "type": "file", "path": "org.test.Hello.desktop" }, + { + "type": "file", + "path": "org.test.Hello.xml" + }, { "type": "shell", "commands": [ diff --git a/tests/test.yaml b/tests/test.yaml index 2c447de7..65fb6c48 100644 --- a/tests/test.yaml +++ b/tests/test.yaml @@ -23,9 +23,14 @@ modules: post-install: - touch /app/bin/file.cleanup - mkdir -p /app/share/icons/hicolor/64x64/apps/ + - mkdir -p /app/share/icons/hicolor/64x64/mimetypes/ - cp org.test.Hello.png /app/share/icons/hicolor/64x64/apps/$FLATPAK_ID.png + - cp org.test.Hello.png /app/share/icons/hicolor/64x64/mimetypes/$FLATPAK_ID.application-x-hello.png + - cp org.test.Hello.png /app/share/icons/hicolor/64x64/mimetypes/$FLATPAK_ID.application-x-goodbye.png - mkdir -p /app/share/applications - cp org.test.Hello.desktop /app/share/applications/$FLATPAK_ID.desktop + - mkdir -p /app/share/mime/packages + - cp org.test.Hello.xml /app/share/mime/packages/$FLATPAK_ID.xml make-args: [BAR=2] make-install-args: [BAR=3] build-commands: ['echo foo > /app/out'] @@ -41,6 +46,8 @@ modules: commands: ['echo "Hello world2, from a sandbox"'] - type: file path: org.test.Hello.desktop + - type: file + path: org.test.Hello.xml - type: shell commands: - mkdir /app/cleanup/