aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-shell.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/e-shell.c')
-rw-r--r--shell/e-shell.c84
1 files changed, 52 insertions, 32 deletions
diff --git a/shell/e-shell.c b/shell/e-shell.c
index 5c69e49e90..0f62ae42d6 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -28,6 +28,8 @@
#include "e-util/e-dialog-utils.h"
#include "e-util/e-bconf-map.h"
+#include "e-util/e-fsutils.h"
+#include "widgets/misc/e-error.h"
#include "e-shell-constants.h"
#include "e-shell-offline-handler.h"
@@ -468,7 +470,7 @@ e_shell_init (EShell *shell)
shell->priv = priv;
}
-static gboolean
+static void
detect_version (GConfClient *gconf, int *major, int *minor, int *revision)
{
char *val, *evolution_dir;
@@ -517,8 +519,6 @@ detect_version (GConfClient *gconf, int *major, int *minor, int *revision)
}
g_free (evolution_dir);
-
- return TRUE;
}
static void
@@ -530,12 +530,30 @@ attempt_upgrade (EShell *shell)
gconf_client = gconf_client_get_default ();
- if (!detect_version (gconf_client, &major, &minor, &revision)
- || !e_shell_attempt_upgrade (shell, major, minor, revision))
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("Warning: Evolution could not upgrade all your data from version %d.%d.%d.\n"
- "The data hasn't been deleted, but it will not be seen by this version of Evolution.\n"),
- major, minor, revision);
+ detect_version (gconf_client, &major, &minor, &revision);
+
+ /* if upgrading from < 1.5, we need to copy most data from ~/evolution to ~/.evolution */
+ if (major == 1 && minor < 5) {
+ char *path;
+ long size, space;
+
+ path = g_build_filename(g_get_home_dir(), "evolution", NULL);
+ size = e_fsutils_usage(path);
+ g_free(path);
+ space = e_fsutils_avail(g_get_home_dir());
+ if (size != -1 && space != -1 && space < size) {
+ char *required = g_strdup_printf(_("%ld KB"), size);
+ char *have = g_strdup_printf(_("%ld KB"), space);
+
+ e_error_run(NULL, "shell:upgrade-nospace", required, have, NULL);
+ g_free(required);
+ g_free(have);
+ _exit(0);
+ }
+ }
+
+ if (!e_shell_attempt_upgrade (shell, major, minor, revision))
+ _exit(0);
version_string = g_strdup_printf ("%s.%s", BASE_VERSION, UPGRADE_REVISION);
gconf_client_set_string (gconf_client, "/apps/evolution/version", version_string, NULL);
@@ -662,7 +680,6 @@ e_shell_new (EShellStartupLineMode startup_line_mode,
return new;
}
-
/**
* e_shell_attempt_upgrade:
* @shell:
@@ -679,6 +696,7 @@ e_shell_attempt_upgrade (EShell *shell, int major, int minor, int revision)
GSList *component_infos, *p;
int current_major, current_minor, current_revision;
gboolean success;
+ int res;
g_return_val_if_fail (E_IS_SHELL (shell), FALSE);
@@ -695,39 +713,41 @@ e_shell_attempt_upgrade (EShell *shell, int major, int minor, int revision)
success = TRUE;
component_infos = e_component_registry_peek_list (shell->priv->component_registry);
- for (p = component_infos; p != NULL; p = p->next) {
+ for (p = component_infos; success && p != NULL; p = p->next) {
const EComponentInfo *info = p->data;
CORBA_Environment ev;
gboolean component_upgraded;
CORBA_exception_init (&ev);
- component_upgraded = GNOME_Evolution_Component_upgradeFromVersion (info->iface, major, minor, revision, &ev);
+ GNOME_Evolution_Component_upgradeFromVersion (info->iface, major, minor, revision, &ev);
if (BONOBO_EX (&ev)) {
char *exception_text;
-
- /* Ignore components that do not implement this version, it might just mean that they don't need an
- upgrade path. */
- if (strcmp (ev._id, ex_CORBA_NO_IMPLEMENT) == 0) {
- CORBA_exception_free (&ev);
- continue;
- }
-
- exception_text = bonobo_exception_get_text (&ev);
- g_warning ("Upgrade of component \"%s\" from version %d.%d.%d failed with exception %s",
- info->alias, major, minor, revision, exception_text);
- g_free (exception_text);
- CORBA_exception_free (&ev);
- success = FALSE;
- } else {
- CORBA_exception_free (&ev);
- if (! component_upgraded) {
- g_warning ("Component \"%s\" could not upgrade configuration from version %d.%d.%d",
- info->alias, major, minor, revision);
- success = FALSE;
+ CORBA_char *id = CORBA_exception_id(&ev);
+
+ if (strcmp (id, ex_CORBA_NO_IMPLEMENT) == 0) {
+ /* Ignore components that do not implement this version, it
+ might just mean that they don't need an upgrade path. */
+ } else if (strcmp (id, ex_GNOME_Evolution_Component_UpgradeFailed) == 0) {
+ GNOME_Evolution_Component_UpgradeFailed *ex = CORBA_exception_value(&ev);
+
+ res = e_error_run(NULL, "shell:upgrade-failed", ex->what, ex->why, NULL);
+ if (res == GTK_RESPONSE_CANCEL)
+ success = FALSE;
+ } else if (strcmp (id, ex_GNOME_Evolution_Component_UnsupportedVersion) == 0) {
+ /* This is non-fatal */
+ /* DO WE CARE??? */
+ printf("Upgrade of component failed, unsupported prior version\n");
+ } else {
+ exception_text = bonobo_exception_get_text (&ev);
+ res = e_error_run(NULL, "shell:upgrade-failed", exception_text, _("Uknown system error."), NULL);
+ g_free (exception_text);
+ if (res == GTK_RESPONSE_CANCEL)
+ success = FALSE;
}
}
+ CORBA_exception_free (&ev);
}
return success;