aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2012-08-09 07:06:37 +0800
committerMatthew Barnes <mbarnes@redhat.com>2012-08-10 20:40:25 +0800
commit6f7c3dd230edb56ccaf957a58e531585ff03f38d (patch)
treefad22050271c6b690f6371f4aa7a763f1f4f8204
parent05c0d37dcf60f11b74fa7aad3c0d1af7d7f93aa5 (diff)
downloadgsoc2013-evolution-6f7c3dd230edb56ccaf957a58e531585ff03f38d.tar
gsoc2013-evolution-6f7c3dd230edb56ccaf957a58e531585ff03f38d.tar.gz
gsoc2013-evolution-6f7c3dd230edb56ccaf957a58e531585ff03f38d.tar.bz2
gsoc2013-evolution-6f7c3dd230edb56ccaf957a58e531585ff03f38d.tar.lz
gsoc2013-evolution-6f7c3dd230edb56ccaf957a58e531585ff03f38d.tar.xz
gsoc2013-evolution-6f7c3dd230edb56ccaf957a58e531585ff03f38d.tar.zst
gsoc2013-evolution-6f7c3dd230edb56ccaf957a58e531585ff03f38d.zip
backup-restore: Add version info to evolution.dirs file.
Store the Evolution version used to create the backup file in the evolution.dir file which is part of the tarball. After restoring the backup file we need to reset the last-used-version key in GSettings to the version listed in the evolution.dir file so the proper migration routines run when Evolution is restarted.
-rw-r--r--modules/backup-restore/evolution-backup-tool.c62
1 files changed, 54 insertions, 8 deletions
diff --git a/modules/backup-restore/evolution-backup-tool.c b/modules/backup-restore/evolution-backup-tool.c
index d09efa3628..974dd293c3 100644
--- a/modules/backup-restore/evolution-backup-tool.c
+++ b/modules/backup-restore/evolution-backup-tool.c
@@ -62,6 +62,8 @@
#define DCONF_PATH_EDS "/org/gnome/evolution-data-server/"
#define DCONF_PATH_EVO "/org/gnome/evolution/"
+#define KEY_FILE_GROUP "Evolution Backup"
+
static gboolean backup_op = FALSE;
static gchar *bk_file = NULL;
static gboolean restore_op = FALSE;
@@ -280,9 +282,10 @@ write_dir_file (void)
g_return_if_fail (filename != NULL);
content = replace_variables (
- "[dirs]\n"
- "data=$STRIPDATADIR\n"
- "config=$STRIPCONFIGDIR\n");
+ "[" KEY_FILE_GROUP "]\n"
+ "Version=" VERSION "\n"
+ "UserDataDir=$STRIPDATADIR\n"
+ "UserConfigDir=$STRIPCONFIGDIR\n");
g_return_if_fail (content != NULL);
g_file_set_contents (filename->str, content->str, content->len, &error);
@@ -365,7 +368,8 @@ backup (const gchar *filename,
}
static void
-extract_backup_dirs (const gchar *filename,
+extract_backup_data (const gchar *filename,
+ gchar **restored_version,
gchar **data_dir,
gchar **config_dir)
{
@@ -382,7 +386,31 @@ extract_backup_dirs (const gchar *filename,
if (error) {
g_warning ("Failed to read '%s': %s", filename, error->message);
g_error_free (error);
- } else {
+
+ /* This is the current format as of Evolution 3.6. */
+ } else if (g_key_file_has_group (key_file, KEY_FILE_GROUP)) {
+ gchar *tmp;
+
+ tmp = g_key_file_get_value (
+ key_file, KEY_FILE_GROUP, "Version", NULL);
+ if (tmp != NULL)
+ *restored_version = g_strstrip (g_strdup (tmp));
+ g_free (tmp);
+
+ tmp = g_key_file_get_value (
+ key_file, KEY_FILE_GROUP, "UserDataDir", NULL);
+ if (tmp != NULL)
+ *data_dir = g_shell_quote (tmp);
+ g_free (tmp);
+
+ tmp = g_key_file_get_value (
+ key_file, KEY_FILE_GROUP, "UserConfigDir", NULL);
+ if (tmp != NULL)
+ *config_dir = g_shell_quote (tmp);
+ g_free (tmp);
+
+ /* This is the legacy format with no version information. */
+ } else if (g_key_file_has_group (key_file, "dirs")) {
gchar *tmp;
tmp = g_key_file_get_value (key_file, "dirs", "data", NULL);
@@ -456,7 +484,9 @@ restore (const gchar *filename,
if (is_new_format) {
GString *dir_fn;
- gchar *data_dir = NULL, *config_dir = NULL;
+ gchar *data_dir = NULL;
+ gchar *config_dir = NULL;
+ gchar *restored_version = NULL;
command = g_strdup_printf (
"cd $TMP && tar xzf %s "
@@ -470,8 +500,12 @@ restore (const gchar *filename,
goto end;
}
- /* data_dir and config_dir are quoted inside extract_backup_dirs */
- extract_backup_dirs (dir_fn->str, &data_dir, &config_dir);
+ /* data_dir and config_dir are quoted inside extract_backup_data */
+ extract_backup_data (
+ dir_fn->str,
+ &restored_version,
+ &data_dir,
+ &config_dir);
g_unlink (dir_fn->str);
g_string_free (dir_fn, TRUE);
@@ -505,8 +539,20 @@ restore (const gchar *filename,
run_cmd (command);
g_free (command);
+ /* If the back file had version information, set the last
+ * used version in GSettings before restarting Evolution. */
+ if (restored_version != NULL && *restored_version != '\0') {
+ GSettings *settings;
+
+ settings = g_settings_new ("org.gnome.evolution");
+ g_settings_set_string (
+ settings, "version", restored_version);
+ g_object_unref (settings);
+ }
+
g_free (data_dir);
g_free (config_dir);
+ g_free (restored_version);
} else {
run_cmd ("mv $HOME/.evolution $HOME/.evolution_old");