Merge branch 'repository-n-elements' into 'main'

girepository: Add length ‘out’ arguments to several getter methods

See merge request GNOME/glib!3901
This commit is contained in:
Philip Withnall 2024-02-08 10:18:12 +00:00
commit a138589d57
5 changed files with 61 additions and 14 deletions

View File

@ -64,6 +64,7 @@ your code if integer type warnings are enabled.
| `g_irepository_get_default` | Singleton object removed; create separate [class@GIRepository.Repository] instances instead | | `g_irepository_get_default` | Singleton object removed; create separate [class@GIRepository.Repository] instances instead |
| `g_irepository_get_search_path` and `g_irepository_get_library_path` | Now return arrays rather than linked lists | | `g_irepository_get_search_path` and `g_irepository_get_library_path` | Now return arrays rather than linked lists |
| `g_irepository_enumerate_versions` | Now returns an array rather than a linked list | | `g_irepository_enumerate_versions` | Now returns an array rather than a linked list |
| `g_irepository_get_immediate_dependencies`, `g_irepository_get_dependencies` and `g_irepository_get_loaded_namespaces` | Now additionally return a length argument |
| `g_irepository_dump` | Takes structured `input_filename` and `output_filename` arguments rather than a single formatted string | | `g_irepository_dump` | Takes structured `input_filename` and `output_filename` arguments rather than a single formatted string |
| `g_function_invoker_destroy` | `gi_function_invoker_clear()` | | `g_function_invoker_destroy` | `gi_function_invoker_clear()` |
| `g_struct_info_get_copy_function` | [method@GIRepository.StructInfo.get_copy_function_name] | | `g_struct_info_get_copy_function` | [method@GIRepository.StructInfo.get_copy_function_name] |

View File

