Builder: Add a resolved version of the manifest to the built app

tingping/wmclass
Alexander Larsson 2015-12-09 14:26:41 +01:00
parent dfc11d5e87
commit b716e0d8eb
8 changed files with 169 additions and 0 deletions

View File

@ -690,6 +690,8 @@ builder_manifest_build (BuilderManifest *self,
return FALSE;
builder_module_set_changes (m, changes);
builder_module_update (m, context, error);
}
return TRUE;
@ -1095,10 +1097,14 @@ builder_manifest_finish (BuilderManifest *self,
GError **error)
{
GFile *app_dir = builder_context_get_app_dir (context);
g_autoptr(GFile) manifest_file = NULL;
g_autofree char *app_dir_path = g_file_get_path (app_dir);
g_autofree char *json = NULL;
g_autoptr(GPtrArray) args = NULL;
g_autoptr(GSubprocess) subp = NULL;
int i;
JsonNode *node;
JsonGenerator *generator;
builder_manifest_checksum_for_finish (self, cache, context);
if (!builder_cache_lookup (cache))
@ -1129,6 +1135,19 @@ builder_manifest_finish (BuilderManifest *self,
!g_subprocess_wait_check (subp, NULL, error))
return FALSE;
node = json_gobject_serialize (G_OBJECT (self));
generator = json_generator_new ();
json_generator_set_pretty (generator, TRUE);
json_generator_set_root (generator, node);
json = json_generator_to_data (generator, NULL);
g_object_unref (generator);
json_node_free (node);
manifest_file = g_file_resolve_relative_path (app_dir, "files/manifest.json");
if (!g_file_replace_contents (manifest_file, json, strlen (json), NULL, FALSE,
0, NULL, NULL, error))
return FALSE;
if (!builder_cache_commit (cache, "Finish", error))
return FALSE;
}

View File

