From 90b9a06277c2d91ee331aae225031e5d6a1d4553 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 14 Jun 2016 21:51:10 -0400 Subject: [PATCH] lib: Use g_file_enumerator_iterate() if available, with fallback Import `gs_file_enumerator_iterate()` for the next six months or so...after RHEL 7.3 is released I'm strongly considering hard requiring 2.46 or so. Likely at some point we should figure out how to share more "glib backport" code with NetworkManager at least. Closes: #341 Approved by: jlebon --- src/libostree/ostree-bootloader-grub2.c | 4 +- src/libostree/ostree-gpg-verifier.c | 4 +- src/libostree/ostree-repo-checkout.c | 4 +- src/libostree/ostree-repo-commit.c | 4 +- src/libostree/ostree-repo-libarchive.c | 4 +- src/libostree/ostree-repo-static-delta-core.c | 8 +-- src/libostree/ostree-repo.c | 4 +- src/libostree/ostree-sysroot-cleanup.c | 12 ++--- src/libotutil/ot-gio-utils.c | 52 +++++++++++++++++++ src/libotutil/ot-gio-utils.h | 22 ++++++++ ...-instutil-builtin-selinux-ensure-labeled.c | 4 +- 11 files changed, 98 insertions(+), 24 deletions(-) diff --git a/src/libostree/ostree-bootloader-grub2.c b/src/libostree/ostree-bootloader-grub2.c index c970e662..6aa551ae 100644 --- a/src/libostree/ostree-bootloader-grub2.c +++ b/src/libostree/ostree-bootloader-grub2.c @@ -83,8 +83,8 @@ _ostree_bootloader_grub2_query (OstreeBootloader *bootloader, const char *fname; g_autofree char *subdir_grub_cfg = NULL; - if (!gs_file_enumerator_iterate (direnum, &file_info, NULL, - cancellable, error)) + if (!g_file_enumerator_iterate (direnum, &file_info, NULL, + cancellable, error)) goto out; if (file_info == NULL) break; diff --git a/src/libostree/ostree-gpg-verifier.c b/src/libostree/ostree-gpg-verifier.c index b9a03a11..0ec0b515 100644 --- a/src/libostree/ostree-gpg-verifier.c +++ b/src/libostree/ostree-gpg-verifier.c @@ -253,8 +253,8 @@ _ostree_gpg_verifier_add_keyring_dir (OstreeGpgVerifier *self, GFile *path; const char *name; - if (!gs_file_enumerator_iterate (enumerator, &file_info, &path, - cancellable, error)) + if (!g_file_enumerator_iterate (enumerator, &file_info, &path, + cancellable, error)) goto out; if (file_info == NULL) break; diff --git a/src/libostree/ostree-repo-checkout.c b/src/libostree/ostree-repo-checkout.c index 5f7cf0bd..59c8517a 100644 --- a/src/libostree/ostree-repo-checkout.c +++ b/src/libostree/ostree-repo-checkout.c @@ -696,8 +696,8 @@ checkout_tree_at (OstreeRepo *self, GFile *src_child; const char *name; - if (!gs_file_enumerator_iterate (dir_enum, &file_info, &src_child, - cancellable, error)) + if (!g_file_enumerator_iterate (dir_enum, &file_info, &src_child, + cancellable, error)) goto out; if (file_info == NULL) break; diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c index cec19e4a..0d45dd47 100644 --- a/src/libostree/ostree-repo-commit.c +++ b/src/libostree/ostree-repo-commit.c @@ -2659,8 +2659,8 @@ write_directory_to_mtree_internal (OstreeRepo *self, { GFileInfo *child_info; - if (!gs_file_enumerator_iterate (dir_enum, &child_info, NULL, - cancellable, error)) + if (!g_file_enumerator_iterate (dir_enum, &child_info, NULL, + cancellable, error)) goto out; if (child_info == NULL) break; diff --git a/src/libostree/ostree-repo-libarchive.c b/src/libostree/ostree-repo-libarchive.c index 45427ef7..cfecd6d9 100644 --- a/src/libostree/ostree-repo-libarchive.c +++ b/src/libostree/ostree-repo-libarchive.c @@ -1075,8 +1075,8 @@ write_directory_to_libarchive_recurse (OstreeRepo *self, GFileInfo *file_info; GFile *path; - if (!gs_file_enumerator_iterate (dir_enum, &file_info, &path, - cancellable, error)) + if (!g_file_enumerator_iterate (dir_enum, &file_info, &path, + cancellable, error)) goto out; if (file_info == NULL) break; diff --git a/src/libostree/ostree-repo-static-delta-core.c b/src/libostree/ostree-repo-static-delta-core.c index de9e6c7a..d4f8a573 100644 --- a/src/libostree/ostree-repo-static-delta-core.c +++ b/src/libostree/ostree-repo-static-delta-core.c @@ -94,8 +94,8 @@ ostree_repo_list_static_delta_names (OstreeRepo *self, GFileInfo *file_info; GFile *child; - if (!gs_file_enumerator_iterate (dir_enum, &file_info, &child, - NULL, error)) + if (!g_file_enumerator_iterate (dir_enum, &file_info, &child, + NULL, error)) goto out; if (file_info == NULL) break; @@ -117,8 +117,8 @@ ostree_repo_list_static_delta_names (OstreeRepo *self, const char *name1; const char *name2; - if (!gs_file_enumerator_iterate (dir_enum2, &file_info2, &child2, - NULL, error)) + if (!g_file_enumerator_iterate (dir_enum2, &file_info2, &child2, + NULL, error)) goto out; if (file_info2 == NULL) break; diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 0b918ed8..81fc719f 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -2070,8 +2070,8 @@ append_remotes_d (OstreeRepo *self, const char *name; guint32 type; - if (!gs_file_enumerator_iterate (direnum, &file_info, &path, - NULL, error)) + if (!g_file_enumerator_iterate (direnum, &file_info, &path, + NULL, error)) goto out; if (file_info == NULL) break; diff --git a/src/libostree/ostree-sysroot-cleanup.c b/src/libostree/ostree-sysroot-cleanup.c index 64c1389e..862d8154 100644 --- a/src/libostree/ostree-sysroot-cleanup.c +++ b/src/libostree/ostree-sysroot-cleanup.c @@ -65,8 +65,8 @@ _ostree_sysroot_list_deployment_dirs_for_os (GFile *osdir, g_autofree char *csum = NULL; gint deployserial; - if (!gs_file_enumerator_iterate (dir_enum, &file_info, &child, - cancellable, error)) + if (!g_file_enumerator_iterate (dir_enum, &file_info, &child, + cancellable, error)) goto out; if (file_info == NULL) break; @@ -127,8 +127,8 @@ list_all_deployment_directories (OstreeSysroot *self, GFileInfo *file_info = NULL; GFile *child = NULL; - if (!gs_file_enumerator_iterate (dir_enum, &file_info, &child, - NULL, error)) + if (!g_file_enumerator_iterate (dir_enum, &file_info, &child, + NULL, error)) goto out; if (file_info == NULL) break; @@ -215,8 +215,8 @@ list_all_boot_directories (OstreeSysroot *self, GFile *child = NULL; const char *name; - if (!gs_file_enumerator_iterate (dir_enum, &file_info, &child, - NULL, error)) + if (!g_file_enumerator_iterate (dir_enum, &file_info, &child, + NULL, error)) goto out; if (file_info == NULL) break; diff --git a/src/libotutil/ot-gio-utils.c b/src/libotutil/ot-gio-utils.c index eb9b94f5..4ff2feda 100644 --- a/src/libotutil/ot-gio-utils.c +++ b/src/libotutil/ot-gio-utils.c @@ -493,3 +493,55 @@ ot_util_ensure_directory_and_fsync (GFile *dir, out: return ret; } + +#if !GLIB_CHECK_VERSION(2, 44, 0) + +gboolean +ot_file_enumerator_iterate (GFileEnumerator *direnum, + GFileInfo **out_info, + GFile **out_child, + GCancellable *cancellable, + GError **error) +{ + gboolean ret = FALSE; + GError *temp_error = NULL; + + static GQuark cached_info_quark; + static GQuark cached_child_quark; + static gsize quarks_initialized; + + g_return_val_if_fail (direnum != NULL, FALSE); + g_return_val_if_fail (out_info != NULL, FALSE); + + if (g_once_init_enter (&quarks_initialized)) + { + cached_info_quark = g_quark_from_static_string ("ot-cached-info"); + cached_child_quark = g_quark_from_static_string ("ot-cached-child"); + g_once_init_leave (&quarks_initialized, 1); + } + + *out_info = g_file_enumerator_next_file (direnum, cancellable, &temp_error); + if (out_child) + *out_child = NULL; + if (temp_error != NULL) + { + g_propagate_error (error, temp_error); + goto out; + } + else if (*out_info != NULL) + { + g_object_set_qdata_full ((GObject*)direnum, cached_info_quark, *out_info, (GDestroyNotify)g_object_unref); + if (out_child != NULL) + { + const char *name = g_file_info_get_name (*out_info); + *out_child = g_file_get_child (g_file_enumerator_get_container (direnum), name); + g_object_set_qdata_full ((GObject*)direnum, cached_child_quark, *out_child, (GDestroyNotify)g_object_unref); + } + } + + ret = TRUE; + out: + return ret; +} + +#endif diff --git a/src/libotutil/ot-gio-utils.h b/src/libotutil/ot-gio-utils.h index 355073af..030acac6 100644 --- a/src/libotutil/ot-gio-utils.h +++ b/src/libotutil/ot-gio-utils.h @@ -93,4 +93,26 @@ gboolean ot_util_fsync_directory (GFile *dir, GCancellable *cancellable, GError **error); +#if !GLIB_CHECK_VERSION(2, 44, 0) +gboolean +ot_file_enumerator_iterate (GFileEnumerator *direnum, + GFileInfo **out_info, + GFile **out_child, + GCancellable *cancellable, + GError **error); +#else +static inline gboolean +ot_file_enumerator_iterate (GFileEnumerator *direnum, + GFileInfo **out_info, + GFile **out_child, + GCancellable *cancellable, + GError **error) +{ + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + return (g_file_enumerator_iterate) (direnum, out_info, out_child, cancellable, error); + G_GNUC_END_IGNORE_DEPRECATIONS; +} +#endif +#define g_file_enumerator_iterate ot_file_enumerator_iterate + G_END_DECLS diff --git a/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c b/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c index 776ab54f..692a2623 100644 --- a/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c +++ b/src/ostree/ot-admin-instutil-builtin-selinux-ensure-labeled.c @@ -114,8 +114,8 @@ relabel_recursively (OstreeSePolicy *sepolicy, GFile *child; GFileType ftype; - if (!gs_file_enumerator_iterate (direnum, &file_info, &child, - cancellable, error)) + if (!g_file_enumerator_iterate (direnum, &file_info, &child, + cancellable, error)) goto out; if (file_info == NULL) break;