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

Reply via email to