@ -827,6 +827,24 @@ builder_module_build (BuilderModule *self,
return TRUE;
}
gboolean
builder_module_update (BuilderModule *self,
BuilderContext *context,
GError **error)
{
GList *l;
for (l = self->sources; l != NULL; l = l->next)
{
BuilderSource *source = l->data;
if (!builder_source_update (source, context, error))
return FALSE;
}
return TRUE;
}
void
builder_module_checksum (BuilderModule *self,
BuilderCache *cache,

View File

@ -55,6 +55,9 @@ gboolean builder_module_extract_sources (BuilderModule *self,
gboolean builder_module_build (BuilderModule *self,
BuilderContext *context,
GError **error);
gboolean builder_module_update (BuilderModule *self,
BuilderContext *context,
GError **error);
void builder_module_checksum (BuilderModule *self,
BuilderCache *cache,

View File

@ -252,6 +252,24 @@ builder_source_bzr_checksum (BuilderSource *source,
g_warning ("Failed to get current bzr checksum: %s", error->message);
}
static gboolean
builder_source_bzr_update (BuilderSource *source,
BuilderContext *context,
GError **error)
{
BuilderSourceBzr *self = BUILDER_SOURCE_BZR (source);
char *current_commit;
current_commit = get_current_commit (self, context, NULL);
if (current_commit)
{
g_free (self->revision);
self->revision = current_commit;
}
return TRUE;
}
static void
builder_source_bzr_class_init (BuilderSourceBzrClass *klass)
{
@ -264,6 +282,7 @@ builder_source_bzr_class_init (BuilderSourceBzrClass *klass)
source_class->download = builder_source_bzr_download;
source_class->extract = builder_source_bzr_extract;
source_class->update = builder_source_bzr_update;
source_class->checksum = builder_source_bzr_checksum;
g_object_class_install_property (object_class,

View File

@ -381,6 +381,25 @@ builder_source_file_extract (BuilderSource *source,
}
else
{
if (is_local)
{
g_autofree char *data = NULL;
g_autofree char *base64 = NULL;
gsize len;
if (!g_file_load_contents (src, NULL, &data, &len, NULL, error))
return FALSE;
base64 = g_base64_encode ((const guchar *)data, len);
g_free (self->url);
self->url = g_strdup_printf ("data:text/plain;charset=utf8;base64,%s", base64);
if (self->dest_filename == NULL || *self->dest_filename == 0)
{
g_free (self->dest_filename);
self->dest_filename = g_file_get_basename (src);
}
}
if (!g_file_copy (src, dest_file,
G_FILE_COPY_OVERWRITE,
NULL,
@ -392,6 +411,43 @@ builder_source_file_extract (BuilderSource *source,
return TRUE;
}
static gboolean
builder_source_file_update (BuilderSource *source,
BuilderContext *context,
GError **error)
{
BuilderSourceFile *self = BUILDER_SOURCE_FILE (source);
g_autoptr(GFile) src = NULL;
g_autoptr(GFile) dest_file = NULL;
g_autofree char *dest_filename = NULL;
gboolean is_local, is_inline;
src = get_source_file (self, context, &is_local, &is_inline, error);
if (src == NULL)
return FALSE;
if (is_local)
{
g_autofree char *data = NULL;
g_autofree char *base64 = NULL;
gsize len;
if (!g_file_load_contents (src, NULL, &data, &len, NULL, error))
return FALSE;
base64 = g_base64_encode ((const guchar *)data, len);
g_free (self->url);
self->url = g_strdup_printf ("data:text/plain;charset=utf8;base64,%s", base64);
if (self->dest_filename == NULL || *self->dest_filename == 0)
{
g_free (self->dest_filename);
self->dest_filename = g_file_get_basename (src);
}
}
return TRUE;
}
static void
builder_source_file_checksum (BuilderSource *source,
BuilderCache *cache,
@ -429,6 +485,7 @@ builder_source_file_class_init (BuilderSourceFileClass *klass)
source_class->download = builder_source_file_download;
source_class->extract = builder_source_file_extract;
source_class->update = builder_source_file_update;
source_class->checksum = builder_source_file_checksum;
g_object_class_install_property (object_class,

View File

@ -518,6 +518,33 @@ builder_source_git_checksum (BuilderSource *source,
g_warning ("No url");
}
static gboolean
builder_source_git_update (BuilderSource *source,
BuilderContext *context,
GError **error)
{
BuilderSourceGit *self = BUILDER_SOURCE_GIT (source);
g_autoptr(GFile) mirror_dir = NULL;
char *current_commit;
g_autofree char *url = NULL;
url = get_url (self, context, error);
if (url == NULL)
return FALSE;
mirror_dir = git_get_mirror_dir (url, context);
current_commit = git_get_current_commit (mirror_dir, get_branch (self), context, NULL);
g_print ("current commit %s\n", current_commit);
if (current_commit)
{
g_free (self->branch);
self->branch = current_commit;
}
return TRUE;
}
static void
builder_source_git_class_init (BuilderSourceGitClass *klass)
{
@ -530,6 +557,7 @@ builder_source_git_class_init (BuilderSourceGitClass *klass)
source_class->download = builder_source_git_download;
source_class->extract = builder_source_git_extract;
source_class->update = builder_source_git_update;
source_class->checksum = builder_source_git_checksum;
g_object_class_install_property (object_class,

View File

@ -118,6 +118,14 @@ builder_source_real_extract (BuilderSource *self,
return FALSE;
}
static gboolean
builder_source_real_update (BuilderSource *self,
BuilderContext *context,
GError **error)
{
return TRUE;
}
static void
builder_source_class_init (BuilderSourceClass *klass)
{
@ -129,6 +137,7 @@ builder_source_class_init (BuilderSourceClass *klass)
klass->download = builder_source_real_download;
klass->extract = builder_source_real_extract;
klass->update = builder_source_real_update;
g_object_class_install_property (object_class,
PROP_DEST,
@ -246,6 +255,16 @@ builder_source_extract (BuilderSource *self,
return class->extract (self, real_dest, context, error);
}
gboolean
builder_source_update (BuilderSource *self,
BuilderContext *context,
GError **error)
{
BuilderSourceClass *class = BUILDER_SOURCE_GET_CLASS (self);
return class->update (self, context, error);
}
void
builder_source_checksum (BuilderSource *self,
BuilderCache *cache,

View File

@ -53,6 +53,9 @@ typedef struct {
GFile *dest,
BuilderContext *context,
GError **error);
gboolean (* update) (BuilderSource *self,
BuilderContext *context,
GError **error);
void (* checksum) (BuilderSource *self,
BuilderCache *cache,
BuilderContext *context);
@ -70,6 +73,9 @@ gboolean builder_source_extract (BuilderSource *self,
GFile *dest,
BuilderContext *context,
GError **error);
gboolean builder_source_update (BuilderSource *self,
BuilderContext *context,
GError **error);
void builder_source_checksum (BuilderSource *self,
BuilderCache *cache,