@ -267,6 +267,9 @@ gi_repository_prepend_search_path (GIRepository *repository,
* The list is internal to [class@GIRepository.Repository] and should not be * The list is internal to [class@GIRepository.Repository] and should not be
* freed, nor should its string elements. * freed, nor should its string elements.
* *
* The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not
* counted in @n_paths_out.
*
* Returns: (element-type filename) (transfer none) (array length=n_paths_out): list of search paths, most * Returns: (element-type filename) (transfer none) (array length=n_paths_out): list of search paths, most
* important first * important first
* Since: 2.80 * Since: 2.80
@ -336,6 +339,9 @@ gi_repository_prepend_library_path (GIRepository *repository,
* The list is internal to [class@GIRepository.Repository] and should not be * The list is internal to [class@GIRepository.Repository] and should not be
* freed, nor should its string elements. * freed, nor should its string elements.
* *
* The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not
* counted in @n_paths_out.
*
* Returns: (element-type filename) (transfer none) (array length=n_paths_out): list of search paths, most * Returns: (element-type filename) (transfer none) (array length=n_paths_out): list of search paths, most
* important first * important first
* Since: 2.80 * Since: 2.80
@ -547,6 +553,8 @@ register_internal (GIRepository *repository,
* gi_repository_get_immediate_dependencies: * gi_repository_get_immediate_dependencies:
* @repository: A #GIRepository * @repository: A #GIRepository
* @namespace_: Namespace of interest * @namespace_: Namespace of interest
* @n_dependencies_out: (optional) (out): Return location for the number of
* dependencies
* *
* Return an array of the immediate versioned dependencies for @namespace_. * Return an array of the immediate versioned dependencies for @namespace_.
* Returned strings are of the form `namespace-version`. * Returned strings are of the form `namespace-version`.
@ -558,13 +566,17 @@ register_internal (GIRepository *repository,
* To get the transitive closure of dependencies for @namespace_, use * To get the transitive closure of dependencies for @namespace_, use
* [method@GIRepository.Repository.get_dependencies]. * [method@GIRepository.Repository.get_dependencies].
* *
* Returns: (transfer full) (array zero-terminated=1): `NULL`-terminated string * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not
* array of immediate versioned dependencies * counted in @n_dependencies_out.
*
* Returns: (transfer full) (array length=n_dependencies_out): String array of
* immediate versioned dependencies
* Since: 2.80 * Since: 2.80
*/ */
char ** char **
gi_repository_get_immediate_dependencies (GIRepository *repository, gi_repository_get_immediate_dependencies (GIRepository *repository,
const char *namespace) const char *namespace,
size_t *n_dependencies_out)
{ {
GITypelib *typelib; GITypelib *typelib;
char **deps; char **deps;
@ -580,6 +592,9 @@ gi_repository_get_immediate_dependencies (GIRepository *repository,
if (deps == NULL) if (deps == NULL)
deps = g_strsplit ("", "|", 0); deps = g_strsplit ("", "|", 0);
if (n_dependencies_out != NULL)
*n_dependencies_out = g_strv_length (deps);
return deps; return deps;
} }
@ -627,6 +642,8 @@ get_typelib_dependencies_transitive (GIRepository *repository,
* gi_repository_get_dependencies: * gi_repository_get_dependencies:
* @repository: A #GIRepository * @repository: A #GIRepository
* @namespace_: Namespace of interest * @namespace_: Namespace of interest
* @n_dependencies_out: (optional) (out): Return location for the number of
* dependencies
* *
* Retrieves all (transitive) versioned dependencies for * Retrieves all (transitive) versioned dependencies for
* @namespace_. * @namespace_.
@ -640,13 +657,17 @@ get_typelib_dependencies_transitive (GIRepository *repository,
* To get only the immediate dependencies for @namespace_, use * To get only the immediate dependencies for @namespace_, use
* [method@GIRepository.Repository.get_immediate_dependencies]. * [method@GIRepository.Repository.get_immediate_dependencies].
* *
* Returns: (transfer full) (array zero-terminated=1): `NULL`-terminated string * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not
* array of all versioned dependencies * counted in @n_dependencies_out.
*
* Returns: (transfer full) (array length=n_dependencies_out): String array of
* all versioned dependencies
* Since: 2.80 * Since: 2.80
*/ */
char ** char **
gi_repository_get_dependencies (GIRepository *repository, gi_repository_get_dependencies (GIRepository *repository,
const char *namespace) const char *namespace,
size_t *n_dependencies_out)
{ {
GITypelib *typelib; GITypelib *typelib;
GHashTable *transitive_dependencies; /* set of owned utf8 */ GHashTable *transitive_dependencies; /* set of owned utf8 */
@ -679,6 +700,9 @@ gi_repository_get_dependencies (GIRepository *repository,
g_hash_table_unref (transitive_dependencies); g_hash_table_unref (transitive_dependencies);
if (n_dependencies_out != NULL)
*n_dependencies_out = out->len;
return (char **) g_ptr_array_free (out, FALSE); return (char **) g_ptr_array_free (out, FALSE);
} }
@ -1166,15 +1190,21 @@ collect_namespaces (gpointer key,
/** /**
* gi_repository_get_loaded_namespaces: * gi_repository_get_loaded_namespaces:
* @repository: A #GIRepository * @repository: A #GIRepository
* @n_namespaces_out: (optional) (out): Return location for the number of
* namespaces
* *
* Return the list of currently loaded namespaces. * Return the list of currently loaded namespaces.
* *
* Returns: (element-type utf8) (transfer full) (array zero-terminated=1): `NULL`-terminated * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not
* counted in @n_namespaces_out.
*
* Returns: (element-type utf8) (transfer full) (array length=n_namespaces_out):
* list of namespaces * list of namespaces
* Since: 2.80 * Since: 2.80
*/ */
char ** char **
gi_repository_get_loaded_namespaces (GIRepository *repository) gi_repository_get_loaded_namespaces (GIRepository *repository,
size_t *n_namespaces_out)
{ {
GList *l, *list = NULL; GList *l, *list = NULL;
char **names; char **names;
@ -1191,6 +1221,9 @@ gi_repository_get_loaded_namespaces (GIRepository *repository)
names[i++] = g_strdup (l->data); names[i++] = g_strdup (l->data);
g_list_free (list); g_list_free (list);
if (n_namespaces_out != NULL)
*n_namespaces_out = i;
return names; return names;
} }
@ -1247,6 +1280,9 @@ gi_repository_get_version (GIRepository *repository,
* The list is internal to [class@GIRepository.Repository] and should not be * The list is internal to [class@GIRepository.Repository] and should not be
* freed, nor should its string elements. * freed, nor should its string elements.
* *
* The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not
* counted in @out_n_elements.
*
* Returns: (nullable) (array length=out_n_elements) (transfer none): Array of * Returns: (nullable) (array length=out_n_elements) (transfer none): Array of
* paths to shared libraries, or `NULL` if none are associated * paths to shared libraries, or `NULL` if none are associated
* Since: 2.80 * Since: 2.80
@ -1640,6 +1676,9 @@ find_namespace_latest (const char *namespace,
* Obtain an unordered list of versions (either currently loaded or * Obtain an unordered list of versions (either currently loaded or
* available) for @namespace_ in this @repository. * available) for @namespace_ in this @repository.
* *
* The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not
* counted in @n_versions_out.
*
* Returns: (element-type utf8) (transfer full) (array length=n_versions_out): the array of versions. * Returns: (element-type utf8) (transfer full) (array length=n_versions_out): the array of versions.
* Since: 2.80 * Since: 2.80
*/ */

View File

@ -133,14 +133,17 @@ GITypelib * gi_repository_require_private (GIRepository *repository
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
char ** gi_repository_get_immediate_dependencies (GIRepository *repository, char ** gi_repository_get_immediate_dependencies (GIRepository *repository,
const char *namespace_); const char *namespace_,
size_t *n_dependencies_out);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
char ** gi_repository_get_dependencies (GIRepository *repository, char ** gi_repository_get_dependencies (GIRepository *repository,
const char *namespace_); const char *namespace_,
size_t *n_dependencies_out);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
char ** gi_repository_get_loaded_namespaces (GIRepository *repository); char ** gi_repository_get_loaded_namespaces (GIRepository *repository,
size_t *n_namespaces_out);
GI_AVAILABLE_IN_ALL GI_AVAILABLE_IN_ALL
GIBaseInfo * gi_repository_find_by_gtype (GIRepository *repository, GIBaseInfo * gi_repository_find_by_gtype (GIRepository *repository,

View File

@ -1373,7 +1373,7 @@ gi_ir_writer_write (const char *filename,
" xmlns:c=\"http://www.gtk.org/introspection/c/1.0\"\n" " xmlns:c=\"http://www.gtk.org/introspection/c/1.0\"\n"
" xmlns:glib=\"http://www.gtk.org/introspection/glib/1.0\""); " xmlns:glib=\"http://www.gtk.org/introspection/glib/1.0\"");
dependencies = gi_repository_get_immediate_dependencies (repository, ns); dependencies = gi_repository_get_immediate_dependencies (repository, ns, NULL);
if (dependencies != NULL) if (dependencies != NULL)
{ {
for (i = 0; dependencies[i]; i++) for (i = 0; dependencies[i]; i++)

View File

@ -41,6 +41,7 @@ test_repository_basic (RepositoryFixture *fx,
{ {
const char * const * search_paths; const char * const * search_paths;
char **namespaces = NULL; char **namespaces = NULL;
size_t n_namespaces;
const char *expected_namespaces[] = { "GLib", NULL }; const char *expected_namespaces[] = { "GLib", NULL };
char **versions; char **versions;
size_t n_versions; size_t n_versions;
@ -64,8 +65,9 @@ test_repository_basic (RepositoryFixture *fx,
g_assert_cmpuint (g_strv_length ((char **) search_paths), >, 0); g_assert_cmpuint (g_strv_length ((char **) search_paths), >, 0);
g_assert_cmpstr (search_paths[0], ==, fx->gobject_typelib_dir); g_assert_cmpstr (search_paths[0], ==, fx->gobject_typelib_dir);
namespaces = gi_repository_get_loaded_namespaces (fx->repository); namespaces = gi_repository_get_loaded_namespaces (fx->repository, &n_namespaces);
g_assert_cmpstrv (namespaces, expected_namespaces); g_assert_cmpstrv (namespaces, expected_namespaces);
g_assert_cmpuint (n_namespaces, ==, g_strv_length ((char **) expected_namespaces));
g_strfreev (namespaces); g_strfreev (namespaces);
prefix = gi_repository_get_c_prefix (fx->repository, "GLib"); prefix = gi_repository_get_c_prefix (fx->repository, "GLib");
@ -142,11 +144,13 @@ test_repository_dependencies (RepositoryFixture *fx,
{ {
GError *error = NULL; GError *error = NULL;
char **dependencies; char **dependencies;
size_t n_dependencies;
g_test_summary ("Test ensures namespace dependencies are correctly exposed"); g_test_summary ("Test ensures namespace dependencies are correctly exposed");
dependencies = gi_repository_get_dependencies (fx->repository, "GObject"); dependencies = gi_repository_get_dependencies (fx->repository, "GObject", &n_dependencies);
g_assert_cmpuint (g_strv_length (dependencies), ==, 1); g_assert_cmpuint (g_strv_length (dependencies), ==, 1);
g_assert_cmpuint (n_dependencies, ==, 1);
g_assert_true (g_strv_contains ((const char **) dependencies, "GLib-2.0")); g_assert_true (g_strv_contains ((const char **) dependencies, "GLib-2.0"));
g_clear_error (&error); g_clear_error (&error);