[ostree] core: Move merge dirs code into gio utils
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] core: Move merge dirs code into gio utils
- Date: Mon, 21 Nov 2011 20:05:01 +0000 (UTC)
commit aa69aae94e96a27c31793d904e7538ace3f525e9
Author: Colin Walters <walters verbum org>
Date: Mon Nov 21 15:03:09 2011 -0500
core: Move merge dirs code into gio utils
src/libostree/ostree-core.h | 2 -
src/libotutil/ot-gio-utils.c | 90 +++++++++++++++++++++++++++++++++++
src/libotutil/ot-gio-utils.h | 8 +++
src/ostree/ot-builtin-compose.c | 99 +--------------------------------------
4 files changed, 99 insertions(+), 100 deletions(-)
---
diff --git a/src/libostree/ostree-core.h b/src/libostree/ostree-core.h
index b869e33..72d921a 100644
--- a/src/libostree/ostree-core.h
+++ b/src/libostree/ostree-core.h
@@ -29,8 +29,6 @@ G_BEGIN_DECLS
#define OSTREE_MAX_METADATA_SIZE (1 << 26)
-#define OSTREE_GIO_FAST_QUERYINFO "standard::name,standard::type,standard::is-symlink,standard::symlink-target,standard::is-hidden,unix::*"
-
#define OSTREE_EMPTY_STRING_SHA256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
typedef enum {
diff --git a/src/libotutil/ot-gio-utils.c b/src/libotutil/ot-gio-utils.c
index 867a032..2d55f98 100644
--- a/src/libotutil/ot-gio-utils.c
+++ b/src/libotutil/ot-gio-utils.c
@@ -132,3 +132,93 @@ ot_gfile_get_basename_cached (GFile *file)
}
return name;
}
+
+gboolean
+ot_gfile_merge_dirs (GFile *destination,
+ GFile *src,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ const char *dest_path = NULL;
+ const char *src_path = NULL;
+ GError *temp_error = NULL;
+ GFileInfo *src_fileinfo = NULL;
+ GFileInfo *dest_fileinfo = NULL;
+ GFileEnumerator *src_enum = NULL;
+ GFile *dest_subfile = NULL;
+ GFile *src_subfile = NULL;
+ const char *name;
+ guint32 type;
+ const int move_flags = G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_ALL_METADATA;
+
+ dest_path = ot_gfile_get_path_cached (destination);
+ src_path = ot_gfile_get_path_cached (src);
+
+ dest_fileinfo = g_file_query_info (destination, OSTREE_GIO_FAST_QUERYINFO,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ cancellable, &temp_error);
+ if (dest_fileinfo)
+ {
+ type = g_file_info_get_attribute_uint32 (dest_fileinfo, "standard::type");
+ if (type != G_FILE_TYPE_DIRECTORY)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Attempting to replace non-directory %s with directory %s",
+ dest_path, src_path);
+ goto out;
+ }
+
+ src_enum = g_file_enumerate_children (src, OSTREE_GIO_FAST_QUERYINFO,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ cancellable, error);
+ if (!src_enum)
+ goto out;
+
+ while ((src_fileinfo = g_file_enumerator_next_file (src_enum, cancellable, &temp_error)) != NULL)
+ {
+ type = g_file_info_get_attribute_uint32 (src_fileinfo, "standard::type");
+ name = g_file_info_get_attribute_byte_string (src_fileinfo, "standard::name");
+
+ dest_subfile = g_file_get_child (destination, name);
+ src_subfile = g_file_get_child (src, name);
+
+ if (type == G_FILE_TYPE_DIRECTORY)
+ {
+ if (!ot_gfile_merge_dirs (dest_subfile, src_subfile, cancellable, error))
+ goto out;
+ }
+ else
+ {
+ if (!g_file_move (src_subfile, dest_subfile,
+ move_flags, NULL, NULL, cancellable, error))
+ goto out;
+ }
+
+ g_clear_object (&dest_subfile);
+ g_clear_object (&src_subfile);
+ }
+ if (temp_error)
+ {
+ g_propagate_error (error, temp_error);
+ goto out;
+ }
+ }
+ else if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+ {
+ g_clear_error (&temp_error);
+ if (!g_file_move (src, destination, move_flags, NULL, NULL, cancellable, error))
+ goto out;
+ }
+ else
+ goto out;
+
+ ret = TRUE;
+ out:
+ g_clear_object (&src_fileinfo);
+ g_clear_object (&dest_fileinfo);
+ g_clear_object (&src_enum);
+ g_clear_object (&dest_subfile);
+ g_clear_object (&src_subfile);
+ return ret;
+}
diff --git a/src/libotutil/ot-gio-utils.h b/src/libotutil/ot-gio-utils.h
index 4f6952d..819a873 100644
--- a/src/libotutil/ot-gio-utils.h
+++ b/src/libotutil/ot-gio-utils.h
@@ -27,6 +27,8 @@
G_BEGIN_DECLS
+#define OSTREE_GIO_FAST_QUERYINFO "standard::name,standard::type,standard::is-symlink,standard::symlink-target,standard::is-hidden,unix::*"
+
GFile *ot_gfile_new_for_path (const char *path);
const char *ot_gfile_get_path_cached (GFile *file);
@@ -41,6 +43,12 @@ gboolean ot_gfile_load_contents_utf8 (GFile *file,
GCancellable *cancellable,
GError **error);
+
+gboolean ot_gfile_merge_dirs (GFile *destination,
+ GFile *src,
+ GCancellable *cancellable,
+ GError **error);
+
G_END_DECLS
#endif
diff --git a/src/ostree/ot-builtin-compose.c b/src/ostree/ot-builtin-compose.c
index c5f7e31..f22662d 100644
--- a/src/ostree/ot-builtin-compose.c
+++ b/src/ostree/ot-builtin-compose.c
@@ -75,103 +75,6 @@ rm_rf (GFile *path)
}
static gboolean
-merge_dir (GFile *destination,
- GFile *src,
- GError **error)
-{
- gboolean ret = FALSE;
- const char *dest_path = NULL;
- const char *src_path = NULL;
- GError *temp_error = NULL;
- GFileInfo *src_fileinfo = NULL;
- GFileInfo *dest_fileinfo = NULL;
- GFileEnumerator *src_enum = NULL;
- GFile *dest_subfile = NULL;
- GFile *src_subfile = NULL;
- const char *name;
- guint32 type;
-
- dest_path = ot_gfile_get_path_cached (destination);
- src_path = ot_gfile_get_path_cached (src);
-
- dest_fileinfo = g_file_query_info (destination, OSTREE_GIO_FAST_QUERYINFO,
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
- NULL, &temp_error);
- if (dest_fileinfo)
- {
- type = g_file_info_get_attribute_uint32 (dest_fileinfo, "standard::type");
- if (type != G_FILE_TYPE_DIRECTORY)
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Attempting to replace non-directory %s with directory %s",
- dest_path, src_path);
- goto out;
- }
-
- src_enum = g_file_enumerate_children (src, OSTREE_GIO_FAST_QUERYINFO,
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
- NULL, error);
- if (!src_enum)
- goto out;
-
- while ((src_fileinfo = g_file_enumerator_next_file (src_enum, NULL, &temp_error)) != NULL)
- {
- type = g_file_info_get_attribute_uint32 (src_fileinfo, "standard::type");
- name = g_file_info_get_attribute_byte_string (src_fileinfo, "standard::name");
-
- dest_subfile = g_file_get_child (destination, name);
- src_subfile = g_file_get_child (src, name);
-
- if (type == G_FILE_TYPE_DIRECTORY)
- {
- if (!merge_dir (dest_subfile, src_subfile, error))
- goto out;
- }
- else
- {
- if (!g_file_delete (dest_subfile, NULL, &temp_error))
- {
- if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
- g_clear_error (&temp_error);
- else
- {
- g_propagate_error (error, temp_error);
- goto out;
- }
- }
- if (!g_file_move (src_subfile, dest_subfile, 0, NULL, NULL, NULL, error))
- goto out;
- }
-
- g_clear_object (&dest_subfile);
- g_clear_object (&src_subfile);
- }
- if (temp_error)
- {
- g_propagate_error (error, temp_error);
- goto out;
- }
- }
- else if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
- {
- g_clear_error (&temp_error);
- if (!g_file_move (src, destination, 0, NULL, NULL, NULL, error))
- goto out;
- }
- else
- goto out;
-
- ret = TRUE;
- out:
- g_clear_object (&src_fileinfo);
- g_clear_object (&dest_fileinfo);
- g_clear_object (&src_enum);
- g_clear_object (&dest_subfile);
- g_clear_object (&src_subfile);
- return ret;
-}
-
-static gboolean
compose_branch_on_dir (OstreeRepo *repo,
GFile *destination,
const char *branch,
@@ -199,7 +102,7 @@ compose_branch_on_dir (OstreeRepo *repo,
goto out;
g_print ("...done\n");
g_print ("Merging over destination...\n");
- if (!merge_dir (destination, branchf, error))
+ if (!ot_gfile_merge_dirs (destination, branchf, NULL, error))
goto out;
if (metadata_builder)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]