[ostree] core: Clean up checkout code
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] core: Clean up checkout code
- Date: Thu, 8 Dec 2011 22:32:48 +0000 (UTC)
commit dccd106731eddc28418a10909a5dbca27b2adbf1
Author: Colin Walters <walters verbum org>
Date: Thu Dec 8 10:24:35 2011 -0500
core: Clean up checkout code
Take a GFile * for destination. Also, we only need one recursive
function, not two.
src/libostree/ostree-repo.c | 132 +++++++++++---------------------------
src/libostree/ostree-repo.h | 12 ++--
src/ostree/ot-builtin-checkout.c | 4 +-
src/ostree/ot-builtin-compose.c | 2 +-
4 files changed, 48 insertions(+), 102 deletions(-)
---
diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c
index 9f313c3..dc5ea30 100644
--- a/src/libostree/ostree-repo.c
+++ b/src/libostree/ostree-repo.c
@@ -2005,83 +2005,36 @@ checkout_file_from_input (GFile *file,
}
static gboolean
-checkout_tree (OstreeRepo *self,
- OstreeRepoCheckoutMode mode,
- OstreeRepoFile *dir,
- const char *destination,
- GCancellable *cancellable,
- GError **error);
-
-static gboolean
-checkout_one_directory (OstreeRepo *self,
- OstreeRepoCheckoutMode mode,
- const char *destination,
- const char *dirname,
- OstreeRepoFile *dir,
- GFileInfo *dir_info,
- GCancellable *cancellable,
- GError **error)
-{
- gboolean ret = FALSE;
- GFile *dest_file = NULL;
- char *dest_path = NULL;
- GVariant *xattr_variant = NULL;
-
- dest_path = g_build_filename (destination, dirname, NULL);
- dest_file = ot_gfile_new_for_path (dest_path);
-
- if (!_ostree_repo_file_get_xattrs (dir, &xattr_variant, NULL, error))
- goto out;
-
- if (!checkout_file_from_input (dest_file, mode, dir_info,
- xattr_variant,
- NULL,
- cancellable, error))
- goto out;
-
- if (mode != OSTREE_REPO_CHECKOUT_MODE_USER)
- {
- if (!_ostree_repo_file_get_xattrs (dir, &xattr_variant, NULL, error))
- goto out;
-
- if (!ostree_set_xattrs (dest_file, xattr_variant, cancellable, error))
- goto out;
- }
-
- if (!checkout_tree (self, mode, dir, dest_path, cancellable, error))
- goto out;
-
- ret = TRUE;
- out:
- g_clear_object (&dest_file);
- g_free (dest_path);
- ot_clear_gvariant (&xattr_variant);
- return ret;
-}
-
-static gboolean
-checkout_tree (OstreeRepo *self,
- OstreeRepoCheckoutMode mode,
- OstreeRepoFile *dir,
- const char *destination,
- GCancellable *cancellable,
- GError **error)
+checkout_tree (OstreeRepo *self,
+ OstreeRepoCheckoutMode mode,
+ GFile *destination,
+ OstreeRepoFile *source,
+ GFileInfo *source_info,
+ GCancellable *cancellable,
+ GError **error)
{
OstreeRepoPrivate *priv = GET_PRIVATE (self);
gboolean ret = FALSE;
GError *temp_error = NULL;
GFileInfo *file_info = NULL;
GInputStream *packed_input = NULL;
- GVariant *packed_xattrs = NULL;
+ GVariant *xattrs = NULL;
GFileEnumerator *dir_enum = NULL;
- GFile *destination_f = NULL;
- GFile *child = NULL;
- GFile *object_path = NULL;
+ GFile *src_child = NULL;
GFile *dest_path = NULL;
+ GFile *object_path = NULL;
- destination_f = ot_gfile_new_for_path (destination);
+ if (!_ostree_repo_file_get_xattrs (source, &xattrs, NULL, error))
+ goto out;
- dir_enum = g_file_enumerate_children ((GFile*)dir, OSTREE_GIO_FAST_QUERYINFO,
+ if (!checkout_file_from_input (destination, mode, source_info,
+ xattrs, NULL,
+ cancellable, error))
+ goto out;
+
+ ot_clear_gvariant (&xattrs);
+
+ dir_enum = g_file_enumerate_children ((GFile*)source, OSTREE_GIO_FAST_QUERYINFO,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable,
error);
@@ -2096,27 +2049,27 @@ checkout_tree (OstreeRepo *self,
name = g_file_info_get_attribute_byte_string (file_info, "standard::name");
type = g_file_info_get_attribute_uint32 (file_info, "standard::type");
- child = g_file_get_child ((GFile*)dir, name);
+ dest_path = g_file_get_child (destination, name);
+ src_child = g_file_get_child ((GFile*)source, name);
if (type == G_FILE_TYPE_DIRECTORY)
{
- if (!checkout_one_directory (self, mode, destination, name, (OstreeRepoFile*)child, file_info, cancellable, error))
+ if (!checkout_tree (self, mode, dest_path, (OstreeRepoFile*)src_child, file_info, cancellable, error))
goto out;
}
else
{
- const char *checksum = _ostree_repo_file_get_checksum ((OstreeRepoFile*)child);
+ const char *checksum = _ostree_repo_file_get_checksum ((OstreeRepoFile*)src_child);
- dest_path = g_file_get_child (destination_f, name);
object_path = ostree_repo_get_object_path (self, checksum, OSTREE_OBJECT_TYPE_FILE);
if (priv->archive)
{
- if (!ostree_parse_packed_file (object_path, NULL, &packed_xattrs, &packed_input,
+ if (!ostree_parse_packed_file (object_path, NULL, &xattrs, &packed_input,
cancellable, error))
goto out;
- if (!checkout_file_from_input (dest_path, mode, file_info, packed_xattrs,
+ if (!checkout_file_from_input (dest_path, mode, file_info, xattrs,
packed_input, cancellable, error))
goto out;
}
@@ -2133,9 +2086,9 @@ checkout_tree (OstreeRepo *self,
g_clear_object (&object_path);
g_clear_object (&dest_path);
g_clear_object (&file_info);
- g_clear_object (&child);
+ g_clear_object (&src_child);
g_clear_object (&packed_input);
- ot_clear_gvariant (&packed_xattrs);
+ ot_clear_gvariant (&xattrs);
}
if (file_info == NULL && temp_error != NULL)
{
@@ -2148,37 +2101,28 @@ checkout_tree (OstreeRepo *self,
g_clear_object (&dir_enum);
g_clear_object (&file_info);
g_clear_object (&packed_input);
- ot_clear_gvariant (&packed_xattrs);
- g_clear_object (&child);
+ ot_clear_gvariant (&xattrs);
+ g_clear_object (&src_child);
g_clear_object (&object_path);
g_clear_object (&dest_path);
- g_clear_object (&destination_f);
g_free (dest_path);
return ret;
}
gboolean
-ostree_repo_checkout (OstreeRepo *self,
- OstreeRepoCheckoutMode mode,
- const char *rev,
- const char *destination,
- GCancellable *cancellable,
- GError **error)
+ostree_repo_checkout (OstreeRepo *self,
+ OstreeRepoCheckoutMode mode,
+ const char *ref,
+ GFile *destination,
+ GCancellable *cancellable,
+ GError **error)
{
gboolean ret = FALSE;
char *resolved = NULL;
OstreeRepoFile *root = NULL;
GFileInfo *root_info = NULL;
- if (g_file_test (destination, G_FILE_TEST_EXISTS))
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Destination path '%s' already exists",
- destination);
- goto out;
- }
-
- if (!ostree_repo_resolve_rev (self, rev, FALSE, &resolved, error))
+ if (!ostree_repo_resolve_rev (self, ref, FALSE, &resolved, error))
goto out;
root = (OstreeRepoFile*)_ostree_repo_file_new_root (self, resolved);
@@ -2191,7 +2135,7 @@ ostree_repo_checkout (OstreeRepo *self,
if (!root_info)
goto out;
- if (!checkout_one_directory (self, mode, destination, NULL, root, root_info, cancellable, error))
+ if (!checkout_tree (self, mode, destination, root, root_info, cancellable, error))
goto out;
ret = TRUE;
diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h
index 8b929c5..4a29b68 100644
--- a/src/libostree/ostree-repo.h
+++ b/src/libostree/ostree-repo.h
@@ -136,12 +136,12 @@ typedef enum {
OSTREE_REPO_CHECKOUT_MODE_USER
} OstreeRepoCheckoutMode;
-gboolean ostree_repo_checkout (OstreeRepo *self,
- OstreeRepoCheckoutMode mode,
- const char *ref,
- const char *destination,
- GCancellable *cancellable,
- GError **error);
+gboolean ostree_repo_checkout (OstreeRepo *self,
+ OstreeRepoCheckoutMode mode,
+ const char *ref,
+ GFile *destination,
+ GCancellable *cancellable,
+ GError **error);
gboolean ostree_repo_read_commit (OstreeRepo *self,
const char *rev,
diff --git a/src/ostree/ot-builtin-checkout.c b/src/ostree/ot-builtin-checkout.c
index 024b108..3aecfc0 100644
--- a/src/ostree/ot-builtin-checkout.c
+++ b/src/ostree/ot-builtin-checkout.c
@@ -67,9 +67,11 @@ ostree_builtin_checkout (int argc, char **argv, const char *repo_path, GError **
commit = argv[1];
destination = argv[2];
+
+ destf = ot_gfile_new_for_path (destination);
if (!ostree_repo_checkout (repo, user_mode ? OSTREE_REPO_CHECKOUT_MODE_USER : 0,
- commit, destination, NULL, error))
+ commit, destf, NULL, error))
goto out;
ret = TRUE;
diff --git a/src/ostree/ot-builtin-compose.c b/src/ostree/ot-builtin-compose.c
index bfda89b..a1769f6 100644
--- a/src/ostree/ot-builtin-compose.c
+++ b/src/ostree/ot-builtin-compose.c
@@ -99,7 +99,7 @@ compose_branch_on_dir (OstreeRepo *repo,
g_print ("Checking out %s (commit %s)...\n", branch, branchrev);
if (!ostree_repo_checkout (repo, OSTREE_REPO_CHECKOUT_MODE_NONE,
- branchrev, branchpath, NULL, error))
+ branchrev, branchf, NULL, error))
goto out;
g_print ("...done\n");
g_print ("Merging over destination...\n");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]