[ostree] repo: Move the 'init' builtin command to a public API, ostree_repo_create
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] repo: Move the 'init' builtin command to a public API, ostree_repo_create
- Date: Thu, 5 Sep 2013 18:13:41 +0000 (UTC)
commit 57d285f6194c6d9bbaa45b5f253a1d698ef4ea2e
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Thu Sep 5 00:14:30 2013 -0400
repo: Move the 'init' builtin command to a public API, ostree_repo_create
This continues the goal of making more of ostree accessible by API,
rather than forking out to subprocesses.
https://bugzilla.gnome.org/show_bug.cgi?id=707582
src/libostree/ostree-repo.c | 109 ++++++++++++++++++++++++++++++++++++++++++
src/libostree/ostree-repo.h | 31 +++++++-----
src/ostree/ot-builtin-init.c | 75 ++---------------------------
3 files changed, 131 insertions(+), 84 deletions(-)
---
diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c
index c314dfa..3ee48c8 100644
--- a/src/libostree/ostree-repo.c
+++ b/src/libostree/ostree-repo.c
@@ -52,6 +52,12 @@
* content files zlib-compressed. It is suitable for non-root-owned
* repositories that can be served via a static HTTP server.
*
+ * Creating an #OstreeRepo does not invoke any file I/O, and thus needs
+ * to be initialized, either from an existing contents or with a new
+ * repository. If you have an existing repo, use ostree_repo_check()
+ * to load it from disk and check its validity. To initialize a new
+ * repository in the given filepath, use ostree_repo_create() instead.
+ *
* To store content in the repo, first start a transaction with
* ostree_repo_prepare_transaction(). Then create a
* #OstreeMutableTree, and apply functions such as
@@ -311,6 +317,34 @@ ostree_repo_write_config (OstreeRepo *self,
return ret;
}
+static gboolean
+ostree_repo_mode_to_string (OstreeRepoMode mode,
+ const char **out_mode,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ const char *ret_mode;
+
+ switch (mode)
+ {
+ case OSTREE_REPO_MODE_BARE:
+ ret_mode = "bare";
+ break;
+ case OSTREE_REPO_MODE_ARCHIVE_Z2:
+ ret_mode ="archive-z2";
+ break;
+ default:
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Invalid mode '%d'", mode);
+ goto out;
+ }
+
+ ret = TRUE;
+ *out_mode = ret_mode;
+ out:
+ return ret;
+}
+
gboolean
ostree_repo_mode_from_string (const char *mode,
OstreeRepoMode *out_mode,
@@ -336,6 +370,81 @@ ostree_repo_mode_from_string (const char *mode,
return ret;
}
+#define DEFAULT_CONFIG_CONTENTS ("[core]\n" \
+ "repo_version=1\n")
+
+/**
+ * ostree_repo_create:
+ * @self: An #OstreeRepo
+ * @mode: The mode to store the repository in
+ * @cancellable: Cancellable
+ * @error: Error
+ *
+ * Create the underlying structure on disk for the
+ * repository.
+ */
+gboolean
+ostree_repo_create (OstreeRepo *self,
+ OstreeRepoMode mode,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ GString *config_data = NULL;
+ gs_unref_object GFile *child = NULL;
+ gs_unref_object GFile *grandchild = NULL;
+ const char *mode_str;
+
+ if (!ostree_repo_mode_to_string (mode, &mode_str, error))
+ goto out;
+
+ if (!gs_file_ensure_directory (self->repodir, FALSE, cancellable, error))
+ goto out;
+
+ config_data = g_string_new (DEFAULT_CONFIG_CONTENTS);
+ g_string_append_printf (config_data, "mode=%s\n", mode_str);
+ if (!g_file_replace_contents (self->config_file,
+ config_data->str,
+ config_data->len,
+ NULL, FALSE, 0, NULL,
+ cancellable, error))
+ goto out;
+
+ if (!g_file_make_directory (self->objects_dir, cancellable, error))
+ goto out;
+
+ if (!g_file_make_directory (self->tmp_dir, cancellable, error))
+ goto out;
+
+ if (!g_file_make_directory (self->remote_cache_dir, cancellable, error))
+ goto out;
+
+ g_clear_object (&child);
+ child = g_file_get_child (self->repodir, "refs");
+ if (!g_file_make_directory (child, cancellable, error))
+ goto out;
+
+ g_clear_object (&grandchild);
+ grandchild = g_file_get_child (child, "heads");
+ if (!g_file_make_directory (grandchild, cancellable, error))
+ goto out;
+
+ g_clear_object (&grandchild);
+ grandchild = g_file_get_child (child, "remotes");
+ if (!g_file_make_directory (grandchild, cancellable, error))
+ goto out;
+
+ if (!ostree_repo_check (self, error))
+ goto out;
+
+ ret = TRUE;
+
+ out:
+ if (config_data)
+ g_string_free (config_data, TRUE);
+ return ret;
+}
+
gboolean
ostree_repo_check (OstreeRepo *self, GError **error)
{
diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h
index 2465f51..1aea784 100644
--- a/src/libostree/ostree-repo.h
+++ b/src/libostree/ostree-repo.h
@@ -33,16 +33,6 @@ G_BEGIN_DECLS
#define OSTREE_IS_REPO(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), OSTREE_TYPE_REPO))
-GType ostree_repo_get_type (void);
-
-OstreeRepo* ostree_repo_new (GFile *path);
-
-OstreeRepo* ostree_repo_new_default (void);
-
-gboolean ostree_repo_check (OstreeRepo *self, GError **error);
-
-GFile * ostree_repo_get_path (OstreeRepo *self);
-
/**
* OstreeRepoMode:
* @OSTREE_REPO_MODE_BARE: Files are stored as themselves; can only be written as root
@@ -56,9 +46,24 @@ typedef enum {
OSTREE_REPO_MODE_ARCHIVE_Z2
} OstreeRepoMode;
-gboolean ostree_repo_mode_from_string (const char *mode,
- OstreeRepoMode *out_mode,
- GError **error);
+gboolean ostree_repo_mode_from_string (const char *mode,
+ OstreeRepoMode *out_mode,
+ GError **error);
+
+GType ostree_repo_get_type (void);
+
+OstreeRepo* ostree_repo_new (GFile *path);
+
+OstreeRepo* ostree_repo_new_default (void);
+
+gboolean ostree_repo_check (OstreeRepo *self, GError **error);
+
+gboolean ostree_repo_create (OstreeRepo *self,
+ OstreeRepoMode mode,
+ GCancellable *cancellable,
+ GError **error);
+
+GFile * ostree_repo_get_path (OstreeRepo *self);
OstreeRepoMode ostree_repo_get_mode (OstreeRepo *self);
diff --git a/src/ostree/ot-builtin-init.c b/src/ostree/ot-builtin-init.c
index acfa928..d57ed5c 100644
--- a/src/ostree/ot-builtin-init.c
+++ b/src/ostree/ot-builtin-init.c
@@ -26,27 +26,19 @@
#include "ostree.h"
#include "libgsystem.h"
-static char *opt_mode = NULL;
+static char *opt_mode = "bare";
static GOptionEntry options[] = {
{ "mode", 0, 0, G_OPTION_ARG_STRING, &opt_mode, "Initialize repository in given mode (bare, archive-z2)",
NULL },
{ NULL }
};
-#define DEFAULT_CONFIG_CONTENTS ("[core]\n" \
- "repo_version=1\n")
-
-
gboolean
ostree_builtin_init (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context = NULL;
gboolean ret = FALSE;
- const char *mode_str = "bare";
- GFile *repo_path = NULL;
- gs_unref_object GFile *child = NULL;
- gs_unref_object GFile *grandchild = NULL;
- GString *config_data = NULL;
+ OstreeRepoMode mode;
context = g_option_context_new ("- Initialize a new empty repository");
g_option_context_add_main_entries (context, options, NULL);
@@ -54,74 +46,15 @@ ostree_builtin_init (int argc, char **argv, OstreeRepo *repo, GCancellable *canc
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo_path = ostree_repo_get_path (repo);
-
- child = g_file_get_child (repo_path, "config");
-
- config_data = g_string_new (DEFAULT_CONFIG_CONTENTS);
- if (opt_mode)
- {
- OstreeRepoMode mode;
- if (!ostree_repo_mode_from_string (opt_mode, &mode, error))
- goto out;
- mode_str = opt_mode;
- }
- g_string_append_printf (config_data, "mode=%s\n", mode_str);
- if (!g_file_replace_contents (child,
- config_data->str,
- config_data->len,
- NULL, FALSE, 0, NULL,
- NULL, error))
- goto out;
-
- g_clear_object (&child);
- child = g_file_get_child (repo_path, "objects");
- if (!g_file_make_directory (child, NULL, error))
- goto out;
-
- g_clear_object (&grandchild);
- grandchild = g_file_get_child (child, "pack");
- if (!g_file_make_directory (grandchild, NULL, error))
- goto out;
-
- g_clear_object (&child);
- child = g_file_get_child (repo_path, "tmp");
- if (!g_file_make_directory (child, NULL, error))
- goto out;
-
- g_clear_object (&child);
- child = g_file_get_child (repo_path, "refs");
- if (!g_file_make_directory (child, NULL, error))
- goto out;
-
- g_clear_object (&grandchild);
- grandchild = g_file_get_child (child, "heads");
- if (!g_file_make_directory (grandchild, NULL, error))
- goto out;
-
- g_clear_object (&grandchild);
- grandchild = g_file_get_child (child, "remotes");
- if (!g_file_make_directory (grandchild, NULL, error))
- goto out;
-
- g_clear_object (&child);
- child = g_file_get_child (repo_path, "tags");
- if (!g_file_make_directory (child, NULL, error))
- goto out;
-
- g_clear_object (&child);
- child = g_file_get_child (repo_path, "remote-cache");
- if (!g_file_make_directory (child, NULL, error))
+ if (!ostree_repo_mode_from_string (opt_mode, &mode, error))
goto out;
- if (!ostree_repo_check (repo, error))
+ if (!ostree_repo_create (repo, mode, NULL, error))
goto out;
ret = TRUE;
out:
if (context)
g_option_context_free (context);
- if (config_data)
- g_string_free (config_data, TRUE);
return ret;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]