From 2b609c6624e56547425de4f7bd61adcca560d697 Mon Sep 17 00:00:00 2001 From: Christophe Fergeau Date: Fri, 15 Jul 2016 10:41:37 +0200 Subject: [PATCH] Add RPM archive support --- builder/builder-source-archive.c | 37 ++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/builder/builder-source-archive.c b/builder/builder-source-archive.c index 0aecc318c..5c49b8119 100644 --- a/builder/builder-source-archive.c +++ b/builder/builder-source-archive.c @@ -60,6 +60,7 @@ enum { typedef enum { UNKNOWN, + RPM, TAR, TAR_GZIP, TAR_COMPRESS, @@ -409,6 +410,22 @@ unzip (GFile *dir, return res; } +static gboolean +unrpm (GFile *dir, + const char *rpm_path, + GError **error) +{ + gboolean res; + const gchar *argv[] = { "sh", "-c", NULL, NULL }; + char *unrpm_cmdline = g_strdup_printf("rpm2cpio %s | cpio -i -d", rpm_path); + + argv[2] = unrpm_cmdline; + res = flatpak_spawnv (dir, NULL, error, argv); + g_free(unrpm_cmdline); + + return res; +} + BuilderArchiveType get_type (GFile *archivefile) { @@ -452,6 +469,9 @@ get_type (GFile *archivefile) if (g_str_has_suffix (lower, ".zip")) return ZIP; + if (g_str_has_suffix (lower, ".rpm")) + return RPM; + return UNKNOWN; } @@ -579,6 +599,23 @@ builder_source_archive_extract (BuilderSource *source, return FALSE; } } + else if (type == RPM) + { + g_autoptr(GFile) rpm_dest = NULL; + + rpm_dest = create_uncompress_directory (self, dest, error); + if (rpm_dest == NULL) + return FALSE; + + if (!unrpm (rpm_dest, archive_path, error)) + return FALSE; + + if (self->strip_components > 0) + { + if (!strip_components_into (dest, rpm_dest, self->strip_components, error)) + return FALSE; + } + } else { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Unknown archive format of '%s'", archive_path);