diff --git a/builder/builder-source-patch.c b/builder/builder-source-patch.c index d021ee1c..e18ad6c2 100644 --- a/builder/builder-source-patch.c +++ b/builder/builder-source-patch.c @@ -39,6 +39,7 @@ struct BuilderSourcePatch char *path; guint strip_components; gboolean use_git; + char **options; }; typedef struct @@ -53,6 +54,7 @@ enum { PROP_PATH, PROP_STRIP_COMPONENTS, PROP_USE_GIT, + PROP_OPTIONS, LAST_PROP }; @@ -62,6 +64,7 @@ builder_source_patch_finalize (GObject *object) BuilderSourcePatch *self = (BuilderSourcePatch *) object; g_free (self->path); + g_strfreev (self->options); G_OBJECT_CLASS (builder_source_patch_parent_class)->finalize (object); } @@ -88,6 +91,10 @@ builder_source_patch_get_property (GObject *object, g_value_set_boolean (value, self->use_git); break; + case PROP_OPTIONS: + g_value_set_boxed (value, self->options); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -100,6 +107,7 @@ builder_source_patch_set_property (GObject *object, GParamSpec *pspec) { BuilderSourcePatch *self = BUILDER_SOURCE_PATCH (object); + gchar **tmp; switch (prop_id) { @@ -116,6 +124,12 @@ builder_source_patch_set_property (GObject *object, self->use_git = g_value_get_boolean (value); break; + case PROP_OPTIONS: + tmp = self->options; + self->options = g_strdupv (g_value_get_boxed (value)); + g_strfreev (tmp); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -174,6 +188,7 @@ static gboolean patch (GFile *dir, gboolean use_git, const char *patch_path, + char **extra_options, GError **error, ...) { @@ -181,6 +196,7 @@ patch (GFile *dir, GPtrArray *args; const gchar *arg; va_list ap; + int i; va_start(ap, error); @@ -191,6 +207,8 @@ patch (GFile *dir, } else { g_ptr_array_add (args, "patch"); } + for (i = 0; extra_options != NULL && extra_options[i] != NULL; i++) + g_ptr_array_add (args, (gchar *) extra_options[i]); while ((arg = va_arg (ap, const gchar *))) g_ptr_array_add (args, (gchar *) arg); if (use_git) { @@ -229,7 +247,7 @@ builder_source_patch_extract (BuilderSource *source, strip_components = g_strdup_printf ("-p%u", self->strip_components); patch_path = g_file_get_path (patchfile); - if (!patch (dest, self->use_git, patch_path, error, strip_components, NULL)) + if (!patch (dest, self->use_git, patch_path, self->options, error, strip_components, NULL)) return FALSE; return TRUE; @@ -255,6 +273,7 @@ builder_source_patch_checksum (BuilderSource *source, builder_cache_checksum_str (cache, self->path); builder_cache_checksum_uint32 (cache, self->strip_components); + builder_cache_checksum_strv (cache, self->options); } static void @@ -294,6 +313,13 @@ builder_source_patch_class_init (BuilderSourcePatchClass *klass) "", FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_OPTIONS, + g_param_spec_boxed ("options", + "", + "", + G_TYPE_STRV, + G_PARAM_READWRITE)); } static void diff --git a/doc/flatpak-builder.xml b/doc/flatpak-builder.xml index 2d8022f6..febf1674 100644 --- a/doc/flatpak-builder.xml +++ b/doc/flatpak-builder.xml @@ -566,6 +566,10 @@ (boolean) Whether to use "git apply" rather than "patch" to apply the patch, required when the patch file contains binary diffs. + + (array of strings) + Extra options to pass to the patch command. +