From 38b6c80a3b6880fc60d4480e2a818b9343a16cd1 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Mon, 18 Nov 2019 10:51:22 +0100 Subject: [PATCH] archive source: Allow overriding the archive type This allows unpacking files that would otherwise not be recognised as of a particular type, such as self-extracting files supported by zip, 7z or cabextract. --- doc/flatpak-manifest.xml | 7 +++++ src/builder-source-archive.c | 56 +++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/doc/flatpak-manifest.xml b/doc/flatpak-manifest.xml index 51878674..4922a4c5 100644 --- a/doc/flatpak-manifest.xml +++ b/doc/flatpak-manifest.xml @@ -644,6 +644,13 @@ (boolean) Whether to initialise the repository as a git repository. + + (string) + + The type of archive if it cannot be guessed from the path. Possible values are "rpm", "tar", + "tar-gzip", "tar-compress", "tar-bzip2", "tar-lzip", "tar-lzma", "tar-lzop", "tar-xz" and "zip". + + (string) The md5 checksum of the file, verified after download diff --git a/src/builder-source-archive.c b/src/builder-source-archive.c index 29419273..80eebabc 100644 --- a/src/builder-source-archive.c +++ b/src/builder-source-archive.c @@ -46,6 +46,7 @@ struct BuilderSourceArchive guint strip_components; char *dest_filename; gboolean git_init; + char *archive_type; }; typedef struct @@ -67,6 +68,7 @@ enum { PROP_DEST_FILENAME, PROP_MIRROR_URLS, PROP_GIT_INIT, + PROP_ARCHIVE_TYPE, LAST_PROP }; @@ -135,6 +137,7 @@ builder_source_archive_finalize (GObject *object) g_free (self->sha512); g_free (self->dest_filename); g_strfreev (self->mirror_urls); + g_free (self->archive_type); G_OBJECT_CLASS (builder_source_archive_parent_class)->finalize (object); } @@ -189,6 +192,10 @@ builder_source_archive_get_property (GObject *object, g_value_set_boolean (value, self->git_init); break; + case PROP_ARCHIVE_TYPE: + g_value_set_string (value, self->archive_type); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -254,6 +261,11 @@ builder_source_archive_set_property (GObject *object, self->git_init = g_value_get_boolean (value); break; + case PROP_ARCHIVE_TYPE: + g_free (self->archive_type); + self->archive_type = g_value_dup_string (value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -629,6 +641,39 @@ init_git (GFile *dir, return TRUE; } +static BuilderArchiveType +get_type_from_prop (BuilderSourceArchive *self) +{ + struct { + const char *id; + BuilderArchiveType type; + } str_to_types[] = { + { "rpm", RPM }, + { "tar", TAR }, + { "tar-gzip", TAR_GZIP }, + { "tar-compress", TAR_COMPRESS }, + { "tar-bzip2", TAR_BZIP2 }, + { "tar-lzip", TAR_LZIP }, + { "tar-lzma", TAR_LZMA }, + { "tar-xz", TAR_XZ }, + { "zip", ZIP }, + }; + guint i; + + if (self->archive_type == NULL) + return UNKNOWN; + + for (i = 0; i < G_N_ELEMENTS(str_to_types); i++) + { + if (g_strcmp0 (self->archive_type, str_to_types[i].id) == 0) + return str_to_types[i].type; + } + + g_warning ("Unknown archive-type \"%s\"", self->archive_type); + + return UNKNOWN; +} + static gboolean builder_source_archive_extract (BuilderSource *source, GFile *dest, @@ -647,7 +692,9 @@ builder_source_archive_extract (BuilderSource *source, if (archivefile == NULL) return FALSE; - type = get_type (archivefile); + type = get_type_from_prop (self); + if (type == UNKNOWN) + type = get_type (archivefile); archive_path = g_file_get_path (archivefile); @@ -866,6 +913,13 @@ builder_source_archive_class_init (BuilderSourceArchiveClass *klass) "", FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_ARCHIVE_TYPE, + g_param_spec_string ("archive-type", + "", + "", + NULL, + G_PARAM_READWRITE)); } static void