/* * Copyright © 2017 Endless Mobile, Inc. * * SPDX-License-Identifier: LGPL-2.0+ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * * Authors: * - Philip Withnall */ #include "config.h" #include #include #include #include #include "ostree-autocleanups.h" #include "ostree-core.h" #include "ostree-core-private.h" #include "ostree-ref.h" G_DEFINE_BOXED_TYPE (OstreeCollectionRef, ostree_collection_ref, ostree_collection_ref_dup, ostree_collection_ref_free) /** * ostree_collection_ref_new: * @collection_id: (nullable): a collection ID, or %NULL for a plain ref * @ref_name: a ref name * * Create a new #OstreeCollectionRef containing (@collection_id, @ref_name). If * @collection_id is %NULL, this is equivalent to a plain ref name string (not a * refspec; no remote name is included), which can be used for non-P2P * operations. * * Returns: (transfer full) (nullable): a new #OstreeCollectionRef * Since: 2018.6 */ OstreeCollectionRef * ostree_collection_ref_new (const gchar *collection_id, const gchar *ref_name) { g_autoptr(OstreeCollectionRef) collection_ref = NULL; g_return_val_if_fail (collection_id == NULL || ostree_validate_collection_id (collection_id, NULL), NULL); g_return_val_if_fail (ostree_validate_rev (ref_name, NULL), NULL); collection_ref = g_new0 (OstreeCollectionRef, 1); collection_ref->collection_id = g_strdup (collection_id); collection_ref->ref_name = g_strdup (ref_name); return g_steal_pointer (&collection_ref); } /** * ostree_collection_ref_dup: * @ref: (not nullable): an #OstreeCollectionRef * * Create a copy of the given @ref. * * Returns: (transfer full): a newly allocated copy of @ref * Since: 2018.6 */ OstreeCollectionRef * ostree_collection_ref_dup (const OstreeCollectionRef *ref) { g_return_val_if_fail (ref != NULL, NULL); return ostree_collection_ref_new (ref->collection_id, ref->ref_name); } /** * ostree_collection_ref_free: * @ref: (transfer full): an #OstreeCollectionRef * * Free the given @ref. * * Since: 2018.6 */ void ostree_collection_ref_free (OstreeCollectionRef *ref) { g_return_if_fail (ref != NULL); g_free (ref->collection_id); g_free (ref->ref_name); g_free (ref); } /** * ostree_collection_ref_hash: * @ref: (not nullable): an #OstreeCollectionRef * * Hash the given @ref. This function is suitable for use with #GHashTable. * @ref must be non-%NULL. * * Returns: hash value for @ref * Since: 2018.6 */ guint ostree_collection_ref_hash (gconstpointer ref) { const OstreeCollectionRef *_ref = ref; if (_ref->collection_id != NULL) return g_str_hash (_ref->collection_id) ^ g_str_hash (_ref->ref_name); else return g_str_hash (_ref->ref_name); } /** * ostree_collection_ref_equal: * @ref1: (not nullable): an #OstreeCollectionRef * @ref2 : (not nullable): another #OstreeCollectionRef * * Compare @ref1 and @ref2 and return %TRUE if they have the same collection ID and * ref name, and %FALSE otherwise. Both @ref1 and @ref2 must be non-%NULL. * * Returns: %TRUE if @ref1 and @ref2 are equal, %FALSE otherwise * Since: 2018.6 */ gboolean ostree_collection_ref_equal (gconstpointer ref1, gconstpointer ref2) { const OstreeCollectionRef *_ref1 = ref1, *_ref2 = ref2; return (g_strcmp0 (_ref1->collection_id, _ref2->collection_id) == 0 && g_strcmp0 (_ref1->ref_name, _ref2->ref_name) == 0); } /** * ostree_collection_ref_dupv: * @refs: (array zero-terminated=1): %NULL-terminated array of #OstreeCollectionRefs * * Copy an array of #OstreeCollectionRefs, including deep copies of all its * elements. @refs must be %NULL-terminated; it may be empty, but must not be * %NULL. * * Returns: (transfer full) (array zero-terminated=1): a newly allocated copy of @refs * Since: 2018.6 */ OstreeCollectionRef ** ostree_collection_ref_dupv (const OstreeCollectionRef * const *refs) { gsize i, n_refs = g_strv_length ((gchar **) refs); /* hack */ g_auto(OstreeCollectionRefv) new_refs = NULL; g_return_val_if_fail (refs != NULL, NULL); new_refs = g_new0 (OstreeCollectionRef*, n_refs + 1); for (i = 0; i < n_refs; i++) new_refs[i] = ostree_collection_ref_dup (refs[i]); new_refs[i] = NULL; return g_steal_pointer (&new_refs); } /** * ostree_collection_ref_freev: * @refs: (transfer full) (array zero-terminated=1): an array of #OstreeCollectionRefs * * Free the given array of @refs, including freeing all its elements. @refs * must be %NULL-terminated; it may be empty, but must not be %NULL. * * Since: 2018.6 */ void ostree_collection_ref_freev (OstreeCollectionRef **refs) { gsize i; g_return_if_fail (refs != NULL); for (i = 0; refs[i] != NULL; i++) ostree_collection_ref_free (refs[i]); g_free (refs); }