r2493 - in /unstable/evolution-data-server/debian: changelog patches/01_gconf_tree.patch patches/series
joss at users.alioth.debian.org
joss at users.alioth.debian.org
Thu Oct 31 14:59:13 UTC 2013
Author: joss
Date: Thu Oct 31 14:59:12 2013
New Revision: 2493
URL: http://svn.debian.org/wsvn/pkg-evolution/?sc=1&rev=2493
Log:
01_gconf_tree.patch: fix upgrades on accounts where gconf-merge-tree
has been run.
Added:
unstable/evolution-data-server/debian/patches/01_gconf_tree.patch
Modified:
unstable/evolution-data-server/debian/changelog
unstable/evolution-data-server/debian/patches/series
Modified: unstable/evolution-data-server/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-evolution/unstable/evolution-data-server/debian/changelog?rev=2493&op=diff
==============================================================================
--- unstable/evolution-data-server/debian/changelog (original)
+++ unstable/evolution-data-server/debian/changelog Thu Oct 31 14:59:12 2013
@@ -1,10 +1,14 @@
-evolution-data-server (3.8.5-3) UNRELEASED; urgency=low
-
- * Team upload.
+evolution-data-server (3.8.5-3) unstable; urgency=medium
+
+ [ Yves-Alexis Perez ]
* Remove myself from uploaders, this should have been done a long time
ago.
- -- Yves-Alexis Perez <corsac at debian.org> Mon, 28 Oct 2013 09:01:33 +0100
+ [ Josselin Mouette ]
+ * 01_gconf_tree.patch: fix upgrades on accounts where gconf-merge-tree
+ has been run.
+
+ -- Josselin Mouette <joss at debian.org> Thu, 31 Oct 2013 15:58:55 +0100
evolution-data-server (3.8.5-2) unstable; urgency=low
Added: unstable/evolution-data-server/debian/patches/01_gconf_tree.patch
URL: http://svn.debian.org/wsvn/pkg-evolution/unstable/evolution-data-server/debian/patches/01_gconf_tree.patch?rev=2493&op=file
==============================================================================
--- unstable/evolution-data-server/debian/patches/01_gconf_tree.patch (added)
+++ unstable/evolution-data-server/debian/patches/01_gconf_tree.patch Thu Oct 31 14:59:12 2013
@@ -0,0 +1,504 @@
+From 1d8cafea6d7527739726a6d2c81934516279e2d1 Mon Sep 17 00:00:00 2001
+From: Matthew Barnes <mbarnes at redhat.com>
+Date: Mon, 28 Oct 2013 17:44:00 +0000
+Subject: Support migrating merged GConf trees.
+
+Check for and parse a ~/.gconf/%gconf-tree.xml file during migration.
+This is mainly for Debian, which I think accidentally merged some users'
+GConf trees at some point.
+
+This also adds a command-line program (evolution-scan-gconf-tree-xml),
+which parses an arbitrary %gconf-tree.xml file as a recovery measure.
+
+(cherry picked from commit fd3ad46d19a02c4ea73117c9ebee7913ca388890)
+---
+diff --git a/services/evolution-source-registry/Makefile.am b/services/evolution-source-registry/Makefile.am
+index 88f32f1..fc28b66 100644
+--- a/services/evolution-source-registry/Makefile.am
++++ b/services/evolution-source-registry/Makefile.am
+@@ -40,7 +40,10 @@ EXTRA_DIST = \
+ $(service_in_files) \
+ $(NULL)
+
+-libexec_PROGRAMS = evolution-source-registry
++libexec_PROGRAMS = \
++ evolution-source-registry \
++ evolution-scan-gconf-tree-xml \
++ $(NULL)
+
+ evolution_source_registry_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+@@ -74,6 +77,33 @@ evolution_source_registry_LDADD = \
+ $(SOUP_LIBS) \
+ $(NULL)
+
++evolution_scan_gconf_tree_xml_CPPFLAGS = \
++ $(AM_CPPFLAGS) \
++ -I$(top_srcdir) \
++ -I$(top_builddir) \
++ -DG_LOG_DOMAIN=\"evolution-scan-gconf-tree-xml\" \
++ -DLOCALEDIR=\"$(localedir)\" \
++ $(E_DATA_SERVER_CFLAGS) \
++ $(LIBSECRET_CFLAGS) \
++ $(CAMEL_CFLAGS) \
++ $(SOUP_CFLAGS) \
++ $(NULL)
++
++evolution_scan_gconf_tree_xml_SOURCES = \
++ evolution-scan-gconf-tree-xml.c \
++ evolution-source-registry-migrate-sources.c \
++ $(NULL)
++
++evolution_scan_gconf_tree_xml_LDADD = \
++ $(top_builddir)/libebackend/libebackend-1.2.la \
++ $(top_builddir)/libedataserver/libedataserver-1.2.la \
++ $(top_builddir)/camel/libcamel-1.2.la \
++ $(E_DATA_SERVER_LIBS) \
++ $(LIBSECRET_LIBS) \
++ $(CAMEL_LIBS) \
++ $(SOUP_LIBS) \
++ $(NULL)
++
+ evolution-source-registry-resource.h: evolution-source-registry-resource.xml $(builtin_sources)
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) \
+ $(srcdir)/evolution-source-registry-resource.xml \
+diff --git a/services/evolution-source-registry/evolution-scan-gconf-tree-xml.c b/services/evolution-source-registry/evolution-scan-gconf-tree-xml.c
+new file mode 100644
+index 0000000..123c0b1
+--- /dev/null
++++ b/services/evolution-source-registry/evolution-scan-gconf-tree-xml.c
+@@ -0,0 +1,70 @@
++/*
++ * evolution-scan-gconf-tree-xml.c
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) version 3.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with the program; if not, see <http://www.gnu.org/licenses/>
++ *
++ */
++
++#include <config.h>
++#include <locale.h>
++#include <stdlib.h>
++#include <glib/gi18n.h>
++
++#include <glib.h>
++
++#define PROGRAM_SUMMARY \
++ "Extracts Evolution accounts from a merged GConf tree file."
++
++/* Forward Declarations */
++gboolean evolution_source_registry_migrate_gconf_tree_xml
++ (const gchar *filename,
++ GError **error);
++
++gint
++main (gint argc,
++ gchar **argv)
++{
++ GOptionContext *context;
++ GError *error = NULL;
++
++ setlocale (LC_ALL, "");
++ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
++ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
++
++ context = g_option_context_new ("/path/to/%gconf-tree.xml");
++ g_option_context_set_summary (context, PROGRAM_SUMMARY);
++ g_option_context_parse (context, &argc, &argv, &error);
++
++ if (error != NULL) {
++ g_printerr ("%s\n", error->message);
++ exit (1);
++ }
++
++ if (argc != 2) {
++ g_print (
++ "Usage: %s /path/to/%%gconf-tree.xml\n\n",
++ g_get_prgname ());
++ exit (0);
++ }
++
++ evolution_source_registry_migrate_gconf_tree_xml (argv[1], &error);
++
++ if (error != NULL) {
++ g_printerr ("%s\n", error->message);
++ exit (1);
++ }
++
++ return 0;
++}
++
+diff --git a/services/evolution-source-registry/evolution-source-registry-migrate-sources.c b/services/evolution-source-registry/evolution-source-registry-migrate-sources.c
+index 9653ba8..c207ee7 100644
+--- a/services/evolution-source-registry/evolution-source-registry-migrate-sources.c
++++ b/services/evolution-source-registry/evolution-source-registry-migrate-sources.c
+@@ -165,7 +165,10 @@ static const SecretSchema e_passwords_schema = {
+ };
+
+ /* Forward Declarations */
+-void evolution_source_registry_migrate_sources (void);
++void evolution_source_registry_migrate_sources (void);
++gboolean evolution_source_registry_migrate_gconf_tree_xml
++ (const gchar *filename,
++ GError **error);
+
+ static ParseData *
+ parse_data_new (ParseType parse_type)
+@@ -186,6 +189,8 @@ parse_data_free (ParseData *parse_data)
+ * pointers are cleared before we get here. But if an error
+ * occurred we may leave data behind. This cleans it up. */
+
++ g_return_if_fail (parse_data != NULL);
++
+ if (parse_data->file != NULL)
+ g_object_unref (parse_data->file);
+
+@@ -3187,6 +3192,10 @@ migrate_parse_gconf_xml_start_element (GMarkupParseContext *context,
+ {
+ ParseData *parse_data = user_data;
+
++ /* Only seen in merged XML files. */
++ if (g_strcmp0 (element_name, "dir") == 0)
++ return;
++
+ if (g_strcmp0 (element_name, "gconf") == 0) {
+ if (parse_data->state != PARSE_STATE_INITIAL)
+ goto invalid_content;
+@@ -3385,8 +3394,156 @@ migrate_parse_gconf_xml (ParseType parse_type,
+ return success;
+ }
+
++static gboolean
++migrate_parse_gconf_tree_xml_in_evolution (GQueue *dir_stack)
++{
++ if (g_strcmp0 (g_queue_peek_nth (dir_stack, 0), "apps") != 0)
++ return FALSE;
++
++ if (g_strcmp0 (g_queue_peek_nth (dir_stack, 1), "evolution") != 0)
++ return FALSE;
++
++ return TRUE;
++}
++
+ static void
+-migrate_remove_gconf_xml (const gchar *gconf_key,
++migrate_parse_gconf_tree_xml_start_element (GMarkupParseContext *context,
++ const gchar *element_name,
++ const gchar **attribute_names,
++ const gchar **attribute_values,
++ gpointer user_data,
++ GError **error)
++{
++ GQueue *dir_stack = user_data;
++
++ if (g_strcmp0 (element_name, "dir") == 0) {
++ ParseData *parse_data = NULL;
++ gchar *dir_name = NULL;
++
++ g_markup_collect_attributes (
++ element_name,
++ attribute_names,
++ attribute_values,
++ error,
++ G_MARKUP_COLLECT_STRDUP,
++ "name", &dir_name,
++ G_MARKUP_COLLECT_INVALID);
++
++ if (dir_name != NULL) {
++ /* Takes ownership of the string. */
++ g_queue_push_tail (dir_stack, dir_name);
++ dir_name = NULL;
++ }
++
++ /* Push a sub-parser to handle the <entry> tag. */
++
++ if (migrate_parse_gconf_tree_xml_in_evolution (dir_stack))
++ dir_name = g_queue_peek_tail (dir_stack);
++
++ if (g_strcmp0 (dir_name, "mail") == 0)
++ parse_data = parse_data_new (PARSE_TYPE_MAIL);
++
++ if (g_strcmp0 (dir_name, "addressbook") == 0)
++ parse_data = parse_data_new (PARSE_TYPE_ADDRESSBOOK);
++
++ if (g_strcmp0 (dir_name, "calendar") == 0)
++ parse_data = parse_data_new (PARSE_TYPE_CALENDAR);
++
++ if (g_strcmp0 (dir_name, "tasks") == 0)
++ parse_data = parse_data_new (PARSE_TYPE_TASKS);
++
++ if (g_strcmp0 (dir_name, "memos") == 0)
++ parse_data = parse_data_new (PARSE_TYPE_MEMOS);
++
++ if (parse_data != NULL) {
++ /* Pretend like we saw a <gconf> tag. */
++ parse_data->state = PARSE_STATE_IN_GCONF;
++
++ g_markup_parse_context_push (
++ context, &gconf_xml_parser, parse_data);
++ }
++ }
++}
++
++static void
++migrate_parse_gconf_tree_xml_end_element (GMarkupParseContext *context,
++ const gchar *element_name,
++ gpointer user_data,
++ GError **error)
++{
++ GQueue *dir_stack = user_data;
++
++ if (g_strcmp0 (element_name, "dir") == 0) {
++ gboolean pop_parse_context = FALSE;
++
++ /* Figure out if we need to pop the parse context. */
++
++ if (migrate_parse_gconf_tree_xml_in_evolution (dir_stack)) {
++ const gchar *dir_name;
++
++ dir_name = g_queue_peek_tail (dir_stack);
++
++ if (g_strcmp0 (dir_name, "mail") == 0)
++ pop_parse_context = TRUE;
++
++ if (g_strcmp0 (dir_name, "addressbook") == 0)
++ pop_parse_context = TRUE;
++
++ if (g_strcmp0 (dir_name, "calendar") == 0)
++ pop_parse_context = TRUE;
++
++ if (g_strcmp0 (dir_name, "tasks") == 0)
++ pop_parse_context = TRUE;
++
++ if (g_strcmp0 (dir_name, "memos") == 0)
++ pop_parse_context = TRUE;
++ }
++
++ if (pop_parse_context) {
++ ParseData *parse_data;
++
++ parse_data = g_markup_parse_context_pop (context);
++ parse_data_free (parse_data);
++ }
++
++ g_free (g_queue_pop_tail (dir_stack));
++ }
++}
++
++static GMarkupParser gconf_tree_xml_parser = {
++ migrate_parse_gconf_tree_xml_start_element,
++ migrate_parse_gconf_tree_xml_end_element,
++ NULL, /* text */
++ NULL, /* passthrough */
++ NULL /* error */
++};
++
++static gboolean
++migrate_parse_gconf_tree_xml (const gchar *contents,
++ gsize length,
++ GError **error)
++{
++ GMarkupParseContext *context;
++ GQueue dir_stack = G_QUEUE_INIT;
++ gboolean success = FALSE;
++
++ context = g_markup_parse_context_new (
++ &gconf_tree_xml_parser, 0,
++ &dir_stack, (GDestroyNotify) NULL);
++
++ if (g_markup_parse_context_parse (context, contents, length, error))
++ if (g_markup_parse_context_end_parse (context, error))
++ success = TRUE;
++
++ g_markup_parse_context_free (context);
++
++ g_warn_if_fail (g_queue_is_empty (&dir_stack));
++
++ return success;
++}
++
++static void
++migrate_remove_gconf_key (const gchar *gconf_key,
+ const gchar *gconf_xml)
+ {
+ /* Remove the GConf string list so the user is not haunted by
+@@ -3425,11 +3582,14 @@ migrate_remove_gconf_xml (const gchar *gconf_key,
+ g_free (command_line);
+ }
+
+- if (g_file_test (gconf_xml, G_FILE_TEST_IS_REGULAR)) {
+- if (g_remove (gconf_xml) == -1) {
+- g_printerr (
+- "Failed to remove '%s': %s\n",
+- gconf_xml, g_strerror (errno));
++ /* This will be NULL when parsing a merged XML tree. */
++ if (gconf_xml != NULL) {
++ if (g_file_test (gconf_xml, G_FILE_TEST_IS_REGULAR)) {
++ if (g_remove (gconf_xml) == -1) {
++ g_printerr (
++ "Failed to remove '%s': %s\n",
++ gconf_xml, g_strerror (errno));
++ }
+ }
+ }
+ }
+@@ -3443,8 +3603,45 @@ migrate_handle_error (const GError *error)
+ g_printerr (" FAILED: %s\n", error->message);
+ }
+
+-void
+-evolution_source_registry_migrate_sources (void)
++static void
++migrate_merged_gconf_tree (const gchar *gconf_tree_xml)
++{
++ gchar *contents;
++ gsize length;
++ GError *error = NULL;
++
++ g_file_get_contents (gconf_tree_xml, &contents, &length, &error);
++
++ if (error == NULL) {
++ migrate_parse_gconf_tree_xml (contents, length, &error);
++ g_free (contents);
++ }
++
++ if (error == NULL) {
++ const gchar *gconf_key;
++
++ gconf_key = "/apps/evolution/mail/accounts";
++ migrate_remove_gconf_key (gconf_key, NULL);
++
++ gconf_key = "/apps/evolution/addressbook/sources";
++ migrate_remove_gconf_key (gconf_key, NULL);
++
++ gconf_key = "/apps/evolution/calendar/sources";
++ migrate_remove_gconf_key (gconf_key, NULL);
++
++ gconf_key = "/apps/evolution/tasks/sources";
++ migrate_remove_gconf_key (gconf_key, NULL);
++
++ gconf_key = "/apps/evolution/memos/sources";
++ migrate_remove_gconf_key (gconf_key, NULL);
++ } else {
++ migrate_handle_error (error);
++ g_clear_error (&error);
++ }
++}
++
++static void
++migrate_normal_gconf_tree (const gchar *gconf_base_dir)
+ {
+ gchar *base_dir;
+ gchar *contents;
+@@ -3454,7 +3651,7 @@ evolution_source_registry_migrate_sources (void)
+ GError *error = NULL;
+
+ base_dir = g_build_filename (
+- g_get_home_dir (), ".gconf", "apps", "evolution", NULL);
++ gconf_base_dir, "apps", "evolution", NULL);
+
+ /* ------------------------------------------------------------------*/
+
+@@ -3473,7 +3670,7 @@ evolution_source_registry_migrate_sources (void)
+
+ if (error == NULL) {
+ gconf_key = "/apps/evolution/mail/accounts";
+- migrate_remove_gconf_xml (gconf_key, gconf_xml);
++ migrate_remove_gconf_key (gconf_key, gconf_xml);
+ } else {
+ migrate_handle_error (error);
+ g_clear_error (&error);
+@@ -3498,7 +3695,7 @@ evolution_source_registry_migrate_sources (void)
+
+ if (error == NULL) {
+ gconf_key = "/apps/evolution/addressbook/sources";
+- migrate_remove_gconf_xml (gconf_key, gconf_xml);
++ migrate_remove_gconf_key (gconf_key, gconf_xml);
+ } else {
+ migrate_handle_error (error);
+ g_clear_error (&error);
+@@ -3523,7 +3720,7 @@ evolution_source_registry_migrate_sources (void)
+
+ if (error == NULL) {
+ gconf_key = "/apps/evolution/calendar/sources";
+- migrate_remove_gconf_xml (gconf_key, gconf_xml);
++ migrate_remove_gconf_key (gconf_key, gconf_xml);
+ } else {
+ migrate_handle_error (error);
+ g_clear_error (&error);
+@@ -3548,7 +3745,7 @@ evolution_source_registry_migrate_sources (void)
+
+ if (error == NULL) {
+ gconf_key = "/apps/evolution/tasks/sources";
+- migrate_remove_gconf_xml (gconf_key, gconf_xml);
++ migrate_remove_gconf_key (gconf_key, gconf_xml);
+ } else {
+ migrate_handle_error (error);
+ g_clear_error (&error);
+@@ -3573,7 +3770,7 @@ evolution_source_registry_migrate_sources (void)
+
+ if (error == NULL) {
+ gconf_key = "/apps/evolution/memos/sources";
+- migrate_remove_gconf_xml (gconf_key, gconf_xml);
++ migrate_remove_gconf_key (gconf_key, gconf_xml);
+ } else {
+ migrate_handle_error (error);
+ g_clear_error (&error);
+@@ -3585,3 +3782,45 @@ evolution_source_registry_migrate_sources (void)
+
+ g_free (base_dir);
+ }
++
++void
++evolution_source_registry_migrate_sources (void)
++{
++ gchar *gconf_base_dir;
++ gchar *gconf_tree_xml;
++
++ gconf_base_dir =
++ g_build_filename (g_get_home_dir (), ".gconf", NULL);
++ gconf_tree_xml =
++ g_build_filename (gconf_base_dir, "%gconf-tree.xml", NULL);
++
++ /* Handle a merged GConf tree file if present (mainly for
++ * Debian), otherwise assume a normal GConf directory tree. */
++ if (g_file_test (gconf_tree_xml, G_FILE_TEST_IS_REGULAR))
++ migrate_merged_gconf_tree (gconf_tree_xml);
++ else
++ migrate_normal_gconf_tree (gconf_base_dir);
++
++ g_free (gconf_base_dir);
++ g_free (gconf_tree_xml);
++}
++
++gboolean
++evolution_source_registry_migrate_gconf_tree_xml (const gchar *filename,
++ GError **error)
++{
++ gchar *contents;
++ gsize length;
++ gboolean success = FALSE;
++
++ /* Extracts account info from an arbitrary merged XML file. */
++
++ if (g_file_get_contents (filename, &contents, &length, error)) {
++ success = migrate_parse_gconf_tree_xml (
++ contents, length, error);
++ g_free (contents);
++ }
++
++ return success;
++}
++
+--
+cgit v0.9.2
Modified: unstable/evolution-data-server/debian/patches/series
URL: http://svn.debian.org/wsvn/pkg-evolution/unstable/evolution-data-server/debian/patches/series?rev=2493&op=diff
==============================================================================
--- unstable/evolution-data-server/debian/patches/series (original)
+++ unstable/evolution-data-server/debian/patches/series Thu Oct 31 14:59:12 2013
@@ -1,3 +1,4 @@
+01_gconf_tree.patch
fix-google-2fa-1.patch
fix-google-2fa-2.patch
fix-google-2fa-3.patch
More information about the pkg-evolution-commits
mailing list