core: Error out on an empty compose

This commit is contained in:
Colin Walters 2012-01-11 13:42:37 -05:00
parent 0044ff133a
commit e693d2cfe5
1 changed files with 33 additions and 45 deletions

View File

@ -31,42 +31,58 @@ static char *subject;
static char *body;
static char *branch;
static char *from_file_path;
static gboolean recompose;
static GOptionEntry options[] = {
{ "subject", 's', 0, G_OPTION_ARG_STRING, &subject, "One line subject", "subject" },
{ "body", 'm', 0, G_OPTION_ARG_STRING, &body, "Full description", "body" },
{ "branch", 'b', 0, G_OPTION_ARG_STRING, &branch, "Branch", "branch" },
{ "from-file", 'F', 0, G_OPTION_ARG_STRING, &from_file_path, "Take list of branches to compose from FILE", "FILE" },
{ "recompose", 0, 0, G_OPTION_ARG_NONE, &recompose, "Regenerate compose from existing branches", NULL },
{ NULL }
};
static gboolean
add_branch (OstreeRepo *repo,
OstreeMutableTree *mtree,
const char *branch,
const char *branch_path,
GVariantBuilder *metadata_builder,
GError **error)
{
gboolean ret = FALSE;
GFile *branchf = NULL;
GFile *subdir = NULL;
const char *branch_rev;
char **components = NULL;
const char *branch_name;
const char *path;
if (!ostree_repo_read_commit (repo, branch, &branchf, NULL, error))
components = g_strsplit (branch_path, ":", 2);
if (g_strv_length (components) != 2)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Invalid compose specification '%s'; missing ':'",
branch_path);
goto out;
}
branch_name = components[0];
path = components[1];
if (!ostree_repo_read_commit (repo, branch_name, &branchf, NULL, error))
goto out;
branch_rev = ostree_repo_file_get_commit ((OstreeRepoFile*)branchf);
subdir = g_file_resolve_relative_path (branchf, path);
if (!ostree_repo_stage_directory_to_mtree (repo, branchf, mtree, NULL,
if (!ostree_repo_stage_directory_to_mtree (repo, subdir, mtree, NULL,
NULL, error))
goto out;
if (metadata_builder)
g_variant_builder_add (metadata_builder, "(ss)", branch, branch_rev);
g_variant_builder_add (metadata_builder, "(ss)", branch_path, branch_rev);
ret = TRUE;
out:
g_strfreev (components);
g_clear_object (&branchf);
return ret;
}
@ -129,7 +145,7 @@ ostree_builtin_compose (int argc, char **argv, GFile *repo_path, GError **error)
compose_metadata_builder_initialized = TRUE;
g_variant_builder_init (&compose_metadata_builder, G_VARIANT_TYPE ("a(ss)"));
if (!ostree_repo_resolve_rev (repo, branch, recompose ? FALSE : TRUE, &parent, error))
if (!ostree_repo_resolve_rev (repo, branch, TRUE, &parent, error))
goto out;
if (parent)
@ -146,43 +162,6 @@ ostree_builtin_compose (int argc, char **argv, GFile *repo_path, GError **error)
mtree = ostree_mutable_tree_new ();
if (recompose)
{
const char *branch_name;
const char *branch_rev;
g_assert (parent);
g_assert (parent_commit);
seen_branches = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
g_variant_get_child (parent_commit, 1, "@a{sv}", &parent_commit_metadata);
parent_commit_compose = g_variant_lookup_value (parent_commit_metadata,
"ostree-compose", G_VARIANT_TYPE ("a(ss)"));
if (!parent_commit_compose)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Commit '%s' doesn't have ostree-compose metadata",
parent);
goto out;
}
parent_commit_compose_iter = g_variant_iter_new (parent_commit_compose);
while (g_variant_iter_loop (parent_commit_compose_iter, "(&s&s)",
&branch_name, &branch_rev))
{
if (!add_branch (repo, mtree, branch_name,
&compose_metadata_builder,
error))
goto out;
g_hash_table_insert (seen_branches, g_strdup (branch_name), (char*)branch_name);
}
}
if (from_file_path)
{
char **iter;
@ -248,9 +227,18 @@ ostree_builtin_compose (int argc, char **argv, GFile *repo_path, GError **error)
if (!skip_commit)
{
const char *root_metadata = ostree_mutable_tree_get_metadata_checksum (mtree);
if (!root_metadata)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Can't commit an empty tree");
goto out;
}
if (!ostree_repo_stage_commit (repo, branch, parent, subject, body, commit_metadata,
contents_checksum,
ostree_mutable_tree_get_metadata_checksum (mtree),
root_metadata,
&commit_checksum, cancellable, error))
goto out;