From 6c61b1910714c5bde7f35594ab7fcd980d03c8f1 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sat, 17 Aug 2013 14:19:37 -0400 Subject: [PATCH] libostree: Improve commit filter API Make the structure private, and document the flags. https://bugzilla.gnome.org/show_bug.cgi?id=706214 --- src/libostree/ostree-repo.c | 22 +++++++++++++++++++--- src/libostree/ostree-repo.h | 26 ++++++++++++++------------ src/ostree/ot-builtin-commit.c | 8 ++++---- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index f5719890..d88a388f 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -1534,6 +1534,14 @@ create_tree_variant_from_hashes (GHashTable *file_checksums, return serialized_tree; } +struct OstreeRepoCommitModifier { + volatile gint refcount; + + OstreeRepoCommitModifierFlags flags; + OstreeRepoCommitFilter filter; + gpointer user_data; +}; + static OstreeRepoCommitFilterResult apply_commit_filter (OstreeRepo *self, OstreeRepoCommitModifier *modifier, @@ -1627,7 +1635,7 @@ stage_directory_to_mtree_internal (OstreeRepo *self, if (filter_result == OSTREE_REPO_COMMIT_FILTER_ALLOW) { g_debug ("Adding: %s", gs_file_get_path_cached (dir)); - if (!(modifier && modifier->skip_xattrs)) + if (!(modifier && (modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS) > 0)) { if (!ostree_get_xattrs_for_file (dir, &xattrs, cancellable, error)) goto out; @@ -1722,7 +1730,7 @@ stage_directory_to_mtree_internal (OstreeRepo *self, goto out; } - if (!(modifier && modifier->skip_xattrs)) + if (!(modifier && (modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS) > 0)) { g_clear_pointer (&xattrs, (GDestroyNotify) g_variant_unref); if (!ostree_get_xattrs_for_file (child, &xattrs, cancellable, error)) @@ -1875,15 +1883,23 @@ ostree_repo_stage_mtree (OstreeRepo *self, /** * ostree_repo_commit_modifier_new: + * @flags: Control options for filter + * @commit_filter: (allow-none): Function that can inspect individual files + * @user_data: (allow-none): User data * * Returns: (transfer full): A new commit modifier. */ OstreeRepoCommitModifier * -ostree_repo_commit_modifier_new (void) +ostree_repo_commit_modifier_new (OstreeRepoCommitModifierFlags flags, + OstreeRepoCommitFilter commit_filter, + gpointer user_data) { OstreeRepoCommitModifier *modifier = g_new0 (OstreeRepoCommitModifier, 1); modifier->refcount = 1; + modifier->flags = flags; + modifier->filter = commit_filter; + modifier->user_data = user_data; return modifier; } diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h index 287975fa..9562f30b 100644 --- a/src/libostree/ostree-repo.h +++ b/src/libostree/ostree-repo.h @@ -250,24 +250,26 @@ typedef OstreeRepoCommitFilterResult (*OstreeRepoCommitFilter) (OstreeRepo *r GFileInfo *file_info, gpointer user_data); +/** + * OstreeRepoCommitModifierFlags: + * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_NONE: No special flags + * @OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS: Do not process extended attributes + */ +typedef enum { + OSTREE_REPO_COMMIT_MODIFIER_FLAGS_NONE = 0, + OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS = (1 << 0) +} OstreeRepoCommitModifierFlags; + /** * OstreeRepoCommitModifier: * * A structure allowing control over commits. */ -typedef struct { - volatile gint refcount; +typedef struct OstreeRepoCommitModifier OstreeRepoCommitModifier; - guint reserved_flags : 31; - guint skip_xattrs : 1; - - OstreeRepoCommitFilter filter; - gpointer user_data; - - gpointer reserved[3]; -} OstreeRepoCommitModifier; - -OstreeRepoCommitModifier *ostree_repo_commit_modifier_new (void); +OstreeRepoCommitModifier *ostree_repo_commit_modifier_new (OstreeRepoCommitModifierFlags flags, + OstreeRepoCommitFilter commit_filter, + gpointer user_data); GType ostree_repo_commit_modifier_get_type (void); diff --git a/src/ostree/ot-builtin-commit.c b/src/ostree/ot-builtin-commit.c index b29c229e..6fffc394 100644 --- a/src/ostree/ot-builtin-commit.c +++ b/src/ostree/ot-builtin-commit.c @@ -194,10 +194,10 @@ ostree_builtin_commit (int argc, char **argv, GFile *repo_path, GCancellable *ca if (opt_owner_uid >= 0 || opt_owner_gid >= 0 || opt_statoverride_file != NULL || opt_no_xattrs) { - modifier = ostree_repo_commit_modifier_new (); - modifier->skip_xattrs = opt_no_xattrs; - modifier->filter = commit_filter; - modifier->user_data = mode_adds; + OstreeRepoCommitModifierFlags flags = 0; + if (opt_no_xattrs) + flags |= OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS; + modifier = ostree_repo_commit_modifier_new (flags, commit_filter, mode_adds); } if (!ostree_repo_resolve_rev (repo, opt_branch, TRUE, &parent, error))