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);
}
GdkPixbuf *icon;
gboolean crash_file_present = FALSE;
gint num_folder_class = 0;
+ gboolean asked_for_migration = FALSE;
+
START_TIMING("startup");
sc_starting = TRUE;
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 */
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);