diff options
author | Guillaume Girol <symphorien+git@xlumurb.eu> | 2022-10-13 12:00:00 +0000 |
---|---|---|
committer | Guillaume Girol <symphorien+git@xlumurb.eu> | 2022-11-11 13:30:00 +0100 |
commit | e094494915761e7b4e6de47f5b9c87a301edb974 (patch) | |
tree | c69a625242a5140baa5bb40e400775c41174cff7 | |
parent | 0533be43f1ce89c51ce9720386258ea5c19fcb1d (diff) |
glib: add an update script combinator to patch gsettings schema paths
and use it in evolution-data-server and evolution-ews as a proof of concept
-rw-r--r-- | pkgs/applications/networking/mailreaders/evolution/evolution-ews/default.nix | 36 | ||||
-rw-r--r-- | pkgs/applications/networking/mailreaders/evolution/evolution-ews/hardcode-gsettings.patch | 72 | ||||
-rw-r--r-- | pkgs/desktops/gnome/core/evolution-data-server/default.nix | 41 | ||||
-rw-r--r-- | pkgs/desktops/gnome/core/evolution-data-server/hardcode-gsettings.patch | 92 | ||||
-rw-r--r-- | pkgs/development/libraries/glib/default.nix | 51 | ||||
-rw-r--r-- | pkgs/development/libraries/glib/hardcode-gsettings.cocci (renamed from pkgs/desktops/gnome/core/evolution-data-server/hardcode-gsettings.cocci) | 25 |
6 files changed, 225 insertions, 92 deletions
diff --git a/pkgs/applications/networking/mailreaders/evolution/evolution-ews/default.nix b/pkgs/applications/networking/mailreaders/evolution/evolution-ews/default.nix index af1781f3af748..51e1c2e52c87d 100644 --- a/pkgs/applications/networking/mailreaders/evolution/evolution-ews/default.nix +++ b/pkgs/applications/networking/mailreaders/evolution/evolution-ews/default.nix @@ -14,6 +14,9 @@ , json-glib , libmspack , webkitgtk_4_1 +, substituteAll +, _experimental-update-script-combinators +, glib }: stdenv.mkDerivation rec { @@ -25,6 +28,17 @@ stdenv.mkDerivation rec { sha256 = "p5Jp7wnoqAuo8My8ZDMl0rsFc0158G8x8lAehWfLjb0="; }; + patches = [ + # evolution-ews contains .so files loaded by evolution-data-server refering + # schemas from evolution. evolution-data-server is not wrapped with + # evolution's schemas because it would be a circular dependency with + # evolution. + (substituteAll { + src = ./hardcode-gsettings.patch; + evo = glib.makeSchemaPath evolution evolution.name; + }) + ]; + nativeBuildInputs = [ cmake gettext @@ -50,10 +64,26 @@ stdenv.mkDerivation rec { ]; passthru = { - updateScript = gnome.updateScript { - packageName = "evolution-ews"; - versionPolicy = "odd-unstable"; + hardcodeGsettingsPatch = glib.mkHardcodeGsettingsPatch { + inherit src; + glib-schema-to-var = { + "org.gnome.evolution.mail" = "evo"; + "org.gnome.evolution.calendar" = "evo"; + }; }; + + updateScript = + let + updateSource = gnome.updateScript { + packageName = "evolution-ews"; + versionPolicy = "odd-unstable"; + }; + updatePatch = _experimental-update-script-combinators.copyAttrOutputToFile "evolution-ews.hardcodeGsettingsPatch" ./hardcode-gsettings.patch; + in + _experimental-update-script-combinators.sequence [ + updateSource + updatePatch + ]; }; meta = with lib; { diff --git a/pkgs/applications/networking/mailreaders/evolution/evolution-ews/hardcode-gsettings.patch b/pkgs/applications/networking/mailreaders/evolution/evolution-ews/hardcode-gsettings.patch new file mode 100644 index 0000000000000..c5fb77fc2a510 --- /dev/null +++ b/pkgs/applications/networking/mailreaders/evolution/evolution-ews/hardcode-gsettings.patch @@ -0,0 +1,72 @@ +diff --git a/src/EWS/camel/camel-ews-utils.c b/src/EWS/camel/camel-ews-utils.c +index 0707f72..1e71954 100644 +--- a/src/EWS/camel/camel-ews-utils.c ++++ b/src/EWS/camel/camel-ews-utils.c +@@ -1552,7 +1552,18 @@ ews_utils_save_category_changes (GHashTable *old_categories, /* gchar *guid ~> C + + evo_labels = g_ptr_array_new_full (5, g_free); + +- settings = g_settings_new ("org.gnome.evolution.mail"); ++ { ++ g_autoptr(GSettingsSchemaSource) schema_source; ++ g_autoptr(GSettingsSchema) schema; ++ schema_source = g_settings_schema_source_new_from_directory("@evo@", ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, ++ "org.gnome.evolution.mail", ++ FALSE); ++ settings = g_settings_new_full(schema, NULL, NULL); ++ } + strv = g_settings_get_strv (settings, "labels"); + + for (ii = 0; strv && strv[ii]; ii++) { +diff --git a/src/EWS/common/e-ews-calendar-utils.c b/src/EWS/common/e-ews-calendar-utils.c +index 6deda60..9b44cc7 100644 +--- a/src/EWS/common/e-ews-calendar-utils.c ++++ b/src/EWS/common/e-ews-calendar-utils.c +@@ -413,7 +413,18 @@ ews_get_configured_icaltimezone (void) + gchar *location; + ICalTimezone *zone = NULL; + +- settings = g_settings_new ("org.gnome.evolution.calendar"); ++ { ++ g_autoptr(GSettingsSchemaSource) schema_source; ++ g_autoptr(GSettingsSchema) schema; ++ schema_source = g_settings_schema_source_new_from_directory("@evo@", ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, ++ "org.gnome.evolution.calendar", ++ FALSE); ++ settings = g_settings_new_full(schema, NULL, NULL); ++ } + location = g_settings_get_string (settings, "timezone"); + if (location) { + zone = i_cal_timezone_get_builtin_timezone (location); +diff --git a/src/Microsoft365/camel/camel-m365-store.c b/src/Microsoft365/camel/camel-m365-store.c +index ff1b8e3..4f876c0 100644 +--- a/src/Microsoft365/camel/camel-m365-store.c ++++ b/src/Microsoft365/camel/camel-m365-store.c +@@ -309,7 +309,18 @@ m365_store_save_category_changes (GHashTable *old_categories, /* gchar *id ~> Ca + + evo_labels = g_ptr_array_new_full (5, g_free); + +- settings = g_settings_new ("org.gnome.evolution.mail"); ++ { ++ g_autoptr(GSettingsSchemaSource) schema_source; ++ g_autoptr(GSettingsSchema) schema; ++ schema_source = g_settings_schema_source_new_from_directory("@evo@", ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, ++ "org.gnome.evolution.mail", ++ FALSE); ++ settings = g_settings_new_full(schema, NULL, NULL); ++ } + strv = g_settings_get_strv (settings, "labels"); + + for (ii = 0; strv && strv[ii]; ii++) { diff --git a/pkgs/desktops/gnome/core/evolution-data-server/default.nix b/pkgs/desktops/gnome/core/evolution-data-server/default.nix index 0f643e1743260..726333d1f7477 100644 --- a/pkgs/desktops/gnome/core/evolution-data-server/default.nix +++ b/pkgs/desktops/gnome/core/evolution-data-server/default.nix @@ -2,9 +2,6 @@ , lib , fetchurl , substituteAll -, runCommand -, git -, coccinelle , pkg-config , gnome , _experimental-update-script-combinators @@ -70,7 +67,7 @@ stdenv.mkDerivation rec { prePatch = '' substitute ${./hardcode-gsettings.patch} hardcode-gsettings.patch \ - --subst-var-by EDS_GSETTINGS_PATH ${glib.makeSchemaPath "$out" "${pname}-${version}"} + --subst-var-by EDS ${glib.makeSchemaPath "$out" "${pname}-${version}"} patches="$patches $PWD/hardcode-gsettings.patch" ''; @@ -153,40 +150,28 @@ stdenv.mkDerivation rec { ''; passthru = { - # In order for GNOME not to depend on OCaml through Coccinelle, - # we materialize the SmPL patch into a unified diff-style patch. - hardcodeGsettingsPatch = - runCommand - "hardcode-gsettings.patch" - { - inherit src; - nativeBuildInputs = [ - git - coccinelle - python3 # For patch script - ]; - } - '' - unpackPhase - cd "''${sourceRoot:-.}" - git init - git add -A - spatch --sp-file "${./hardcode-gsettings.cocci}" --dir . --in-place - git diff > "$out" - ''; + hardcodeGsettingsPatch = glib.mkHardcodeGsettingsPatch { + glib-schema-to-var = { + "org.gnome.Evolution.DefaultSources" = "EDS"; + "org.gnome.evolution.shell.network-config" = "EDS"; + "org.gnome.evolution-data-server.addressbook" = "EDS"; + "org.gnome.evolution-data-server.calendar" = "EDS"; + "org.gnome.evolution-data-server" = "EDS"; + }; + inherit src; + }; updateScript = let updateSource = gnome.updateScript { packageName = "evolution-data-server"; versionPolicy = "odd-unstable"; }; - - updateGsettingsPatch = _experimental-update-script-combinators.copyAttrOutputToFile "evolution-data-server.hardcodeGsettingsPatch" ./hardcode-gsettings.patch; + updatePatch = _experimental-update-script-combinators.copyAttrOutputToFile "evolution-data-server.hardcodeGsettingsPatch" ./hardcode-gsettings.patch; in _experimental-update-script-combinators.sequence [ updateSource - updateGsettingsPatch + updatePatch ]; }; diff --git a/pkgs/desktops/gnome/core/evolution-data-server/hardcode-gsettings.patch b/pkgs/desktops/gnome/core/evolution-data-server/hardcode-gsettings.patch index 0ad35d4742d21..20a94cc707915 100644 --- a/pkgs/desktops/gnome/core/evolution-data-server/hardcode-gsettings.patch +++ b/pkgs/desktops/gnome/core/evolution-data-server/hardcode-gsettings.patch @@ -1,5 +1,5 @@ diff --git a/src/addressbook/libebook/e-book-client.c b/src/addressbook/libebook/e-book-client.c -index 7888e69..c3b695c 100644 +index 7888e69..27215e4 100644 --- a/src/addressbook/libebook/e-book-client.c +++ b/src/addressbook/libebook/e-book-client.c @@ -1983,7 +1983,18 @@ e_book_client_get_self (ESourceRegistry *registry, @@ -10,7 +10,7 @@ index 7888e69..c3b695c 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -30,7 +30,7 @@ index 7888e69..c3b695c 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -51,7 +51,7 @@ index 7888e69..c3b695c 100644 + if (!settings) { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -64,7 +64,7 @@ index 7888e69..c3b695c 100644 g_mutex_unlock (&mutex); diff --git a/src/addressbook/libebook/e-book.c b/src/addressbook/libebook/e-book.c -index 8dfff6d..cd88392 100644 +index 8dfff6d..fb4434b 100644 --- a/src/addressbook/libebook/e-book.c +++ b/src/addressbook/libebook/e-book.c @@ -2587,7 +2587,18 @@ e_book_get_self (ESourceRegistry *registry, @@ -75,7 +75,7 @@ index 8dfff6d..cd88392 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -95,7 +95,7 @@ index 8dfff6d..cd88392 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -115,7 +115,7 @@ index 8dfff6d..cd88392 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -128,7 +128,7 @@ index 8dfff6d..cd88392 100644 g_object_unref (settings); diff --git a/src/addressbook/libedata-book/e-book-meta-backend.c b/src/addressbook/libedata-book/e-book-meta-backend.c -index d3f130e..9e8edd4 100644 +index d3f130e..bc820e9 100644 --- a/src/addressbook/libedata-book/e-book-meta-backend.c +++ b/src/addressbook/libedata-book/e-book-meta-backend.c @@ -135,7 +135,18 @@ ebmb_is_power_saver_enabled (void) @@ -139,7 +139,7 @@ index d3f130e..9e8edd4 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -152,7 +152,7 @@ index d3f130e..9e8edd4 100644 if (g_settings_get_boolean (settings, "limit-operations-in-power-saver-mode")) { GPowerProfileMonitor *power_monitor; diff --git a/src/calendar/backends/contacts/e-cal-backend-contacts.c b/src/calendar/backends/contacts/e-cal-backend-contacts.c -index 42f3457..faac410 100644 +index 42f3457..b4926af 100644 --- a/src/calendar/backends/contacts/e-cal-backend-contacts.c +++ b/src/calendar/backends/contacts/e-cal-backend-contacts.c @@ -1387,7 +1387,18 @@ e_cal_backend_contacts_init (ECalBackendContacts *cbc) @@ -163,7 +163,7 @@ index 42f3457..faac410 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -176,7 +176,7 @@ index 42f3457..faac410 100644 cbc->priv->update_alarms_id = 0; cbc->priv->alarm_enabled = FALSE; diff --git a/src/calendar/libecal/e-reminder-watcher.c b/src/calendar/libecal/e-reminder-watcher.c -index 52095a4..e839991 100644 +index 52095a4..184b657 100644 --- a/src/calendar/libecal/e-reminder-watcher.c +++ b/src/calendar/libecal/e-reminder-watcher.c @@ -2555,7 +2555,19 @@ e_reminder_watcher_init (EReminderWatcher *watcher) @@ -187,7 +187,7 @@ index 52095a4..e839991 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -201,7 +201,7 @@ index 52095a4..e839991 100644 watcher->priv->default_zone = e_cal_util_copy_timezone (zone); watcher->priv->timers_enabled = TRUE; diff --git a/src/calendar/libedata-cal/e-cal-meta-backend.c b/src/calendar/libedata-cal/e-cal-meta-backend.c -index 94a875f..1f914a9 100644 +index 94a875f..1d2ed92 100644 --- a/src/calendar/libedata-cal/e-cal-meta-backend.c +++ b/src/calendar/libedata-cal/e-cal-meta-backend.c @@ -149,7 +149,18 @@ ecmb_is_power_saver_enabled (void) @@ -212,7 +212,7 @@ index 94a875f..1f914a9 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -225,7 +225,7 @@ index 94a875f..1f914a9 100644 if (g_settings_get_boolean (settings, "limit-operations-in-power-saver-mode")) { GPowerProfileMonitor *power_monitor; diff --git a/src/camel/camel-cipher-context.c b/src/camel/camel-cipher-context.c -index 8013ba7..ba74769 100644 +index 8013ba7..1bba6d1 100644 --- a/src/camel/camel-cipher-context.c +++ b/src/camel/camel-cipher-context.c @@ -1625,7 +1625,18 @@ camel_cipher_can_load_photos (void) @@ -236,7 +236,7 @@ index 8013ba7..ba74769 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -249,7 +249,7 @@ index 8013ba7..ba74769 100644 g_clear_object (&settings); diff --git a/src/camel/camel-gpg-context.c b/src/camel/camel-gpg-context.c -index 205372e..2023704 100644 +index 205372e..f75a88e 100644 --- a/src/camel/camel-gpg-context.c +++ b/src/camel/camel-gpg-context.c @@ -582,7 +582,18 @@ gpg_ctx_get_executable_name (void) @@ -260,7 +260,7 @@ index 205372e..2023704 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -273,7 +273,7 @@ index 205372e..2023704 100644 g_clear_object (&settings); diff --git a/src/camel/camel-utils.c b/src/camel/camel-utils.c -index e61160c..d17871a 100644 +index e61160c..b6553a4 100644 --- a/src/camel/camel-utils.c +++ b/src/camel/camel-utils.c @@ -362,7 +362,19 @@ void @@ -284,7 +284,7 @@ index e61160c..d17871a 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -298,7 +298,7 @@ index e61160c..d17871a 100644 G_CALLBACK (mi_user_headers_settings_changed_cb), NULL); G_UNLOCK (mi_user_headers); diff --git a/src/camel/providers/imapx/camel-imapx-server.c b/src/camel/providers/imapx/camel-imapx-server.c -index e5645e2..170a0be 100644 +index e5645e2..96a1ce3 100644 --- a/src/camel/providers/imapx/camel-imapx-server.c +++ b/src/camel/providers/imapx/camel-imapx-server.c @@ -5573,7 +5573,18 @@ camel_imapx_server_skip_old_flags_update (CamelStore *store) @@ -309,7 +309,7 @@ index e5645e2..170a0be 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -322,7 +322,7 @@ index e5645e2..170a0be 100644 if (g_settings_get_boolean (eds_settings, "limit-operations-in-power-saver-mode")) { GPowerProfileMonitor *power_monitor; diff --git a/src/camel/providers/smtp/camel-smtp-transport.c b/src/camel/providers/smtp/camel-smtp-transport.c -index f535ad6..30130b9 100644 +index f535ad6..918975d 100644 --- a/src/camel/providers/smtp/camel-smtp-transport.c +++ b/src/camel/providers/smtp/camel-smtp-transport.c @@ -1458,7 +1458,18 @@ smtp_helo (CamelSmtpTransport *transport, @@ -333,7 +333,7 @@ index f535ad6..30130b9 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -346,7 +346,7 @@ index f535ad6..30130b9 100644 g_clear_object (&settings); diff --git a/src/libedataserver/e-network-monitor.c b/src/libedataserver/e-network-monitor.c -index 188f276..7c4db94 100644 +index 188f276..939f89b 100644 --- a/src/libedataserver/e-network-monitor.c +++ b/src/libedataserver/e-network-monitor.c @@ -256,7 +256,18 @@ e_network_monitor_constructed (GObject *object) @@ -357,7 +357,7 @@ index 188f276..7c4db94 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -370,7 +370,7 @@ index 188f276..7c4db94 100644 settings, "network-monitor-gio-name", object, "gio-name", diff --git a/src/libedataserver/e-oauth2-service-google.c b/src/libedataserver/e-oauth2-service-google.c -index f215388..3b67126 100644 +index f215388..501222e 100644 --- a/src/libedataserver/e-oauth2-service-google.c +++ b/src/libedataserver/e-oauth2-service-google.c @@ -71,7 +71,18 @@ eos_google_read_settings (EOAuth2Service *service, @@ -381,7 +381,7 @@ index f215388..3b67126 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -394,7 +394,7 @@ index f215388..3b67126 100644 g_object_unref (settings); diff --git a/src/libedataserver/e-oauth2-service-outlook.c b/src/libedataserver/e-oauth2-service-outlook.c -index 9cff0d0..fd95f0b 100644 +index 9cff0d0..4c9a203 100644 --- a/src/libedataserver/e-oauth2-service-outlook.c +++ b/src/libedataserver/e-oauth2-service-outlook.c @@ -71,7 +71,18 @@ eos_outlook_read_settings (EOAuth2Service *service, @@ -405,7 +405,7 @@ index 9cff0d0..fd95f0b 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -418,7 +418,7 @@ index 9cff0d0..fd95f0b 100644 g_object_unref (settings); diff --git a/src/libedataserver/e-oauth2-service-yahoo.c b/src/libedataserver/e-oauth2-service-yahoo.c -index 8e4ee81..bb8f8f7 100644 +index 8e4ee81..cc94026 100644 --- a/src/libedataserver/e-oauth2-service-yahoo.c +++ b/src/libedataserver/e-oauth2-service-yahoo.c @@ -67,7 +67,18 @@ eos_yahoo_read_settings (EOAuth2Service *service, @@ -429,7 +429,7 @@ index 8e4ee81..bb8f8f7 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -442,7 +442,7 @@ index 8e4ee81..bb8f8f7 100644 g_object_unref (settings); diff --git a/src/libedataserver/e-oauth2-service.c b/src/libedataserver/e-oauth2-service.c -index 7783781..6fb22cb 100644 +index 7783781..6a2db01 100644 --- a/src/libedataserver/e-oauth2-service.c +++ b/src/libedataserver/e-oauth2-service.c @@ -90,7 +90,18 @@ eos_default_guess_can_process (EOAuth2Service *service, @@ -453,7 +453,7 @@ index 7783781..6fb22cb 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -466,7 +466,7 @@ index 7783781..6fb22cb 100644 g_object_unref (settings); diff --git a/src/libedataserver/e-source-registry.c b/src/libedataserver/e-source-registry.c -index 6701a3a..6b8ee33 100644 +index 6701a3a..f497263 100644 --- a/src/libedataserver/e-source-registry.c +++ b/src/libedataserver/e-source-registry.c @@ -1764,7 +1764,19 @@ e_source_registry_init (ESourceRegistry *registry) @@ -477,7 +477,7 @@ index 6701a3a..6b8ee33 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -491,7 +491,7 @@ index 6701a3a..6b8ee33 100644 g_signal_connect ( registry->priv->settings, "changed", diff --git a/src/libedataserverui/e-reminders-widget.c b/src/libedataserverui/e-reminders-widget.c -index 14b6481..6dc55bb 100644 +index 14b6481..7149b74 100644 --- a/src/libedataserverui/e-reminders-widget.c +++ b/src/libedataserverui/e-reminders-widget.c @@ -1986,7 +1986,19 @@ static void @@ -502,7 +502,7 @@ index 14b6481..6dc55bb 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -516,7 +516,7 @@ index 14b6481..6dc55bb 100644 reminders->priv->is_empty = TRUE; reminders->priv->is_mapped = FALSE; diff --git a/src/services/evolution-source-registry/evolution-source-registry-autoconfig.c b/src/services/evolution-source-registry/evolution-source-registry-autoconfig.c -index 6f03053..127c92e 100644 +index 6f03053..b5db6b2 100644 --- a/src/services/evolution-source-registry/evolution-source-registry-autoconfig.c +++ b/src/services/evolution-source-registry/evolution-source-registry-autoconfig.c @@ -706,7 +706,18 @@ evolution_source_registry_merge_autoconfig_sources (ESourceRegistryServer *serve @@ -527,7 +527,7 @@ index 6f03053..127c92e 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -540,7 +540,7 @@ index 6f03053..127c92e 100644 autoconfig_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, e_autoconfig_free_merge_source_data); diff --git a/src/services/evolution-source-registry/evolution-source-registry-migrate-proxies.c b/src/services/evolution-source-registry/evolution-source-registry-migrate-proxies.c -index d531cb9..3d8807c 100644 +index d531cb9..c96f1d5 100644 --- a/src/services/evolution-source-registry/evolution-source-registry-migrate-proxies.c +++ b/src/services/evolution-source-registry/evolution-source-registry-migrate-proxies.c @@ -61,7 +61,18 @@ evolution_source_registry_migrate_proxies (ESourceRegistryServer *server) @@ -551,7 +551,7 @@ index d531cb9..3d8807c 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); @@ -564,7 +564,7 @@ index d531cb9..3d8807c 100644 switch (g_settings_get_int (settings, "proxy-type")) { case 1: diff --git a/src/services/evolution-source-registry/evolution-source-registry.c b/src/services/evolution-source-registry/evolution-source-registry.c -index 1c0a113..d26b059 100644 +index 1c0a113..6b41423 100644 --- a/src/services/evolution-source-registry/evolution-source-registry.c +++ b/src/services/evolution-source-registry/evolution-source-registry.c @@ -181,7 +181,18 @@ main (gint argc, @@ -575,7 +575,7 @@ index 1c0a113..d26b059 100644 + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; -+ schema_source = g_settings_schema_source_new_from_directory("@EDS_GSETTINGS_PATH@", ++ schema_source = g_settings_schema_source_new_from_directory("@EDS@", + g_settings_schema_source_get_default(), + TRUE, + NULL); diff --git a/pkgs/development/libraries/glib/default.nix b/pkgs/development/libraries/glib/default.nix index 8e3d1a45dbe1c..b38ba682a76be 100644 --- a/pkgs/development/libraries/glib/default.nix +++ b/pkgs/development/libraries/glib/default.nix @@ -8,6 +8,8 @@ , coreutils, dbus, libxml2, tzdata , desktop-file-utils, shared-mime-info , darwin +# update script +, runCommand, git, coccinelle }: assert stdenv.isLinux -> util-linuxMinimal != null; @@ -246,6 +248,55 @@ stdenv.mkDerivation (finalAttrs: { packageName = "glib"; versionPolicy = "odd-unstable"; }; + /* + can be used as part of an update script to automatically create a patch + hardcoding the path of all gsettings schemas in C code. + For example: + passthru = { + hardcodeGsettingsPatch = glib.mkHardcodeGsettingsPatch { + inherit src; + glib-schema-to-var = { + ... + }; + }; + + updateScript = + let + updateSource = ...; + patch = _experimental-update-script-combinators.copyAttrOutputToFile "evolution-ews.hardcodeGsettingsPatch" ./hardcode-gsettings.patch; + in + _experimental-update-script-combinators.sequence [ + updateSource + patch + ]; + }; + } + takes as input a mapping from schema path to variable name. + For example `{ "org.gnome.evolution" = "EVOLUTION_SCHEMA_PATH"; }` + hardcodes looking for `org.gnome.evolution` into `@EVOLUTION_SCHEMA_PATH@`. + All schemas must be listed. + */ + mkHardcodeGsettingsPatch = { src, glib-schema-to-var }: + runCommand + "hardcode-gsettings.patch" + { + inherit src; + nativeBuildInputs = [ + git + coccinelle + python3 # For patch script + ]; + } + '' + unpackPhase + cd "''${sourceRoot:-.}" + set -x + cp ${builtins.toFile "glib-schema-to-var.json" (builtins.toJSON glib-schema-to-var)} ./glib-schema-to-var.json + git init + git add -A + spatch --sp-file "${./hardcode-gsettings.cocci}" --dir . --in-place + git diff > "$out" + ''; }; meta = with lib; { diff --git a/pkgs/desktops/gnome/core/evolution-data-server/hardcode-gsettings.cocci b/pkgs/development/libraries/glib/hardcode-gsettings.cocci index 8f72e4f5d94b7..bedacf846bc49 100644 --- a/pkgs/desktops/gnome/core/evolution-data-server/hardcode-gsettings.cocci +++ b/pkgs/development/libraries/glib/hardcode-gsettings.cocci @@ -3,10 +3,14 @@ * where GSettings system could look for schemas, we need to point the software to a correct location somehow. * For executables, we handle this using wrappers but this is not an option for libraries like e-d-s. * Instead, we hardcode the schema path when creating the settings. + * A schema path (ie org.gnome.evolution) can be replaced by @EVOLUTION_SCHEMA_PATH@ + * which is then replaced at build time by substituteAll. + * The mapping is provided in a json file ./glib-schema-to-var.json */ @initialize:python@ @@ +import json cpp_constants = {} @@ -16,25 +20,16 @@ def register_cpp_constant(const_name, val): def resolve_cpp_constant(const_name): return cpp_constants.get(const_name, const_name) -e_s_d_schema_constants = [ - # The following are actually part of e-d-s, despite the name. - # We rename the old ambiguos constant name in ./prepare-for-gsettings-patching.patch - "\"org.gnome.Evolution.DefaultSources\"", - "\"org.gnome.evolution.shell.network-config\"", -] - -g_d_s_schema_constants = [ -] +with open("./glib-schema-to-var.json") as mapping_file: + schema_to_var = json.load(mapping_file); def get_schema_directory(schema_path): # Sometimes the schema id is referenced using C preprocessor #define constant in the same file # let’s try to resolve it first. - schema_path = resolve_cpp_constant(schema_path.strip()) - if schema_path.startswith("\"org.gnome.evolution-data-server") or schema_path in e_s_d_schema_constants: - return "\"@EDS_GSETTINGS_PATH@\"" - elif schema_path in g_d_s_schema_constants: - return "\"@GDS_GSETTINGS_PATH@\"" - raise Exception(f"Unknown schema path {schema_path}") + schema_path = resolve_cpp_constant(schema_path.strip()).strip('"') + if schema_path in schema_to_var: + return f'"@{schema_to_var[schema_path]}@"' + raise Exception(f"Unknown schema path {schema_path!r}, please add it to ./glib-schema-to-var.json") @find_cpp_constants@ |