From fc863cbedf2998f93b1518bac7ce2243a1468372 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 7 Jan 2004 22:12:43 +0000 Subject: Don't migrate stuff here anymore. 2004-01-07 Jeffrey Stedfast * mail-component.c (mail_component_init): Don't migrate stuff here anymore. * mail-ops.c (uid_cachename_hack): Removed a hack that checked for the really old uid cache location and make the uid cache live in a better location (why have mail/pop/ and mail/pop3/cache-? simply put the cache file in mail/pop//uid-cache). * em-migrate.c (em_migrate_dir): When copying over mbox folders, don't abort if we fail to copy over a summary file (big whoop). Also, if indexing was turned on in the evolution 1.4 version of the folder, turn on indexing for that folder in the migrated mbox folder as well. (em_migrate_pop_uid_caches): Migrate the pop3 uid-cache files. Fixes bug #52464. (em_migrate): Call em_migrate_pop_uid_caches(). svn path=/trunk/; revision=24094 --- mail/ChangeLog | 18 ++++++ mail/em-migrate.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++--- mail/mail-component.c | 23 -------- mail/mail-ops.c | 31 ++--------- 4 files changed, 164 insertions(+), 57 deletions(-) diff --git a/mail/ChangeLog b/mail/ChangeLog index bd0c19b8db..72f1b12eb3 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,5 +1,23 @@ 2004-01-07 Jeffrey Stedfast + * mail-component.c (mail_component_init): Don't migrate stuff here + anymore. + + * mail-ops.c (uid_cachename_hack): Removed a hack that checked for + the really old uid cache location and make the uid cache live in a + better location (why have mail/pop/ and + mail/pop3/cache-? simply put the cache file in + mail/pop//uid-cache). + + * em-migrate.c (em_migrate_dir): When copying over mbox folders, + don't abort if we fail to copy over a summary file (big + whoop). Also, if indexing was turned on in the evolution 1.4 + version of the folder, turn on indexing for that folder in the + migrated mbox folder as well. + (em_migrate_pop_uid_caches): Migrate the pop3 uid-cache + files. Fixes bug #52464. + (em_migrate): Call em_migrate_pop_uid_caches(). + * em-format-html.c (efh_format_address): Removed. (efh_format_header): Handle address formatting a little differently to address dwmw's complaints. Also now handles other diff --git a/mail/em-migrate.c b/mail/em-migrate.c index a3efe4eb26..10fc9248cf 100644 --- a/mail/em-migrate.c +++ b/mail/em-migrate.c @@ -304,7 +304,7 @@ cp (const char *src, const char *dest, gboolean show_progress) if ((fd[0] = open (src, O_RDONLY)) == -1) return -1; - if ((fd[1] = open (dest, O_WRONLY | O_CREAT | O_APPEND, 0666)) == -1) { + if ((fd[1] = open (dest, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) { errnosav = errno; close (fd[0]); errno = errnosav; @@ -441,6 +441,7 @@ em_migrate_dir (EMMigrateSession *session, const char *dirname, const char *full if (!strncmp (uri, "mbox:", 5)) { GString *src, *dest; + size_t slen, dlen; char *p; src = g_string_new (""); @@ -451,6 +452,9 @@ em_migrate_dir (EMMigrateSession *session, const char *dirname, const char *full p = strrchr (dest->str, '/'); *p = '\0'; + slen = src->len; + dlen = dest->len; + if (camel_mkdir (dest->str, 0777) == -1 && errno != EEXIST) { g_string_free (dest, TRUE); g_string_free (src, TRUE); @@ -466,10 +470,64 @@ em_migrate_dir (EMMigrateSession *session, const char *dirname, const char *full g_string_append (src, ".ev-summary"); g_string_append (dest, ".ev-summary"); - if (cp (src->str, dest->str, FALSE) == -1) { - g_string_free (dest, TRUE); - g_string_free (src, TRUE); - goto try_subdirs; + cp (src->str, dest->str, FALSE); + + if (index) { + static char *ibex_ext[] = { ".ibex.index", ".ibex.index.data" }; + FILE *fp; + int i; + + /* create a .cmeta file specifying to index the folder */ + g_string_truncate (dest, dlen); + g_string_append (dest, ".cmeta"); + if ((fp = fopen (dest->str, "w+")) != NULL) { + int fd = fileno (fp); + + /* write the magic string */ + if (fwrite ("CLMD", 4, 1, fp) != 1) + goto cmeta_err; + + /* write the version (1) */ + if (camel_file_util_encode_uint32 (fp, 1) == -1) + goto cmeta_err; + + /* write the meta count */ + if (camel_file_util_encode_uint32 (fp, 0) == -1) + goto cmeta_err; + + /* write the prop count (only prop is the index prop) */ + if (camel_file_util_encode_uint32 (fp, 1) == -1) + goto cmeta_err; + + /* write the index prop tag (== CAMEL_FOLDER_ARG_LAST|CAMEL_ARG_BOO) */ + if (camel_file_util_encode_uint32 (fp, CAMEL_FOLDER_ARG_LAST|CAMEL_ARG_BOO) == -1) + goto cmeta_err; + + /* write the index prop value */ + if (camel_file_util_encode_uint32 (fp, 1) == -1) + goto cmeta_err; + + fflush (fp); + + fd = fileno (fp); + if (fsync (fd) == -1) { + cmeta_err: + fclose (fp); + unlink (dest->str); + } else { + fclose (fp); + } + } + + /* copy over the ibex files */ + for (i = 0; i < 2; i++) { + g_string_truncate (src, slen); + g_string_truncate (dest, dlen); + + g_string_append (src, ibex_ext[i]); + g_string_append (dest, ibex_ext[i]); + cp (src->str, dest->str, FALSE); + } } g_string_free (dest, TRUE); @@ -507,7 +565,7 @@ em_migrate_dir (EMMigrateSession *session, const char *dirname, const char *full /* try subfolders anyway? */ goto try_subdirs; } - + uids = camel_folder_get_uids (old_folder); for (i = 0; i < uids->len; i++) { CamelMimeMessage *message; @@ -684,7 +742,7 @@ em_migrate_filter_file (const char *evolution_dir, const char *filename, CamelEx xmlDocPtr doc; int retval; - path = g_strdup_printf ("%s/evolution/%s", g_get_home_dir (), filename); + path = g_build_filename (g_get_home_dir (), "evolution", filename, NULL); if (!(doc = xmlParseFile (path))) { /* can't parse - this means nothing to upgrade */ @@ -769,7 +827,7 @@ em_migrate_filter_file (const char *evolution_dir, const char *filename, CamelEx node = node->next; } - path = g_strdup_printf ("%s/mail/%s", evolution_dir, filename); + path = g_build_filename (evolution_dir, "mail", filename, NULL); if ((retval = e_xml_save_file (path, doc)) == -1) { camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Failed to migrate `%s': %s"), @@ -783,6 +841,78 @@ em_migrate_filter_file (const char *evolution_dir, const char *filename, CamelEx return retval; } +static int +em_migrate_pop_uid_caches (const char *evolution_dir, CamelException *ex) +{ + GString *oldpath, *newpath; + struct dirent *dent; + size_t olen, nlen; + char *cache_dir; + DIR *dir; + + /* open the old cache dir */ + cache_dir = g_build_filename (g_get_home_dir (), "evolution", "mail", "pop3", NULL); + if (!(dir = opendir (cache_dir))) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Failed to migrate pop3 uid caches: %s"), + g_strerror (errno)); + g_warning ("cannot open `%s': %s", cache_dir, strerror (errno)); + g_free (cache_dir); + return -1; + } + + oldpath = g_string_new (cache_dir); + g_string_append_c (oldpath, '/'); + olen = oldpath->len; + g_free (cache_dir); + + cache_dir = g_build_filename (evolution_dir, "mail", "pop", NULL); + if (camel_mkdir (cache_dir, 0777) == -1) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Failed to migrate pop3 uid caches: %s"), + g_strerror (errno)); + g_warning ("cannot create `%s': %s", cache_dir, strerror (errno)); + g_string_free (oldpath, TRUE); + g_free (cache_dir); + closedir (dir); + return -1; + } + + newpath = g_string_new (cache_dir); + g_string_append_c (newpath, '/'); + nlen = newpath->len; + g_free (cache_dir); + + while ((dent = readdir (dir))) { + if (strncmp (dent->d_name, "cache-pop:__", 12) != 0) + continue; + + g_string_truncate (oldpath, olen); + g_string_truncate (newpath, nlen); + + g_string_append (oldpath, dent->d_name); + g_string_append (newpath, dent->d_name + 12); + + /* strip the trailing '_' */ + g_string_truncate (newpath, newpath->len - 1); + + if (camel_mkdir (newpath->str, 0777) == -1) { + g_warning ("cannot create `%s': %s", newpath->str, strerror (errno)); + continue; + } + + g_string_append (newpath, "/uid-cache"); + cp (oldpath->str, newpath->str, FALSE); + } + + g_string_free (oldpath, TRUE); + g_string_free (newpath, TRUE); + + closedir (dir); + + return 0; +} + int em_migrate (MailComponent *component, CamelException *ex) @@ -850,5 +980,8 @@ em_migrate (MailComponent *component, CamelException *ex) if (em_migrate_filter_file (evolution_dir, "vfolders.xml", ex) == -1) return -1; + if (em_migrate_pop_uid_caches (evolution_dir, ex) == -1) + return -1; + return 0; } diff --git a/mail/mail-component.c b/mail/mail-component.c index a764e1b7c6..a05dbd7526 100644 --- a/mail/mail-component.c +++ b/mail/mail-component.c @@ -473,8 +473,6 @@ mail_component_init (MailComponent *component) { MailComponentPrivate *priv; EAccountList *accounts; - struct stat st; - char *mail_dir; priv = g_new0 (MailComponentPrivate, 1); component->priv = priv; @@ -493,27 +491,6 @@ mail_component_init (MailComponent *component) priv->async_event = mail_async_event_new(); priv->store_hash = g_hash_table_new (NULL, NULL); - /* migrate evolution 1.x folders to 2.0's location/format */ - mail_dir = g_strdup_printf ("%s/mail", priv->base_directory); - if (stat (mail_dir, &st) == -1) { - CamelException ex; - - camel_exception_init (&ex); - if (em_migrate (component, &ex) == -1) { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, - _("The following error occured while migrating your mail data:\n%s"), - camel_exception_get_description (&ex)); - - g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); - gtk_widget_show (dialog); - - camel_exception_clear (&ex); - } - } - g_free (mail_dir); - setup_local_store (component); accounts = mail_config_get_accounts (); diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 1f5e75cb42..32eb68b4f1 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -221,38 +221,17 @@ static char * uid_cachename_hack (CamelStore *store) { CamelURL *url = CAMEL_SERVICE (store)->url; - char *encoded_url, *filename, *old_location; - struct stat st; + char *encoded_url, *filename; + const char *evolution_dir; - encoded_url = g_strdup_printf ("pop://%s%s%s@%s/", url->user, + encoded_url = g_strdup_printf ("%s%s%s@%s", url->user, url->authmech ? ";auth=" : "", url->authmech ? url->authmech : "", url->host); e_filename_make_safe (encoded_url); - filename = g_strdup_printf ("%s/mail/pop3/cache-%s", - mail_component_peek_base_directory (mail_component_peek ()), encoded_url); - - /* lame hack, but we can't expect user's to actually migrate - their cache files - brain power requirements are too - high. */ - if (stat (filename, &st) == -1) { - /* This is either the first time the user has checked - mail with this POP provider or else their cache - file is in the old location... */ - old_location = g_strdup_printf ("%s/config/cache-%s", - mail_component_peek_base_directory (mail_component_peek ()), - encoded_url); - if (stat (old_location, &st) == -1) { - /* old location doesn't exist either so use the new location */ - g_free (old_location); - } else { - /* old location exists, so I guess we use the old cache file location */ - g_free (filename); - filename = old_location; - } - } - + evolution_dir = mail_component_peek_base_directory (mail_component_peek ()); + filename = g_build_filename (evolution_dir, "mail", "pop", encoded_url, "uid-cache", NULL); g_free (encoded_url); return filename; -- cgit v1.2.3