diff --git a/builder/builder-source-patch.c b/builder/builder-source-patch.c
index 5a2041a4..6dfeb599 100644
--- a/builder/builder-source-patch.c
+++ b/builder/builder-source-patch.c
@@ -38,6 +38,7 @@ struct BuilderSourcePatch
char *path;
guint strip_components;
+ gboolean use_git;
};
typedef struct
@@ -51,6 +52,7 @@ enum {
PROP_0,
PROP_PATH,
PROP_STRIP_COMPONENTS,
+ PROP_USE_GIT,
LAST_PROP
};
@@ -82,6 +84,10 @@ builder_source_patch_get_property (GObject *object,
g_value_set_uint (value, self->strip_components);
break;
+ case PROP_USE_GIT:
+ g_value_set_boolean (value, self->use_git);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -106,6 +112,10 @@ builder_source_patch_set_property (GObject *object,
self->strip_components = g_value_get_uint (value);
break;
+ case PROP_USE_GIT:
+ self->use_git = g_value_get_boolean (value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -149,15 +159,40 @@ builder_source_patch_download (BuilderSource *source,
}
static gboolean
-patch (GFile *dir,
- GError **error,
+patch (GFile *dir,
+ gboolean use_git,
+ const char *patch_path,
+ GError **error,
...)
{
gboolean res;
+ GPtrArray *args;
+ const gchar *arg;
va_list ap;
- va_start (ap, error);
- res = flatpak_spawn (dir, NULL, error, "patch", ap);
+ va_start(ap, error);
+
+ args = g_ptr_array_new ();
+ if (use_git) {
+ g_ptr_array_add (args, "git");
+ g_ptr_array_add (args, "apply");
+ } else {
+ g_ptr_array_add (args, "patch");
+ }
+ while ((arg = va_arg (ap, const gchar *)))
+ g_ptr_array_add (args, (gchar *) arg);
+ if (use_git) {
+ g_ptr_array_add (args, (char *) patch_path);
+ } else {
+ g_ptr_array_add (args, "-i");
+ g_ptr_array_add (args, (char *) patch_path);
+ }
+ g_ptr_array_add (args, NULL);
+
+ res = flatpak_spawnv (dir, NULL, error, (const char **) args->pdata);
+
+ g_ptr_array_free (args, TRUE);
+
va_end (ap);
return res;
@@ -181,7 +216,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, error, strip_components, "-i", patch_path, NULL))
+ if (!patch (dest, self->use_git, patch_path, error, strip_components, NULL))
return FALSE;
return TRUE;
@@ -238,6 +273,13 @@ builder_source_patch_class_init (BuilderSourcePatchClass *klass)
0, G_MAXUINT,
1,
G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_USE_GIT,
+ g_param_spec_boolean ("use-git",
+ "",
+ "",
+ FALSE,
+ G_PARAM_READWRITE));
}
static void
diff --git a/doc/flatpak-builder.xml b/doc/flatpak-builder.xml
index c6aadb6f..19abf38e 100644
--- a/doc/flatpak-builder.xml
+++ b/doc/flatpak-builder.xml
@@ -536,6 +536,10 @@
(string)
Directory inside the source dir where the patch will be applied.
+
+ (boolean)
+ Whether to use "git apply" rather than "patch" to apply the patch, required when the patch file contains binary diffs.
+