diff --git a/builder/builder-manifest.c b/builder/builder-manifest.c
index d277e359..4b7595de 100644
--- a/builder/builder-manifest.c
+++ b/builder/builder-manifest.c
@@ -48,6 +48,10 @@ struct BuilderManifest
char *sdk;
char *sdk_commit;
char *var;
+ char *base;
+ char *base_commit;
+ char *base_version;
+ char **base_extensions;
char *metadata;
char *metadata_platform;
gboolean separate_locales;
@@ -94,6 +98,10 @@ enum {
PROP_RUNTIME_COMMIT,
PROP_SDK,
PROP_SDK_COMMIT,
+ PROP_BASE,
+ PROP_BASE_VERSION,
+ PROP_BASE_COMMIT,
+ PROP_BASE_EXTENSIONS,
PROP_VAR,
PROP_METADATA,
PROP_METADATA_PLATFORM,
@@ -132,6 +140,9 @@ builder_manifest_finalize (GObject *object)
g_free (self->runtime_version);
g_free (self->sdk);
g_free (self->sdk_commit);
+ g_free (self->base);
+ g_free (self->base_commit);
+ g_free (self->base_version);
g_free (self->var);
g_free (self->metadata);
g_free (self->metadata_platform);
@@ -243,6 +254,22 @@ builder_manifest_get_property (GObject *object,
g_value_set_string (value, self->sdk_commit);
break;
+ case PROP_BASE:
+ g_value_set_string (value, self->base);
+ break;
+
+ case PROP_BASE_COMMIT:
+ g_value_set_string (value, self->base_commit);
+ break;
+
+ case PROP_BASE_VERSION:
+ g_value_set_string (value, self->base_version);
+ break;
+
+ case PROP_BASE_EXTENSIONS:
+ g_value_set_boxed (value, self->base_extensions);
+ break;
+
case PROP_VAR:
g_value_set_string (value, self->var);
break;
@@ -396,6 +423,27 @@ builder_manifest_set_property (GObject *object,
self->sdk_commit = g_value_dup_string (value);
break;
+ case PROP_BASE:
+ g_free (self->base);
+ self->base = g_value_dup_string (value);
+ break;
+
+ case PROP_BASE_COMMIT:
+ g_free (self->base_commit);
+ self->base_commit = g_value_dup_string (value);
+ break;
+
+ case PROP_BASE_VERSION:
+ g_free (self->base_version);
+ self->base_version = g_value_dup_string (value);
+ break;
+
+ case PROP_BASE_EXTENSIONS:
+ tmp = self->base_extensions;
+ self->base_extensions = g_strdupv (g_value_get_boxed (value));
+ g_strfreev (tmp);
+ break;
+
case PROP_VAR:
g_free (self->var);
self->var = g_value_dup_string (value);
@@ -590,6 +638,34 @@ builder_manifest_class_init (BuilderManifestClass *klass)
"",
NULL,
G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_BASE,
+ g_param_spec_string ("base",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_BASE_COMMIT,
+ g_param_spec_string ("base-commit",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_BASE_VERSION,
+ g_param_spec_string ("base-version",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_BASE_EXTENSIONS,
+ g_param_spec_boxed ("base-extensions",
+ "",
+ "",
+ G_TYPE_STRV,
+ G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_VAR,
g_param_spec_string ("var",
@@ -910,6 +986,12 @@ builder_manifest_get_branch (BuilderManifest *self)
return self->branch ? self->branch : "master";
}
+static const char *
+builder_manifest_get_base_version (BuilderManifest *self)
+{
+ return self->base_version ? self->base_version : builder_manifest_get_branch (self);
+}
+
static char *
flatpak (GError **error,
...)
@@ -963,6 +1045,15 @@ builder_manifest_start (BuilderManifest *self,
self->runtime,
builder_manifest_get_runtime_version (self));
+ if (self->base != NULL && *self->base != 0)
+ {
+ self->base_commit = flatpak (NULL, "info", arch_option, "--show-commit", self->base,
+ builder_manifest_get_base_version (self), NULL);
+ if (self->base_commit == NULL)
+ return flatpak_fail (error, "Unable to find app %s version %s",
+ self->base, builder_manifest_get_base_version (self));
+ }
+
if (!expand_modules (self->modules, &self->expanded_modules, names, error))
return FALSE;
@@ -1029,6 +1120,19 @@ builder_manifest_init_app_dir (BuilderManifest *self,
}
if (self->var)
g_ptr_array_add (args, g_strdup_printf ("--var=%s", self->var));
+
+ if (self->base)
+ {
+ g_ptr_array_add (args, g_strdup_printf ("--base=%s", self->base));
+ g_ptr_array_add (args, g_strdup_printf ("--base-version=%s", builder_manifest_get_base_version (self)));
+
+ for (i = 0; self->base_extensions != NULL && self->base_extensions[i] != NULL; i++)
+ {
+ const char *ext = self->base_extensions[i];
+ g_ptr_array_add (args, g_strdup_printf ("--base-extension=%s", ext));
+ }
+ }
+
g_ptr_array_add (args, g_strdup_printf ("--arch=%s", builder_context_get_arch (context)));
g_ptr_array_add (args, g_file_get_path (app_dir));
g_ptr_array_add (args, g_strdup (self->id));
@@ -1082,6 +1186,10 @@ builder_manifest_checksum (BuilderManifest *self,
builder_cache_checksum_strv (cache, self->sdk_extensions);
builder_cache_checksum_boolean (cache, self->build_runtime);
builder_cache_checksum_boolean (cache, self->separate_locales);
+ builder_cache_checksum_str (cache, self->base);
+ builder_cache_checksum_str (cache, self->base_version);
+ builder_cache_checksum_str (cache, self->base_commit);
+ builder_cache_checksum_strv (cache, self->base_extensions);
if (self->build_options)
builder_options_checksum (self->build_options, cache, context);
diff --git a/doc/flatpak-builder.xml b/doc/flatpak-builder.xml
index 7a5b88ad..ebdfbc7c 100644
--- a/doc/flatpak-builder.xml
+++ b/doc/flatpak-builder.xml
@@ -180,6 +180,23 @@
(array of strings)
Install these extra sdk extensions when creating the platform.
+
+
+ (string)
+ Start with the files from the specified application. This can be
+ used to create applications that extend another application.
+
+
+ (string)
+ Use this specific version of the application specified in base.
+ If unspecified, this uses the value specified in branch
+
+
+ (array of strings)
+ Install these extra extensions from the base application when initializing
+ the application directory.
+
+
(array of strings)
Add these tags to the metadata file.