From 30c53a967c96d50d4fcf3be8ddb2a7d3552f91bb Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 8 Dec 2011 17:05:16 -0500 Subject: [PATCH] core: Switch is_archive to an enumeration This is in preparation for adding a third mode. --- src/libostree/ostree-repo-file.c | 6 +- src/libostree/ostree-repo.c | 118 +++++++++++++++++++++++----- src/libostree/ostree-repo.h | 7 +- src/ostree/ot-builtin-fsck.c | 2 +- src/ostree/ot-builtin-init.c | 3 +- src/ostree/ot-builtin-local-clone.c | 2 +- 6 files changed, 110 insertions(+), 28 deletions(-) diff --git a/src/libostree/ostree-repo-file.c b/src/libostree/ostree-repo-file.c index b08601b1..137469be 100644 --- a/src/libostree/ostree-repo-file.c +++ b/src/libostree/ostree-repo-file.c @@ -314,7 +314,7 @@ _ostree_repo_file_get_xattrs (OstreeRepoFile *self, if (self->tree_metadata) ret_xattrs = g_variant_get_child_value (self->tree_metadata, 4); - else if (ostree_repo_is_archive (self->repo)) + else if (ostree_repo_get_mode (self->repo) == OSTREE_REPO_MODE_ARCHIVE) { local_file = _ostree_repo_file_nontree_get_local (self); if (!ostree_parse_packed_file (local_file, NULL, &ret_xattrs, NULL, cancellable, error)) @@ -1035,7 +1035,7 @@ _ostree_repo_file_tree_query_child (OstreeRepoFile *self, local_child = get_child_local_file (self->repo, checksum); - if (ostree_repo_is_archive (self->repo)) + if (ostree_repo_get_mode (self->repo) == OSTREE_REPO_MODE_ARCHIVE) { if (!ostree_parse_packed_file (local_child, &ret_info, NULL, NULL, cancellable, error)) goto out; @@ -1167,7 +1167,7 @@ ostree_repo_file_read (GFile *file, goto out; } - if (ostree_repo_is_archive (self->repo)) + if (ostree_repo_get_mode (self->repo) == OSTREE_REPO_MODE_ARCHIVE) { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index dc5ea309..745d7a43 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -62,7 +62,7 @@ struct _OstreeRepoPrivate { gboolean inited; GKeyFile *config; - gboolean archive; + OstreeRepoMode mode; }; static void @@ -479,13 +479,81 @@ ostree_repo_write_config (OstreeRepo *self, return ret; } +static gboolean +keyfile_get_boolean_with_default (GKeyFile *keyfile, + const char *section, + const char *value, + gboolean default_value, + gboolean *out_bool, + GError **error) +{ + gboolean ret = FALSE; + GError *temp_error = NULL; + gboolean ret_bool; + + ret_bool = g_key_file_get_boolean (keyfile, section, value, &temp_error); + if (temp_error) + { + if (g_error_matches (temp_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) + { + g_clear_error (&temp_error); + ret_bool = default_value; + } + else + { + g_propagate_error (error, temp_error); + goto out; + } + } + + ret = TRUE; + *out_bool = ret_bool; + out: + return ret; +} + +static gboolean +keyfile_get_value_with_default (GKeyFile *keyfile, + const char *section, + const char *value, + const char *default_value, + char **out_value, + GError **error) +{ + gboolean ret = FALSE; + GError *temp_error = NULL; + char *ret_value; + + ret_value = g_key_file_get_value (keyfile, section, value, &temp_error); + if (temp_error) + { + if (g_error_matches (temp_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) + { + g_clear_error (&temp_error); + ret_value = g_strdup (default_value); + } + else + { + g_propagate_error (error, temp_error); + goto out; + } + } + + ret = TRUE; + ot_transfer_out_value(out_value, ret_value); + out: + g_free (ret_value); + return ret; +} + gboolean ostree_repo_check (OstreeRepo *self, GError **error) { OstreeRepoPrivate *priv = GET_PRIVATE (self); gboolean ret = FALSE; char *version = NULL;; - GError *temp_error = NULL; + char *mode = NULL;; + gboolean is_archive; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); @@ -506,12 +574,9 @@ ostree_repo_check (OstreeRepo *self, GError **error) goto out; } - version = g_key_file_get_value (priv->config, "core", "repo_version", &temp_error); - if (temp_error) - { - g_propagate_error (error, temp_error); - goto out; - } + version = g_key_file_get_value (priv->config, "core", "repo_version", error); + if (!version) + goto out; if (strcmp (version, "0") != 0) { @@ -520,16 +585,26 @@ ostree_repo_check (OstreeRepo *self, GError **error) goto out; } - priv->archive = g_key_file_get_boolean (priv->config, "core", "archive", &temp_error); - if (temp_error) + if (!keyfile_get_boolean_with_default (priv->config, "core", "archive", + FALSE, &is_archive, error)) + goto out; + + if (is_archive) + priv->mode = OSTREE_REPO_MODE_ARCHIVE; + else { - if (g_error_matches (temp_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND)) - { - g_clear_error (&temp_error); - } + if (!keyfile_get_value_with_default (priv->config, "core", "mode", + "bare", &mode, error)) + goto out; + + if (strcmp (mode, "bare") == 0) + priv->mode = OSTREE_REPO_MODE_BARE; + else if (strcmp (mode, "archive") == 0) + priv->mode = OSTREE_REPO_MODE_ARCHIVE; else { - g_propagate_error (error, temp_error); + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Invalid mode '%s' in repository configuration", mode); goto out; } } @@ -538,6 +613,7 @@ ostree_repo_check (OstreeRepo *self, GError **error) ret = TRUE; out: + g_free (mode); g_free (version); return ret; } @@ -556,14 +632,14 @@ ostree_repo_get_tmpdir (OstreeRepo *self) return priv->tmp_dir; } -gboolean -ostree_repo_is_archive (OstreeRepo *self) +OstreeRepoMode +ostree_repo_get_mode (OstreeRepo *self) { OstreeRepoPrivate *priv = GET_PRIVATE (self); g_return_val_if_fail (priv->inited, FALSE); - return priv->archive; + return priv->mode; } static gboolean @@ -587,7 +663,7 @@ ostree_repo_stage_object (OstreeRepo *self, if (g_cancellable_set_error_if_cancelled (cancellable, error)) return FALSE; - if (objtype == OSTREE_OBJECT_TYPE_FILE && priv->archive) + if (objtype == OSTREE_OBJECT_TYPE_FILE && priv->mode == OSTREE_REPO_MODE_ARCHIVE) { if (!ostree_create_temp_regular_file (priv->tmp_dir, "archive-tmp-", NULL, @@ -868,7 +944,7 @@ ostree_repo_get_object_path (OstreeRepo *self, char *relpath; GFile *ret; - relpath = ostree_get_relative_object_path (checksum, type, priv->archive); + relpath = ostree_get_relative_object_path (checksum, type, priv->mode == OSTREE_REPO_MODE_ARCHIVE); path = g_build_filename (priv->path, relpath, NULL); g_free (relpath); ret = ot_gfile_new_for_path (path); @@ -2063,7 +2139,7 @@ checkout_tree (OstreeRepo *self, object_path = ostree_repo_get_object_path (self, checksum, OSTREE_OBJECT_TYPE_FILE); - if (priv->archive) + if (priv->mode == OSTREE_REPO_MODE_ARCHIVE) { if (!ostree_parse_packed_file (object_path, NULL, &xattrs, &packed_input, cancellable, error)) diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h index 4a29b68a..4a2d1400 100644 --- a/src/libostree/ostree-repo.h +++ b/src/libostree/ostree-repo.h @@ -55,7 +55,12 @@ gboolean ostree_repo_check (OstreeRepo *self, GError **error); const char * ostree_repo_get_path (OstreeRepo *self); -gboolean ostree_repo_is_archive (OstreeRepo *self); +typedef enum { + OSTREE_REPO_MODE_BARE, + OSTREE_REPO_MODE_ARCHIVE +} OstreeRepoMode; + +OstreeRepoMode ostree_repo_get_mode (OstreeRepo *self); GFile * ostree_repo_get_tmpdir (OstreeRepo *self); diff --git a/src/ostree/ot-builtin-fsck.c b/src/ostree/ot-builtin-fsck.c index f1936448..8f65db61 100644 --- a/src/ostree/ot-builtin-fsck.c +++ b/src/ostree/ot-builtin-fsck.c @@ -126,7 +126,7 @@ object_iter_callback (OstreeRepo *repo, if (nlinks < 2 && !quiet) g_printerr ("note: floating object: %s\n", path); */ - if (ostree_repo_is_archive (repo) + if (ostree_repo_get_mode (repo) == OSTREE_REPO_MODE_ARCHIVE && objtype == OSTREE_OBJECT_TYPE_FILE) { if (!g_str_has_suffix (path, ".packfile")) diff --git a/src/ostree/ot-builtin-init.c b/src/ostree/ot-builtin-init.c index 4749437d..7c9fd95a 100644 --- a/src/ostree/ot-builtin-init.c +++ b/src/ostree/ot-builtin-init.c @@ -59,7 +59,8 @@ ostree_builtin_init (int argc, char **argv, const char *repo_path, GError **erro child = g_file_get_child (repodir, "config"); config_data = g_string_new (DEFAULT_CONFIG_CONTENTS); - g_string_append_printf (config_data, "archive=%s\n", archive ? "true" : "false"); + if (archive) + g_string_append_printf (config_data, "mode=%s\n", archive ? "archive" : "bare"); if (!g_file_replace_contents (child, config_data->str, config_data->len, diff --git a/src/ostree/ot-builtin-local-clone.c b/src/ostree/ot-builtin-local-clone.c index 618e2891..5df7b219 100644 --- a/src/ostree/ot-builtin-local-clone.c +++ b/src/ostree/ot-builtin-local-clone.c @@ -97,7 +97,7 @@ object_iter_callback (OstreeRepo *repo, GError *error = NULL; gboolean did_exist; - if (ostree_repo_is_archive (data->src_repo)) + if (ostree_repo_get_mode (data->src_repo) == OSTREE_REPO_MODE_ARCHIVE) { if (!ostree_repo_store_packfile (data->dest_repo, checksum, ot_gfile_get_path_cached (objfile),