]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-settings: Fix settings history when plugins have registered settings
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sun, 5 Oct 2025 17:23:16 +0000 (20:23 +0300)
committermarkus.valentin <markus.valentin@open-xchange.com>
Mon, 13 Oct 2025 09:54:28 +0000 (11:54 +0200)
The settings are expected to be sorted by the version number.

src/lib-settings/settings-history.c
src/lib-settings/settings-history.h

index e3d50ea64f43c993d113834cfb5c23502d5bb205..428f496c92a4e75764775de07e3d48764c75b5b7 100644 (file)
@@ -2,19 +2,34 @@
 
 #include "lib.h"
 #include "array.h"
+#include "version.h"
 #include "settings-history.h"
 
 #include "settings-history-core.h"
 
 static struct settings_history history;
 
+static int
+settings_history_default_cmp(const struct setting_history_default *d1,
+                            const struct setting_history_default *d2)
+{
+       return version_cmp(d1->version, d2->version);
+}
+
+static int
+settings_history_rename_cmp(const struct setting_history_rename *r1,
+                           const struct setting_history_rename *r2)
+{
+       return version_cmp(r1->version, r2->version);
+}
+
 static void settings_history_free(void)
 {
        array_free(&history.defaults);
        array_free(&history.renames);
 }
 
-struct settings_history *settings_history_get(void)
+static struct settings_history *settings_history_get_unsorted(void)
 {
        if (array_is_created(&history.defaults))
                return &history;
@@ -34,18 +49,33 @@ struct settings_history *settings_history_get(void)
        return &history;
 }
 
+struct settings_history *settings_history_get(void)
+{
+       struct settings_history *history = settings_history_get_unsorted();
+       if (history->sort_pending) {
+               array_sort(&history->defaults,
+                          settings_history_default_cmp);
+               array_sort(&history->renames,
+                          settings_history_rename_cmp);
+               history->sort_pending = FALSE;
+       }
+       return history;
+}
+
 void settings_history_register_defaults(
        const struct setting_history_default *defaults, unsigned int count)
 {
-       struct settings_history *history = settings_history_get();
+       struct settings_history *history = settings_history_get_unsorted();
 
        array_append(&history->defaults, defaults, count);
+       history->sort_pending = TRUE;
 }
 
 void settings_history_register_renames(
        const struct setting_history_rename *renames, unsigned int count)
 {
-       struct settings_history *history = settings_history_get();
+       struct settings_history *history = settings_history_get_unsorted();
 
        array_append(&history->renames, renames, count);
+       history->sort_pending = TRUE;
 }
index 5379387bd24fdc69c6c14031a8dbc372f50df4ef..e3b2a9a8b5074960ab9358e4f038008b6894edbd 100644 (file)
@@ -15,6 +15,7 @@ struct setting_history_rename {
 struct settings_history {
        ARRAY(struct setting_history_default) defaults;
        ARRAY(struct setting_history_rename) renames;
+       bool sort_pending;
 };
 
 struct settings_history *settings_history_get(void);