Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package girara for openSUSE:Factory checked in at 2026-07-08 17:37:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/girara (Old) and /work/SRC/openSUSE:Factory/.girara.new.1982 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "girara" Wed Jul 8 17:37:13 2026 rev:22 rq:1364430 version:2026.07.07 Changes: -------- --- /work/SRC/openSUSE:Factory/girara/girara.changes 2026-07-03 16:07:00.125608489 +0200 +++ /work/SRC/openSUSE:Factory/.girara.new.1982/girara.changes 2026-07-08 17:39:23.587442155 +0200 @@ -1,0 +2,12 @@ +Wed Jul 8 07:25:07 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to version 2026.07.07: + * Fix several small memory leaks and a broken history + deduplication loop + * Correct the log-level string conversion + * Build with the C23 standard + * Fix version information and documentation +- Drop girara-tests-unset-xdg-vars.patch: the XDG-variable unset + fix for the utils-with-home test is now included upstream + +------------------------------------------------------------------- Old: ---- girara-2026.02.04.tar.xz girara-2026.02.04.tar.xz.asc girara-tests-unset-xdg-vars.patch New: ---- girara-2026.07.07.tar.xz girara-2026.07.07.tar.xz.asc ----------(Old B)---------- Old: * Fix version information and documentation - Drop girara-tests-unset-xdg-vars.patch: the XDG-variable unset fix for the utils-with-home test is now included upstream ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ girara.spec ++++++ --- /var/tmp/diff_new_pack.xTkwhC/_old 2026-07-08 17:39:24.559476123 +0200 +++ /var/tmp/diff_new_pack.xTkwhC/_new 2026-07-08 17:39:24.563476262 +0200 @@ -22,7 +22,7 @@ %bcond_without gcc15 %endif Name: girara -Version: 2026.02.04 +Version: 2026.07.07 Release: 0 Summary: Graphical user interface library License: Zlib @@ -30,8 +30,6 @@ Source0: %{url}/download/girara-%{version}.tar.xz Source1: %{url}/download/girara-%{version}.tar.xz.asc Source2: girara.keyring -# PATCH-FIX-UPSTREAM girara-tests-unset-xdg-vars.patch -- Unset XDG_* variables so tests work with custom HOME (upstream commit 0f653f2c4e3e) -Patch0: girara-tests-unset-xdg-vars.patch BuildRequires: c_compiler BuildRequires: meson >= 1.5 BuildRequires: pkgconfig ++++++ girara-2026.02.04.tar.xz -> girara-2026.07.07.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/.github/workflows/build.yaml new/girara-2026.07.07/.github/workflows/build.yaml --- old/girara-2026.02.04/.github/workflows/build.yaml 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/.github/workflows/build.yaml 2026-07-07 21:44:56.000000000 +0200 @@ -17,7 +17,7 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Build and test run: | mkdir build @@ -34,7 +34,7 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Build and test run: | mkdir build @@ -52,7 +52,7 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Build and test run: | mkdir build @@ -61,16 +61,16 @@ ninja --verbose ninja test --verbose - build-test-ubuntu-noble: - name: Test on Ubuntu noble + build-test-ubuntu-resolute: + name: Test on Ubuntu resolute runs-on: ubuntu-latest container: - image: ghcr.io/pwmt/github-actions-ubuntu:noble + image: ghcr.io/pwmt/github-actions-ubuntu:resolute credentials: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Build and test run: | mkdir build @@ -88,7 +88,7 @@ username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Build and test run: | mkdir build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/doc/meson.build new/girara-2026.07.07/doc/meson.build --- old/girara-2026.02.04/doc/meson.build 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/doc/meson.build 2026-07-07 21:44:56.000000000 +0200 @@ -4,15 +4,12 @@ conf_data.set('DOXYGEN_INPUT', meson.project_source_root()) conf_data.set('DOXYGEN_OUTPUT', meson.current_build_dir()) - doxyfile = configure_file( - input: 'Doxyfile.in', - output: 'Doxyfile', - configuration: conf_data - ) + doxyfile = configure_file(input: 'Doxyfile.in', output: 'Doxyfile', configuration: conf_data) - custom_target('doc', + custom_target( + 'doc', build_by_default: true, command: [doxygen, doxyfile], - output: ['html'] + output: ['html'], ) -endif +endif \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/datastructures-list.c new/girara-2026.07.07/girara/datastructures-list.c --- old/girara-2026.02.04/girara/datastructures-list.c 1970-01-01 01:00:00.000000000 +0100 +++ new/girara-2026.07.07/girara/datastructures-list.c 2026-07-07 21:44:56.000000000 +0200 @@ -0,0 +1,322 @@ +/* SPDX-License-Identifier: Zlib */ + +#include "datastructures.h" + +#include <stdlib.h> +#include <glib.h> + +#include "log.h" + +struct girara_list_s { + void** start; /**> List start */ + size_t size; /**> The list size */ + girara_free_function_t free; /**> The free function **/ + girara_compare_function_t cmp; /**> The sort function */ +}; + +struct girara_list_iterator_s { + girara_list_t* list; /**> The list */ + size_t index; /**> The list index */ +}; + +girara_list_t* girara_list_new(void) { + return g_try_malloc0(sizeof(girara_list_t)); +} + +girara_list_t* girara_list_new_with_free(girara_free_function_t gfree) { + girara_list_t* list = g_try_malloc0(sizeof(girara_list_t)); + if (list != NULL) { + list->free = gfree; + } + return list; +} + +girara_list_t* girara_sorted_list_new(girara_compare_function_t cmp) { + girara_list_t* list = g_try_malloc0(sizeof(girara_list_t)); + if (list != NULL) { + list->cmp = cmp; + } + return list; +} + +girara_list_t* girara_sorted_list_new_with_free(girara_compare_function_t cmp, girara_free_function_t gfree) { + girara_list_t* list = g_try_malloc0(sizeof(girara_list_t)); + if (list != NULL) { + list->free = gfree; + list->cmp = cmp; + } + return list; +} + +void girara_list_set_free_function(girara_list_t* list, girara_free_function_t gfree) { + g_return_if_fail(list != NULL); + list->free = gfree; +} + +void girara_list_clear(girara_list_t* list) { + if (list == NULL) { + return; + } + + if (list->free) { + for (size_t idx = 0; idx != list->size; ++idx) { + list->free(list->start[idx]); + } + } + g_free(list->start); + list->start = NULL; + list->size = 0; +} + +void girara_list_free(girara_list_t* list) { + if (list != NULL) { + girara_list_clear(list); + g_free(list); + } +} + +void girara_list_append(girara_list_t* list, void* data) { + g_return_if_fail(list != NULL); + + void** new_start = g_realloc_n(list->start, list->size + 1, sizeof(void*)); + g_return_if_fail(new_start != NULL); + + list->start = new_start; + list->start[list->size++] = data; + if (list->cmp != NULL) { + girara_list_sort(list, list->cmp); + } +} + +void girara_list_prepend(girara_list_t* list, void* data) { + g_return_if_fail(list != NULL); + + if (list->cmp != NULL) { + girara_list_append(list, data); + } else { + list->start = g_realloc_n(list->start, list->size + 1, sizeof(void*)); + memmove(list->start + 1, list->start, list->size * sizeof(void*)); + list->start[0] = data; + ++list->size; + } +} + +void girara_list_remove(girara_list_t* list, void* data) { + g_return_if_fail(list != NULL); + + ssize_t pos = girara_list_position(list, data); + if (pos == -1) { + return; + } + + if (list->free) { + list->free(list->start[pos]); + } + memmove(list->start + pos, list->start + pos + 1, (list->size - pos - 1) * sizeof(void*)); + --list->size; +} + +void* girara_list_nth(girara_list_t* list, size_t n) { + g_return_val_if_fail(list != NULL, NULL); + g_return_val_if_fail(n < list->size, NULL); + + return list->start[n]; +} + +void girara_list_set_nth(girara_list_t* list, size_t n, void* data) { + g_return_if_fail(list != NULL); + g_return_if_fail(n < list->size); + g_return_if_fail(list->cmp == NULL); + + if (list->free != NULL) { + list->free(list->start[n]); + } + + list->start[n] = data; +} + +bool girara_list_contains(girara_list_t* list, void* data) { + g_return_val_if_fail(list != NULL, false); + for (size_t idx = 0; idx != list->size; ++idx) { + if (list->start[idx] == data) { + return true; + } + } + return false; +} + +void* girara_list_find(const girara_list_t* list, girara_compare_function_t compare, const void* data) { + g_return_val_if_fail(list != NULL && compare != NULL, NULL); + + for (size_t idx = 0; idx != list->size; ++idx) { + if (compare(list->start[idx], data) == 0) { + return list->start[idx]; + } + } + + return NULL; +} + +girara_list_iterator_t* girara_list_iterator(girara_list_t* list) { + g_return_val_if_fail(list != NULL, NULL); + + if (list->size == 0) { + return NULL; + } + + girara_list_iterator_t* iter = g_try_malloc0(sizeof(girara_list_iterator_t)); + if (iter != NULL) { + iter->list = list; + } + return iter; +} + +girara_list_iterator_t* girara_list_iterator_copy(girara_list_iterator_t* iter) { + g_return_val_if_fail(iter != NULL, NULL); + + return g_memdup2(iter, sizeof(girara_list_iterator_t)); +} + +girara_list_iterator_t* girara_list_iterator_next(girara_list_iterator_t* iter) { + if (girara_list_iterator_is_valid(iter) == false) { + return NULL; + } + + ++iter->index; + if (iter->index < iter->list->size) { + return iter; + } + return NULL; +} + +bool girara_list_iterator_has_next(girara_list_iterator_t* iter) { + if (girara_list_iterator_is_valid(iter) == false) { + return false; + } + + return iter->index + 1 < iter->list->size; +} + +girara_list_iterator_t* girara_list_iterator_previous(girara_list_iterator_t* iter) { + if (girara_list_iterator_is_valid(iter) == false) { + return NULL; + } + + if (iter->index == 0) { + iter->index = iter->list->size; + return NULL; + } + --iter->index; + return iter; +} + +bool girara_list_iterator_has_previous(girara_list_iterator_t* iter) { + if (girara_list_iterator_is_valid(iter) == false || iter->index == 0) { + return false; + } + + return true; +} + +void girara_list_iterator_remove(girara_list_iterator_t* iter) { + if (girara_list_iterator_is_valid(iter) == false) { + return; + } + + if (iter->list->free) { + iter->list->free(iter->list->start[iter->index]); + } + memmove(iter->list->start + iter->index, iter->list->start + iter->index + 1, + (iter->list->size - iter->index - 1) * sizeof(void*)); + --iter->list->size; +} + +bool girara_list_iterator_is_valid(girara_list_iterator_t* iter) { + return iter != NULL && iter->list != NULL && iter->index < iter->list->size; +} + +void* girara_list_iterator_data(girara_list_iterator_t* iter) { + g_return_val_if_fail(girara_list_iterator_is_valid(iter), NULL); + return girara_list_nth(iter->list, iter->index); +} + +void girara_list_iterator_set(girara_list_iterator_t* iter, void* data) { + g_return_if_fail(girara_list_iterator_is_valid(iter)); + g_return_if_fail(iter->list->cmp == NULL); + + girara_list_set_nth(iter->list, iter->index, data); +} + +void girara_list_iterator_free(girara_list_iterator_t* iter) { + g_free(iter); +} + +size_t girara_list_size(girara_list_t* list) { + g_return_val_if_fail(list != NULL, 0); + return list->size; +} + +ssize_t girara_list_position(girara_list_t* list, void* data) { + g_return_val_if_fail(list != NULL, -1); + + for (size_t idx = 0; idx != list->size; ++idx) { + if (list->start[idx] == data) { + return idx; + } + } + return -1; +} + +typedef struct { + girara_compare_function_t compare; +} comparer_t; + +static int comparer(const void* p1, const void* p2, void* data) { + comparer_t* compare = data; + return compare->compare(*(const void**)p1, *(const void**)p2); +} + +void girara_list_sort(girara_list_t* list, girara_compare_function_t compare) { + g_return_if_fail(list != NULL); + if (list->start == NULL || compare == NULL) { + return; + } + + comparer_t comp = {compare}; +#if GLIB_CHECK_VERSION(2, 81, 1) + g_sort_array(list->start, list->size, sizeof(void*), comparer, &comp); +#else + g_qsort_with_data(list->start, list->size, sizeof(void*), comparer, &comp); +#endif +} + +void girara_list_foreach(girara_list_t* list, girara_list_callback_t callback, void* data) { + g_return_if_fail(list != NULL && callback != NULL); + if (list->start == NULL) { + return; + } + + for (size_t idx = 0; idx != list->size; ++idx) { + callback(list->start[idx], data); + } +} + +static void list_append(void* data, void* userdata) { + girara_list_t* list = userdata; + girara_list_append(list, data); +} + +girara_list_t* girara_list_merge(girara_list_t* list, girara_list_t* other) { + g_return_val_if_fail(list != NULL, NULL); + if (other == NULL) { + return list; + } + + if (list->free != other->free) { + girara_warning("girara_list_merge: merging lists with different free functions!"); + } + other->free = NULL; + + girara_list_foreach(other, list_append, list); + return list; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/datastructures-node.c new/girara-2026.07.07/girara/datastructures-node.c --- old/girara-2026.02.04/girara/datastructures-node.c 1970-01-01 01:00:00.000000000 +0100 +++ new/girara-2026.07.07/girara/datastructures-node.c 2026-07-07 21:44:56.000000000 +0200 @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: Zlib */ + +#include "datastructures.h" + +#include <stdlib.h> +#include <glib.h> + +struct girara_tree_node_s { + GNode* node; /**> The node object */ + girara_free_function_t free; /**> The free function */ + void* data; /**> The data */ +}; + +girara_tree_node_t* girara_node_new(void* data) { + girara_tree_node_t* node = g_try_malloc0(sizeof(girara_tree_node_t)); + if (node == NULL) { + return NULL; + } + + node->data = data; + node->node = g_node_new(node); + + if (node->node == NULL) { + g_free(node); + return NULL; + } + + return node; +} + +void girara_node_set_free_function(girara_tree_node_t* node, girara_free_function_t gfree) { + g_return_if_fail(node); + node->free = gfree; +} + +void girara_node_free(girara_tree_node_t* node) { + if (node == NULL) { + return; + } + + if (node->free != NULL) { + node->free(node->data); + } + + GNode* childnode = node->node->children; + while (childnode != NULL) { + GNode* nextnode = childnode->next; + girara_tree_node_t* childnodedata = childnode->data; + girara_node_free(childnodedata); + childnode = nextnode; + } + + g_node_destroy(node->node); + g_free(node); +} + +void girara_node_append(girara_tree_node_t* parent, girara_tree_node_t* child) { + g_return_if_fail(parent && child); + g_node_append(parent->node, child->node); +} + +girara_tree_node_t* girara_node_append_data(girara_tree_node_t* parent, void* data) { + g_return_val_if_fail(parent, NULL); + girara_tree_node_t* child = girara_node_new(data); + g_return_val_if_fail(child, NULL); + child->free = parent->free; + girara_node_append(parent, child); + + return child; +} + +girara_tree_node_t* girara_node_get_parent(girara_tree_node_t* node) { + g_return_val_if_fail(node && node->node, NULL); + + if (node->node->parent == NULL) { + return NULL; + } + + girara_tree_node_t* parent = node->node->parent->data; + g_return_val_if_fail(parent, NULL); + + return parent; +} + +girara_tree_node_t* girara_node_get_root(girara_tree_node_t* node) { + g_return_val_if_fail(node && node->node, NULL); + + if (node->node->parent == NULL) { + return node; + } + + GNode* root = g_node_get_root(node->node); + g_return_val_if_fail(root, NULL); + girara_tree_node_t* root_node = root->data; + g_return_val_if_fail(root_node, NULL); + + return root_node; +} + +girara_list_t* girara_node_get_children(girara_tree_node_t* node) { + g_return_val_if_fail(node, NULL); + girara_list_t* list = girara_list_new(); + g_return_val_if_fail(list, NULL); + + GNode* childnode = node->node->children; + while (childnode != NULL) { + girara_list_append(list, childnode->data); + childnode = childnode->next; + } + + return list; +} + +size_t girara_node_get_num_children(girara_tree_node_t* node) { + g_return_val_if_fail(node && node->node, 0); + + return g_node_n_children(node->node); +} + +void* girara_node_get_data(girara_tree_node_t* node) { + g_return_val_if_fail(node, NULL); + + return node->data; +} + +void girara_node_set_data(girara_tree_node_t* node, void* data) { + g_return_if_fail(node); + + if (node->free != NULL) { + node->free(node->data); + } + + node->data = data; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/datastructures.c new/girara-2026.07.07/girara/datastructures.c --- old/girara-2026.02.04/girara/datastructures.c 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/girara/datastructures.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,484 +0,0 @@ -/* SPDX-License-Identifier: Zlib */ - -#include "datastructures.h" - -#include <stdlib.h> -#include <glib.h> - -#include "log.h" -#include "utils.h" - -struct girara_tree_node_s { - GNode* node; /**> The node object */ - girara_free_function_t free; /**> The free function */ -}; - -typedef struct girara_tree_node_data_s { - girara_tree_node_t* node; /**> The node */ - void* data; /**> The data */ -} girara_tree_node_data_t; - -struct girara_list_s { - void** start; /**> List start */ - size_t size; /**> The list size */ - girara_free_function_t free; /**> The free function **/ - girara_compare_function_t cmp; /**> The sort function */ -}; - -struct girara_list_iterator_s { - girara_list_t* list; /**> The list */ - size_t index; /**> The list index */ -}; - -girara_list_t* girara_list_new(void) { - return g_try_malloc0(sizeof(girara_list_t)); -} - -girara_list_t* girara_list_new_with_free(girara_free_function_t gfree) { - girara_list_t* list = g_try_malloc0(sizeof(girara_list_t)); - if (list == NULL) { - return NULL; - } - - list->free = gfree; - return list; -} - -girara_list_t* girara_sorted_list_new(girara_compare_function_t cmp) { - girara_list_t* list = g_try_malloc0(sizeof(girara_list_t)); - if (list == NULL) { - return NULL; - } - - list->cmp = cmp; - return list; -} - -girara_list_t* girara_sorted_list_new_with_free(girara_compare_function_t cmp, girara_free_function_t gfree) { - girara_list_t* list = g_try_malloc0(sizeof(girara_list_t)); - if (list == NULL) { - return NULL; - } - - list->free = gfree; - list->cmp = cmp; - return list; -} - -void girara_list_set_free_function(girara_list_t* list, girara_free_function_t gfree) { - g_return_if_fail(list != NULL); - list->free = gfree; -} - -void girara_list_clear(girara_list_t* list) { - if (list == NULL) { - return; - } - - if (list->free) { - for (size_t idx = 0; idx != list->size; ++idx) { - list->free(list->start[idx]); - } - } - g_free(list->start); - list->start = NULL; - list->size = 0; -} - -void girara_list_free(girara_list_t* list) { - if (list == NULL) { - return; - } - - girara_list_clear(list); - g_free(list); -} - -void girara_list_append(girara_list_t* list, void* data) { - g_return_if_fail(list != NULL); - - void** new_start = g_realloc_n(list->start, list->size + 1, sizeof(void*)); - g_return_if_fail(new_start != NULL); - - list->start = new_start; - list->start[list->size++] = data; - if (list->cmp != NULL) { - girara_list_sort(list, list->cmp); - } -} - -void girara_list_prepend(girara_list_t* list, void* data) { - g_return_if_fail(list != NULL); - - if (list->cmp != NULL) { - girara_list_append(list, data); - } else { - list->start = g_realloc_n(list->start, list->size + 1, sizeof(void*)); - memmove(list->start + 1, list->start, list->size * sizeof(void*)); - list->start[0] = data; - ++list->size; - } -} - -void girara_list_remove(girara_list_t* list, void* data) { - g_return_if_fail(list != NULL); - - ssize_t pos = girara_list_position(list, data); - if (pos == -1) { - return; - } - - if (list->free) { - list->free(list->start[pos]); - } - memmove(list->start + pos, list->start + pos + 1, (list->size - pos - 1) * sizeof(void*)); - --list->size; -} - -void* girara_list_nth(girara_list_t* list, size_t n) { - g_return_val_if_fail(list != NULL, NULL); - g_return_val_if_fail(n < list->size, NULL); - - return list->start[n]; -} - -void girara_list_set_nth(girara_list_t* list, size_t n, void* data) { - g_return_if_fail(list != NULL); - g_return_if_fail(n < list->size); - g_return_if_fail(list->cmp == NULL); - - if (list->free != NULL) { - (*list->free)(list->start[n]); - } - - list->start[n] = data; -} - -bool girara_list_contains(girara_list_t* list, void* data) { - g_return_val_if_fail(list != NULL, false); - for (size_t idx = 0; idx != list->size; ++idx) { - if (list->start[idx] == data) { - return true; - } - } - return false; -} - -void* girara_list_find(const girara_list_t* list, girara_compare_function_t compare, const void* data) { - g_return_val_if_fail(list != NULL && compare != NULL, NULL); - - for (size_t idx = 0; idx != list->size; ++idx) { - if (compare(list->start[idx], data) == 0) { - return list->start[idx]; - } - } - - return NULL; -} - -girara_list_iterator_t* girara_list_iterator(girara_list_t* list) { - g_return_val_if_fail(list != NULL, NULL); - - if (list->size == 0) { - return NULL; - } - - girara_list_iterator_t* iter = g_try_malloc0(sizeof(girara_list_iterator_t)); - if (iter == NULL) { - return NULL; - } - - iter->list = list; - return iter; -} - -girara_list_iterator_t* girara_list_iterator_copy(girara_list_iterator_t* iter) { - g_return_val_if_fail(iter != NULL, NULL); - - return g_memdup2(iter, sizeof(girara_list_iterator_t)); -} - -girara_list_iterator_t* girara_list_iterator_next(girara_list_iterator_t* iter) { - if (girara_list_iterator_is_valid(iter) == false) { - return NULL; - } - - ++iter->index; - if (iter->index < iter->list->size) { - return iter; - } - return NULL; -} - -bool girara_list_iterator_has_next(girara_list_iterator_t* iter) { - if (girara_list_iterator_is_valid(iter) == false) { - return false; - } - - return iter->index + 1 < iter->list->size; -} - -girara_list_iterator_t* girara_list_iterator_previous(girara_list_iterator_t* iter) { - if (girara_list_iterator_is_valid(iter) == false) { - return NULL; - } - - if (iter->index == 0) { - iter->index = iter->list->size; - return NULL; - } - --iter->index; - return iter; -} - -bool girara_list_iterator_has_previous(girara_list_iterator_t* iter) { - if (girara_list_iterator_is_valid(iter) == false || iter->index == 0) { - return false; - } - - return true; -} - -void girara_list_iterator_remove(girara_list_iterator_t* iter) { - if (girara_list_iterator_is_valid(iter) == false) { - return; - } - - if (iter->list->free) { - iter->list->free(iter->list->start[iter->index]); - } - memmove(iter->list->start + iter->index, iter->list->start + iter->index + 1, - (iter->list->size - iter->index - 1) * sizeof(void*)); - --iter->list->size; -} - -bool girara_list_iterator_is_valid(girara_list_iterator_t* iter) { - return iter != NULL && iter->list != NULL && iter->index < iter->list->size; -} - -void* girara_list_iterator_data(girara_list_iterator_t* iter) { - g_return_val_if_fail(girara_list_iterator_is_valid(iter), NULL); - return girara_list_nth(iter->list, iter->index); -} - -void girara_list_iterator_set(girara_list_iterator_t* iter, void* data) { - g_return_if_fail(girara_list_iterator_is_valid(iter)); - g_return_if_fail(iter->list->cmp == NULL); - - girara_list_set_nth(iter->list, iter->index, data); -} - -void girara_list_iterator_free(girara_list_iterator_t* iter) { - g_free(iter); -} - -size_t girara_list_size(girara_list_t* list) { - g_return_val_if_fail(list != NULL, 0); - return list->size; -} - -ssize_t girara_list_position(girara_list_t* list, void* data) { - g_return_val_if_fail(list != NULL, -1); - - for (size_t idx = 0; idx != list->size; ++idx) { - if (list->start[idx] == data) { - return idx; - } - } - return -1; -} - -typedef struct { - girara_compare_function_t compare; -} comparer_t; - -static int comparer(const void* p1, const void* p2, void* data) { - comparer_t* compare = data; - return compare->compare(*(const void**)p1, *(const void**)p2); -} - -void girara_list_sort(girara_list_t* list, girara_compare_function_t compare) { - g_return_if_fail(list != NULL); - if (list->start == NULL || compare == NULL) { - return; - } - - comparer_t comp = {compare}; -#if GLIB_CHECK_VERSION(2, 81, 1) - g_sort_array(list->start, list->size, sizeof(void*), comparer, &comp); -#else - g_qsort_with_data(list->start, list->size, sizeof(void*), comparer, &comp); -#endif -} - -void girara_list_foreach(girara_list_t* list, girara_list_callback_t callback, void* data) { - g_return_if_fail(list != NULL && callback != NULL); - if (list->start == NULL) { - return; - } - - for (size_t idx = 0; idx != list->size; ++idx) { - callback(list->start[idx], data); - } -} - -static void list_append(void* data, void* userdata) { - girara_list_t* list = userdata; - girara_list_append(list, data); -} - -girara_list_t* girara_list_merge(girara_list_t* list, girara_list_t* other) { - g_return_val_if_fail(list != NULL, NULL); - if (other == NULL) { - return list; - } - - if (list->free != other->free) { - girara_warning("girara_list_merge: merging lists with different free functions!"); - } - other->free = NULL; - - girara_list_foreach(other, list_append, list); - return list; -} - -girara_tree_node_t* girara_node_new(void* data) { - girara_tree_node_t* node = g_try_malloc0(sizeof(girara_tree_node_t)); - if (node == NULL) { - return NULL; - } - - girara_tree_node_data_t* nodedata = g_try_malloc0(sizeof(girara_tree_node_data_t)); - if (nodedata == NULL) { - g_free(node); - return NULL; - } - - nodedata->data = data; - nodedata->node = node; - node->node = g_node_new(nodedata); - - if (node->node == NULL) { - g_free(nodedata); - g_free(node); - return NULL; - } - - return node; -} - -void girara_node_set_free_function(girara_tree_node_t* node, girara_free_function_t gfree) { - g_return_if_fail(node); - node->free = gfree; -} - -void girara_node_free(girara_tree_node_t* node) { - if (node == NULL) { - return; - } - - g_return_if_fail(node->node); - girara_tree_node_data_t* nodedata = node->node->data; - g_return_if_fail(nodedata); - - if (node->free != NULL) { - (*node->free)(nodedata->data); - } - - g_free(nodedata); - - GNode* childnode = node->node->children; - while (childnode != NULL) { - GNode* nextnode = childnode->next; - girara_tree_node_data_t* childnodedata = childnode->data; - girara_node_free(childnodedata->node); - childnode = nextnode; - } - - g_node_destroy(node->node); - g_free(node); -} - -void girara_node_append(girara_tree_node_t* parent, girara_tree_node_t* child) { - g_return_if_fail(parent && child); - g_node_append(parent->node, child->node); -} - -girara_tree_node_t* girara_node_append_data(girara_tree_node_t* parent, void* data) { - g_return_val_if_fail(parent, NULL); - girara_tree_node_t* child = girara_node_new(data); - g_return_val_if_fail(child, NULL); - child->free = parent->free; - girara_node_append(parent, child); - - return child; -} - -girara_tree_node_t* girara_node_get_parent(girara_tree_node_t* node) { - g_return_val_if_fail(node && node->node, NULL); - - if (node->node->parent == NULL) { - return NULL; - } - - girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*)node->node->parent->data; - g_return_val_if_fail(nodedata, NULL); - - return nodedata->node; -} - -girara_tree_node_t* girara_node_get_root(girara_tree_node_t* node) { - g_return_val_if_fail(node && node->node, NULL); - - if (node->node->parent == NULL) { - return node; - } - - GNode* root = g_node_get_root(node->node); - g_return_val_if_fail(root, NULL); - girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*)root->data; - g_return_val_if_fail(nodedata, NULL); - - return nodedata->node; -} - -girara_list_t* girara_node_get_children(girara_tree_node_t* node) { - g_return_val_if_fail(node, NULL); - girara_list_t* list = girara_list_new(); - g_return_val_if_fail(list, NULL); - - GNode* childnode = node->node->children; - while (childnode != NULL) { - girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*)childnode->data; - girara_list_append(list, nodedata->node); - childnode = childnode->next; - } - - return list; -} - -size_t girara_node_get_num_children(girara_tree_node_t* node) { - g_return_val_if_fail(node && node->node, 0); - - return g_node_n_children(node->node); -} - -void* girara_node_get_data(girara_tree_node_t* node) { - g_return_val_if_fail(node && node->node, NULL); - girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*)node->node->data; - g_return_val_if_fail(nodedata, NULL); - - return nodedata->data; -} - -void girara_node_set_data(girara_tree_node_t* node, void* data) { - g_return_if_fail(node && node->node); - girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*)node->node->data; - g_return_if_fail(nodedata); - - if (node->free != NULL) { - (*node->free)(nodedata->data); - } - - nodedata->data = data; -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/input-history.c new/girara-2026.07.07/girara/input-history.c --- old/girara-2026.02.04/girara/input-history.c 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/girara/input-history.c 2026-07-07 21:44:56.000000000 +0200 @@ -4,7 +4,6 @@ #include "datastructures.h" #include "internal.h" -#include "utils.h" /** * Private data of the input history @@ -63,7 +62,7 @@ /* Object init */ static void girara_input_history_init(GiraraInputHistory* history) { GiraraInputHistoryPrivate* priv = girara_input_history_get_instance_private(history); - priv->history = girara_list_new_with_free((girara_free_function_t)g_free); + priv->history = girara_list_new_with_free(g_free); priv->reset = true; priv->io = NULL; } @@ -141,7 +140,7 @@ } void* data = NULL; - while ((data = girara_list_find(list, list_strcmp, data)) != NULL) { + while ((data = girara_list_find(list, list_strcmp, input)) != NULL) { girara_list_remove(list, data); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/log.c new/girara-2026.07.07/girara/log.c --- old/girara-2026.02.04/girara/log.c 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/girara/log.c 2026-07-07 21:44:56.000000000 +0200 @@ -46,3 +46,17 @@ void girara_set_log_level(girara_log_level_t level) { log_level = level; } + +void girara_set_log_level_from_string(const char* loglevel) { + if (loglevel == NULL || g_strcmp0(loglevel, "info") == 0) { + girara_set_log_level(GIRARA_INFO); + } else if (g_strcmp0(loglevel, "warning") == 0) { + girara_set_log_level(GIRARA_WARNING); + } else if (g_strcmp0(loglevel, "error") == 0) { + girara_set_log_level(GIRARA_ERROR); + } else if (g_strcmp0(loglevel, "debug") == 0) { + girara_set_log_level(GIRARA_DEBUG); + } else { + girara_error("Invalid log level: %s", loglevel); + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/log.h new/girara-2026.07.07/girara/log.h --- old/girara-2026.02.04/girara/log.h 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/girara/log.h 2026-07-07 21:44:56.000000000 +0200 @@ -75,4 +75,10 @@ */ void girara_set_log_level(girara_log_level_t level) GIRARA_VISIBLE; +/** + * Set the log level. + * @param level String representation of the log level, i.e., "info", "debug", "warning", or "error". + */ +void girara_set_log_level_from_string(const char* loglevel) GIRARA_VISIBLE; + #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/utils.c new/girara-2026.07.07/girara/utils.c --- old/girara-2026.02.04/girara/utils.c 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/girara/utils.c 2026-07-07 21:44:56.000000000 +0200 @@ -1,10 +1,11 @@ /* SPDX-License-Identifier: Zlib */ +#include "utils.h" + #include <ctype.h> #include <glib.h> #include <glib/gstdio.h> #include <gio/gio.h> -#include <limits.h> #include <pwd.h> #include <stdint.h> #include <stdlib.h> @@ -12,7 +13,6 @@ #include <sys/types.h> #include <unistd.h> -#include "utils.h" #include "datastructures.h" #include "internal.h" #include "log.h" @@ -65,12 +65,12 @@ bool res = g_spawn_async(working_directory, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error); if (error != NULL) { girara_warning("Failed to execute 'xdg-open %s': %s", uri, error->message); - error = NULL; + g_clear_error(&error); } if (res == false) { /* fall back to `gio open` */ - char* current_dir = working_directory != NULL ? g_get_current_dir() : NULL; + g_autofree char* current_dir = working_directory != NULL ? g_get_current_dir() : NULL; if (working_directory != NULL) { g_chdir(working_directory); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/utils.h new/girara-2026.07.07/girara/utils.h --- old/girara-2026.02.04/girara/utils.h 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/girara/utils.h 2026-07-07 21:44:56.000000000 +0200 @@ -3,7 +3,7 @@ #ifndef GIRARA_UTILS_H #define GIRARA_UTILS_H -#include <stdio.h> +#include <stdbool.h> #include "macros.h" #include "types.h" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/girara/version.h.in new/girara-2026.07.07/girara/version.h.in --- old/girara-2026.02.04/girara/version.h.in 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/girara/version.h.in 2026-07-07 21:44:56.000000000 +0200 @@ -7,7 +7,7 @@ #define GIRARA_VERSION_MAJOR @GVMAJOR@ #define GIRARA_VERSION_MINOR @GVMINOR@ #define GIRARA_VERSION_REV @GVREV@ -#define GIRARA_VERSION "@GVMAJOR@.@GVMINOR@.@GVREV@" +#define GIRARA_VERSION "@version@" /* clang-format on */ #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/meson.build new/girara-2026.07.07/meson.build --- old/girara-2026.02.04/meson.build 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/meson.build 2026-07-07 21:44:56.000000000 +0200 @@ -1,7 +1,9 @@ -project('girara', 'c', - version: '2026.02.04', +project( + 'girara', + 'c', + version: '2026.07.07', meson_version: '>=1.5', - default_options: ['c_std=c17', 'warning_level=3'], + default_options: ['c_std=c23', 'warning_level=3'], ) version = meson.project_version() @@ -26,12 +28,14 @@ cc = meson.get_compiler('c') -prefix = get_option('prefix') - # required attributes -cc.compiles('''#if !__has_attribute(cleanup) +cc.compiles( + '''#if !__has_attribute(cleanup) #error attribute cleanup not supported -#endif''', name: '__attribute__(cleanup)', required: true) +#endif''', + name: '__attribute__(cleanup)', + required: true, +) # required dependencies libm = cc.find_library('m', required: false) @@ -43,7 +47,10 @@ pc_requires = ['glib-2.0', 'gobject-2.0', 'gio-2.0'] # supported functions -has_getpwnam_r = cc.has_function('getpwnam_r', prefix: '#define _DEFAULT_SOURCE\n#include <sys/types.h>\n#include <pwd.h>') +has_getpwnam_r = cc.has_function( + 'getpwnam_r', + prefix: '#define _DEFAULT_SOURCE\n#include <sys/types.h>\n#include <pwd.h>', +) # defines defines = [ @@ -60,7 +67,7 @@ '-Werror=implicit-function-declaration', '-Werror=vla', '-Werror=int-conversion', - '-Werror=maybe-uninitialized' + '-Werror=maybe-uninitialized', ] flags = cc.get_supported_arguments(flags) @@ -68,20 +75,19 @@ version_header = configure_file( input: 'girara/version.h.in', output: 'girara-version.h', - configuration: conf_data + configuration: conf_data, ) -include_directories = [ - include_directories('.') -] +include_directories = [include_directories('.')] # source files sources = files( - 'girara/datastructures.c', + 'girara/datastructures-list.c', + 'girara/datastructures-node.c', 'girara/input-history-io.c', 'girara/input-history.c', 'girara/log.c', 'girara/template.c', - 'girara/utils.c' + 'girara/utils.c', ) # header files to install @@ -93,7 +99,7 @@ 'girara/macros.h', 'girara/template.h', 'girara/types.h', - 'girara/utils.h' + 'girara/utils.h', ) headers += version_header @@ -106,7 +112,7 @@ install: true, include_directories: include_directories, c_args: defines + flags, - gnu_symbol_visibility: 'hidden' + gnu_symbol_visibility: 'hidden', ) install_headers(headers, subdir: 'girara') @@ -125,4 +131,4 @@ meson.override_dependency('girara', girara_dependency) subdir('doc') -subdir('tests') +subdir('tests') \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/meson_options.txt new/girara-2026.07.07/meson_options.txt --- old/girara-2026.02.04/meson_options.txt 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/meson_options.txt 2026-07-07 21:44:56.000000000 +0200 @@ -3,8 +3,3 @@ value: 'auto', description: 'doxygen API documentation' ) -option('tests', - type: 'feature', - value: 'auto', - description: 'run tests' -) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/girara-2026.02.04/tests/meson.build new/girara-2026.07.07/tests/meson.build --- old/girara-2026.02.04/tests/meson.build 2026-02-03 23:32:21.000000000 +0100 +++ new/girara-2026.07.07/tests/meson.build 2026-07-07 21:44:56.000000000 +0200 @@ -1,56 +1,63 @@ -if get_option('tests').allowed() - test_dependencies = [ - declare_dependency(link_with: girara), - ] +test_dependencies = [ + declare_dependency(link_with: girara), +] - include_directories += [ include_directories('../girara') ] +include_directories += [include_directories('../girara')] - xdg_test_helper = executable('xdg_test_helper', 'xdg_test_helper.c', - dependencies: [ glib, declare_dependency(link_with: girara) ], - include_directories: include_directories, - c_args: defines + flags - ) +datastructures = executable( + 'test_datastructures', + files('test_datastructures.c'), + dependencies: build_dependencies + test_dependencies, + include_directories: include_directories, + c_args: defines + flags, +) +test('datastructures', datastructures, timeout: 60 * 60, protocol: 'tap') - datastructures = executable('test_datastructures', files('test_datastructures.c'), - dependencies: build_dependencies + test_dependencies, - include_directories: include_directories, - c_args: defines + flags - ) - test('datastructures', datastructures, - timeout: 60*60, - protocol: 'tap', - env: [ - 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), - 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()) - ] - ) +template = executable( + 'test_template', + files('test_template.c'), + dependencies: build_dependencies + test_dependencies, + include_directories: include_directories, + c_args: defines + flags, +) +test('template', template, timeout: 60 * 60, protocol: 'tap') - template = executable('test_template', files('test_template.c'), - dependencies: build_dependencies + test_dependencies, +envp = find_program('env', required: false) +if envp.found() + env = environment() + env.set('G_TEST_SRCDIR', meson.current_source_dir()) + env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + env.set('HOME', 'HOME=/home/test') + + xdg_test_helper = executable( + 'xdg_test_helper', + 'xdg_test_helper.c', + dependencies: [glib, declare_dependency(link_with: girara)], include_directories: include_directories, - c_args: defines + flags - ) - test('template', template, - timeout: 60*60, - protocol: 'tap', - env: [ - 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), - 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()) - ] + c_args: defines + flags, ) - utils = executable('test_utils', files('test_utils.c'), + utils = executable( + 'test_utils', + files('test_utils.c'), dependencies: build_dependencies + test_dependencies, include_directories: include_directories, - c_args: defines + flags + c_args: defines + flags, ) - test('utils-with-home', utils, - timeout: 60*60, + + test( + 'utils-with-home', + envp, + args: [ + '-uXDG_CONFIG_HOME', + '-uXDG_DATA_HOME', + '-uXDG_CONFIG_DIRS', + '-uXDG_DATA_DIRS', + '-uXDG_CACHE_HOME', utils, + ], + timeout: 60 * 60, protocol: 'tap', - env: [ - 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), - 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), - 'HOME=/home/test' - ] + env: env, + depends: xdg_test_helper, ) -endif +endif \ No newline at end of file
