From 09f13b88e056fb05abda905aecf94c4335d0abbe Mon Sep 17 00:00:00 2001 From: Colin Leroy Date: Thu, 18 Jan 2007 17:49:23 +0000 Subject: [PATCH] 2007-01-18 [colin] 2.7.1cvs25 * src/main.c Provide a way to migrate without backup Re-ask for migration on next start if it has been refused and wizard has been cancelled after. --- ChangeLog | 8 ++++ PATCHSETS | 1 + configure.ac | 2 +- src/main.c | 114 ++++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 110 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed9a5cc6d..8c6beec0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-01-18 [colin] 2.7.1cvs25 + + * src/main.c + Provide a way to migrate without backup + Re-ask for migration on next start if + it has been refused and wizard has been + cancelled after. + 2007-01-18 [wwp] 2.7.1cvs24 * src/editaddress.c diff --git a/PATCHSETS b/PATCHSETS index 1412ea797..bfe687431 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -2282,3 +2282,4 @@ ( cvs diff -u -r 1.115.2.124 -r 1.115.2.125 src/main.c; ) > 2.7.1cvs22.patchset ( cvs diff -u -r 1.60.2.75 -r 1.60.2.76 src/addressbook.c; ) > 2.7.1cvs23.patchset ( cvs diff -u -r 1.14.2.20 -r 1.14.2.21 src/editaddress.c; ) > 2.7.1cvs24.patchset +( cvs diff -u -r 1.115.2.125 -r 1.115.2.126 src/main.c; ) > 2.7.1cvs25.patchset diff --git a/configure.ac b/configure.ac index 6c7563b3f..5bbe629eb 100644 --- a/configure.ac +++ b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=7 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=24 +EXTRA_VERSION=25 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/main.c b/src/main.c index 3a57e6773..613f5f019 100644 --- a/src/main.c +++ b/src/main.c @@ -263,24 +263,74 @@ static gboolean defer_jump(void *data) return FALSE; } +static void chk_update_val(GtkWidget *widget, gpointer data) +{ + gboolean *val = (gboolean *)data; + *val = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); +} + static gboolean migrate_old_config(const gchar *old_cfg_dir, const gchar *new_cfg_dir, const gchar *oldversion) { gchar *message = g_strdup_printf(_("Configuration for %s (or previous) found.\n" "Do you want to migrate this configuration?"), oldversion); gint r = 0; GtkWidget *window = NULL; - if (alertpanel(_("Migration of configuration"), - message, - GTK_STOCK_NO, "+" GTK_STOCK_YES, NULL) != G_ALERTALTERNATE) { + GtkWidget *keep_backup_chk; + GtkTooltips *tips = gtk_tooltips_new(); + gboolean backup = TRUE; + + keep_backup_chk = gtk_check_button_new_with_label (_("Keep old configuration")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(keep_backup_chk), TRUE); + gtk_tooltips_set_tip(GTK_TOOLTIPS(tips), keep_backup_chk, + _("Keeping a backup will allow you to go back to an " + "older version, but may take a while if you have " + "cached IMAP or News data, and will take some extra " + "room on your disk."), + NULL); + + g_signal_connect(G_OBJECT(keep_backup_chk), "toggled", + G_CALLBACK(chk_update_val), &backup); + + if (alertpanel_full(_("Migration of configuration"), message, + GTK_STOCK_NO, "+" GTK_STOCK_YES, NULL, FALSE, + keep_backup_chk, ALERT_QUESTION, G_ALERTDEFAULT) != G_ALERTALTERNATE) { return FALSE; } - window = label_window_create(_("Copying configuration...")); - GTK_EVENTS_FLUSH(); - r = copy_dir(old_cfg_dir, new_cfg_dir); - gtk_widget_destroy(window); - if (r != 0) { - alertpanel_error(_("Migration failed!")); + /* we can either do a fast migration requiring not any extra disk + * space, or a slow one that copies the old configuration and leaves + * it in place. */ + if (backup) { +backup_mode: + window = label_window_create(_("Copying configuration... This may take a while...")); + GTK_EVENTS_FLUSH(); + + r = copy_dir(old_cfg_dir, new_cfg_dir); + gtk_widget_destroy(window); + + /* if copy failed, we'll remove the partially copied + * new directory */ + if (r != 0) { + alertpanel_error(_("Migration failed!")); + remove_dir_recursive(new_cfg_dir); + } else { + if (!backup) { + /* fast mode failed, but we don't want backup */ + remove_dir_recursive(old_cfg_dir); + } + } + } else { + window = label_window_create(_("Migrating configuration...")); + GTK_EVENTS_FLUSH(); + + r = g_rename(old_cfg_dir, new_cfg_dir); + gtk_widget_destroy(window); + + /* if g_rename failed, we'll try to copy */ + if (r != 0) { + FILE_OP_ERROR(new_cfg_dir, "g_rename failed, trying copy\n"); + goto backup_mode; + } } return (r == 0); } @@ -510,6 +560,8 @@ int main(int argc, char *argv[]) GdkPixbuf *icon; gboolean crash_file_present = FALSE; gint num_folder_class = 0; + gboolean asked_for_migration = FALSE; + START_TIMING("startup"); sc_starting = TRUE; @@ -601,18 +653,35 @@ int main(int argc, char *argv[]) g_free(userrc); CHDIR_RETURN_VAL_IF_FAIL(get_home_dir(), 1); + + /* no config dir exists. See if we can migrate an old config. */ if (!is_dir_exist(RC_DIR)) { prefs_destroy_cache(); gboolean r = FALSE; - if (is_dir_exist(OLD_GTK2_RC_DIR)) + + /* if one of the old dirs exist, we'll ask if the user + * want to migrates, and r will be TRUE if he said yes + * and migration succeeded, and FALSE otherwise. + */ + if (is_dir_exist(OLD_GTK2_RC_DIR)) { r = migrate_old_config(OLD_GTK2_RC_DIR, RC_DIR, "Sylpheed-Claws 2.6.0"); - else if (is_dir_exist(OLDER_GTK2_RC_DIR)) + asked_for_migration = TRUE; + } else if (is_dir_exist(OLDER_GTK2_RC_DIR)) { r = migrate_old_config(OLDER_GTK2_RC_DIR, RC_DIR, "Sylpheed-Claws 1.9.15"); - else if (is_dir_exist(OLD_GTK1_RC_DIR)) + asked_for_migration = TRUE; + } else if (is_dir_exist(OLD_GTK1_RC_DIR)) { r = migrate_old_config(OLD_GTK1_RC_DIR, RC_DIR, "Sylpheed-Claws 1.0.5"); + asked_for_migration = TRUE; + } + + /* If migration failed or the user didn't want to do it, + * we create a new one (and we'll hit wizard later). + */ if (r == FALSE && !is_dir_exist(RC_DIR) && make_dir(RC_DIR) < 0) exit(1); } + + if (!is_file_exist(RC_DIR G_DIR_SEPARATOR_S COMMON_RC) && is_file_exist(RC_DIR G_DIR_SEPARATOR_S OLD_COMMON_RC)) { /* post 2.6 name change */ @@ -714,18 +783,35 @@ int main(int argc, char *argv[]) prefs_account_init(); account_read_config_all(); + /* If we can't read a folder list or don't have accounts, + * it means the configuration's not done. Either this is + * a brand new install, either a failed/refused migration. + * So we'll start the wizard. + */ if (folder_read_list() < 0) { prefs_destroy_cache(); - if (!run_wizard(mainwin, TRUE)) + + /* if run_wizard returns FALSE it's because it's + * been cancelled. We can't do much but exit. + * however, if the user was asked for a migration, + * we remove the newly created directory so that + * he's asked again for migration on next launch.*/ + if (!run_wizard(mainwin, TRUE)) { + if (asked_for_migration) + remove_dir_recursive(RC_DIR); exit(1); + } main_window_reflect_prefs_all_now(); folder_write_list(); } if (!account_get_list()) { prefs_destroy_cache(); - if (!run_wizard(mainwin, FALSE)) + if (!run_wizard(mainwin, FALSE)) { + if (asked_for_migration) + remove_dir_recursive(RC_DIR); exit(1); + } account_read_config_all(); if(!account_get_list()) { exit_claws(mainwin); -- 2.25.1