From 5c8be9044726f7b6d6701091839d9e426263a8e2 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Wed, 21 Nov 2012 19:59:30 +0100 Subject: Bug #680201 - Backup restore doesn't migrate accounts from GConf --- modules/backup-restore/Makefile.am | 1 + modules/backup-restore/evolution-backup-tool.c | 71 ++++++++++++++++++++++---- 2 files changed, 62 insertions(+), 10 deletions(-) (limited to 'modules/backup-restore') diff --git a/modules/backup-restore/Makefile.am b/modules/backup-restore/Makefile.am index 4d23edf7f2..7d952e795e 100644 --- a/modules/backup-restore/Makefile.am +++ b/modules/backup-restore/Makefile.am @@ -53,6 +53,7 @@ evolution_backup_CPPFLAGS = \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DDATADIR=\""$(datadir)"\" \ -DLIBDIR=\""$(libdir)"\" \ + -DDBUS_SERVICES_DIR=\"'${datadir}'/dbus-1/services\" \ $(EVOLUTION_DATA_SERVER_CFLAGS) \ $(GNOME_PLATFORM_CFLAGS) \ $(NULL) diff --git a/modules/backup-restore/evolution-backup-tool.c b/modules/backup-restore/evolution-backup-tool.c index bc6ee2723b..f02680f328 100644 --- a/modules/backup-restore/evolution-backup-tool.c +++ b/modules/backup-restore/evolution-backup-tool.c @@ -53,6 +53,7 @@ #define EVOLUTION "evolution" #define EVOLUTION_DIR "$DATADIR/" #define EVOLUTION_DIR_FILE EVOLUTION ".dir" +#define DBUS_SOURCE_REGISTRY_SERVICE_FILE "$DBUSDATADIR/org.gnome.evolution.dataserver.Sources.service" #define ANCIENT_GCONF_DUMP_FILE "backup-restore-gconf.xml" @@ -178,6 +179,7 @@ replace_variables (const gchar *str) repl ("$CONFIGDIR", e_get_user_config_dir ()); repl ("$STRIPDATADIR", strip_datadir); repl ("$STRIPCONFIGDIR", strip_configdir); + repl ("$DBUSDATADIR", DBUS_SERVICES_DIR); #undef repl @@ -445,6 +447,46 @@ get_dir_level (const gchar *dir) return res; } +static gchar * +get_source_manager_reload_command (void) +{ + GString *tmp; + gchar *command; + + tmp = replace_variables (DBUS_SOURCE_REGISTRY_SERVICE_FILE); + if (tmp) { + GKeyFile *key_file; + gchar *str = NULL; + + key_file = g_key_file_new (); + if (g_key_file_load_from_file (key_file, tmp->str, G_KEY_FILE_NONE, NULL)) { + str = g_key_file_get_string (key_file, "D-BUS Service", "Name", NULL); + } + g_key_file_free (key_file); + + if (str && *str) { + g_string_assign (tmp, str); + } else { + g_string_free (tmp, TRUE); + tmp = NULL; + } + + g_free (str); + } + + if (!tmp) + tmp = g_string_new ("org.gnome.evolution.dataserver.Sources0"); + + command = g_strdup_printf ("gdbus call --session --dest %s " + "--object-path /org/gnome/evolution/dataserver/SourceManager " + "--method org.gnome.evolution.dataserver.SourceManager.Reload", + tmp->str); + + g_string_free (tmp, TRUE); + + return command; +} + static void restore (const gchar *filename, GCancellable *cancellable) @@ -578,6 +620,10 @@ restore (const gchar *filename, EVOLUTION_DIR ANCIENT_GCONF_DUMP_FILE, EVOUSERDATADIR_MAGIC, e_get_user_data_dir ()); run_cmd ("gconftool-2 --load " EVOLUTION_DIR ANCIENT_GCONF_DUMP_FILE); + + /* give a chance to GConf to save what was loaded into a disk */ + g_usleep (G_USEC_PER_SEC * 5); + /* do not forget to convert GConf keys into GSettings */ run_cmd ("gsettings-data-convert"); run_cmd ("rm " EVOLUTION_DIR ANCIENT_GCONF_DUMP_FILE); @@ -613,6 +659,9 @@ restore (const gchar *filename, run_cmd (command); g_free (command); + /* give a chance to GConf to save what was loaded into a disk */ + g_usleep (G_USEC_PER_SEC * 5); + /* do not forget to convert GConf keys into GSettings */ run_cmd ("gsettings-data-convert"); @@ -640,16 +689,13 @@ restore (const gchar *filename, txt = _("Reloading registry service"); - /* This runs migration routines on the newly-restored data. - * - * XXX Hard-coding the whole command like this is not ideal - * because the "SourcesX" interface name will occasionally - * change and I guarantee we'll forget to update this. */ - run_cmd ( - "gdbus call --session " - "--dest org.gnome.evolution.dataserver.Sources0 " - "--object-path /org/gnome/evolution/dataserver/SourceManager " - "--method org.gnome.evolution.dataserver.SourceManager.Reload"); + /* wait few seconds, till changes settle */ + g_usleep (G_USEC_PER_SEC * 5); + + command = get_source_manager_reload_command (); + /* This runs migration routines on the newly-restored data. */ + run_cmd (command); + g_free (command); end: if (restart_arg) { @@ -657,6 +703,11 @@ end: return; txt = _("Restarting Evolution"); + + /* wait 5 seconds before restarting evolution, thus any + changes being done are updated in source registry too */ + g_usleep (G_USEC_PER_SEC * 5); + run_evolution_no_wait (); } } -- cgit v1.2.3