Hello community,

here is the log from the commit of package evolution-data-server for 
openSUSE:Factory checked in at 2019-07-21 11:31:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/evolution-data-server (Old)
 and      /work/SRC/openSUSE:Factory/.evolution-data-server.new.4126 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "evolution-data-server"

Sun Jul 21 11:31:08 2019 rev:204 rq:716274 version:3.32.4

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/evolution-data-server/evolution-data-server.changes  
    2019-06-24 21:50:52.675990456 +0200
+++ 
/work/SRC/openSUSE:Factory/.evolution-data-server.new.4126/evolution-data-server.changes
    2019-07-21 11:31:09.752809551 +0200
@@ -1,0 +2,8 @@
+Mon Jul 15 16:20:35 UTC 2019 - Bjørn Lie <[email protected]>
+
+- Update to version 3.32.4:
+  + Miscellaneous changes in ecmb_modify_object_sync().
+  + Bugs fixed: glgo#GNOME/evolution-data-server#130,
+    glgo#GNOME/evolution-data-server#479.
+
+-------------------------------------------------------------------

Old:
----
  evolution-data-server-3.32.3.tar.xz

New:
----
  evolution-data-server-3.32.4.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ evolution-data-server.spec ++++++
--- /var/tmp/diff_new_pack.wiWyUN/_old  2019-07-21 11:31:10.276809463 +0200
+++ /var/tmp/diff_new_pack.wiWyUN/_new  2019-07-21 11:31:10.280809462 +0200
@@ -30,7 +30,7 @@
 %bcond_without introspection
 
 Name:           evolution-data-server
-Version:        3.32.3
+Version:        3.32.4
 Release:        0
 Summary:        Evolution Data Server
 License:        LGPL-2.0-only

++++++ evolution-data-server-3.32.3.tar.xz -> 
evolution-data-server-3.32.4.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/evolution-data-server-3.32.3/CMakeLists.txt 
new/evolution-data-server-3.32.4/CMakeLists.txt
--- old/evolution-data-server-3.32.3/CMakeLists.txt     2019-06-17 
15:21:44.000000000 +0200
+++ new/evolution-data-server-3.32.4/CMakeLists.txt     2019-07-15 
10:56:38.000000000 +0200
@@ -4,7 +4,7 @@
 cmake_policy(VERSION 3.1)
 
 project(evolution-data-server
-       VERSION 3.32.3
+       VERSION 3.32.4
        LANGUAGES C CXX)
 set(CMAKE_CXX_STANDARD 14)
 set(PROJECT_BUGREPORT 
"https://gitlab.gnome.org/GNOME/evolution-data-server/issues/";)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/evolution-data-server-3.32.3/NEWS 
new/evolution-data-server-3.32.4/NEWS
--- old/evolution-data-server-3.32.3/NEWS       2019-06-17 15:21:44.000000000 
+0200
+++ new/evolution-data-server-3.32.4/NEWS       2019-07-15 10:56:38.000000000 
+0200
@@ -1,3 +1,13 @@
+Evolution-Data-Server 3.32.4 2019-07-15
+---------------------------------------
+
+Bug Fixes:
+       evo-I#479 - Call mail account refresh also after going online ][ (Milan 
Crha)
+       I#130 - [CamelOfflineFolder] Multiple downsync operations can run 
simultaneously (Milan Crha)
+
+Miscellaneous:
+       Miscellaneous changes in ecmb_modify_object_sync() (Milan Crha)
+
 Evolution-Data-Server 3.32.3 2019-06-17
 ---------------------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-meta-backend.c 
new/evolution-data-server-3.32.4/src/calendar/libedata-cal/e-cal-meta-backend.c
--- 
old/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-meta-backend.c 
    2019-06-17 15:21:44.000000000 +0200
+++ 
new/evolution-data-server-3.32.4/src/calendar/libedata-cal/e-cal-meta-backend.c 
    2019-07-15 10:56:38.000000000 +0200
@@ -1879,11 +1879,11 @@
                        }
 
                        if (split_icalcomp) {
-                               gchar *new_uid;
+                               gchar *split_uid;
 
-                               new_uid = e_util_generate_uid ();
-                               icalcomponent_set_uid (split_icalcomp, new_uid);
-                               g_free (new_uid);
+                               split_uid = e_util_generate_uid ();
+                               icalcomponent_set_uid (split_icalcomp, 
split_uid);
+                               g_free (split_uid);
 
                                g_warn_if_fail 
(e_cal_component_set_icalcomponent (comp, split_icalcomp));
 
@@ -1929,8 +1929,9 @@
                *out_old_comp = old_comp;
        if (out_new_comp) {
                if (new_uid) {
-                       if (!e_cal_cache_get_component (cal_cache, new_uid, 
id->rid, out_new_comp, cancellable, NULL))
-                               *out_new_comp = NULL;
+                       if (!e_cal_cache_get_component (cal_cache, new_uid, 
id->rid, out_new_comp, cancellable, NULL) &&
+                           !e_cal_cache_get_component (cal_cache, new_uid, 
NULL, out_new_comp, cancellable, NULL))
+                               *out_new_comp = new_comp ? g_object_ref 
(new_comp) : NULL;
                } else {
                        *out_new_comp = new_comp ? g_object_ref (new_comp) : 
NULL;
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.3/src/camel/camel-offline-folder.c 
new/evolution-data-server-3.32.4/src/camel/camel-offline-folder.c
--- old/evolution-data-server-3.32.3/src/camel/camel-offline-folder.c   
2019-06-17 15:21:44.000000000 +0200
+++ new/evolution-data-server-3.32.4/src/camel/camel-offline-folder.c   
2019-07-15 10:56:38.000000000 +0200
@@ -28,6 +28,7 @@
 #include "camel-offline-store.h"
 #include "camel-operation.h"
 #include "camel-session.h"
+#include "camel-string-utils.h"
 #include "camel-utils.h"
 
 #define CAMEL_OFFLINE_FOLDER_GET_PRIVATE(obj) \
@@ -43,6 +44,9 @@
        GMutex store_changes_lock;
        guint store_changes_id;
        gboolean store_changes_after_frozen;
+
+       GMutex ongoing_downloads_lock;
+       GHashTable *ongoing_downloads; /* gchar * UID ~> g_thread_self() */
 };
 
 struct _AsyncContext {
@@ -71,6 +75,60 @@
        g_slice_free (AsyncContext, async_context);
 }
 
+static gboolean
+offline_folder_synchronize_message_wrapper_sync (CamelFolder *folder,
+                                                const gchar *uid,
+                                                GCancellable *cancellable,
+                                                GError **error)
+{
+       CamelOfflineFolder *offline_folder;
+       gboolean success;
+
+       g_return_val_if_fail (CAMEL_IS_OFFLINE_FOLDER (folder), FALSE);
+       g_return_val_if_fail (uid != NULL, FALSE);
+
+       offline_folder = CAMEL_OFFLINE_FOLDER (folder);
+
+       g_mutex_lock (&offline_folder->priv->ongoing_downloads_lock);
+       /* Another thread is downloading this message already, do not wait for 
it,
+          just move on to the next one. In case the previous/ongoing download
+          fails the message won't be downloaded. */
+       if (g_hash_table_contains (offline_folder->priv->ongoing_downloads, 
uid)) {
+               if (camel_debug ("downsync")) {
+                       printf ("[downsync]          %p: (%s : %s): skipping 
uid '%s', because it is already downloading by thread %p (this thread is 
%p)\n", camel_folder_get_parent_store (folder),
+                               camel_service_get_display_name (CAMEL_SERVICE 
(camel_folder_get_parent_store (folder))), camel_folder_get_full_name (folder),
+                               uid, g_hash_table_lookup 
(offline_folder->priv->ongoing_downloads, uid), g_thread_self ());
+               }
+               g_mutex_unlock (&offline_folder->priv->ongoing_downloads_lock);
+               return TRUE;
+       } else {
+               g_hash_table_insert (offline_folder->priv->ongoing_downloads, 
(gpointer) camel_pstring_strdup (uid), g_thread_self ());
+       }
+
+       if (camel_debug ("downsync")) {
+               printf ("[downsync]          %p: (%s : %s): going to download 
uid '%s' in thread %p\n", camel_folder_get_parent_store (folder),
+                       camel_service_get_display_name (CAMEL_SERVICE 
(camel_folder_get_parent_store (folder))), camel_folder_get_full_name (folder),
+                       uid, g_thread_self ());
+       }
+
+       g_mutex_unlock (&offline_folder->priv->ongoing_downloads_lock);
+
+       success = camel_folder_synchronize_message_sync (folder, uid, 
cancellable, error);
+
+       g_mutex_lock (&offline_folder->priv->ongoing_downloads_lock);
+       g_warn_if_fail (g_hash_table_remove 
(offline_folder->priv->ongoing_downloads, uid));
+
+       if (camel_debug ("downsync")) {
+               printf ("[downsync]          %p: (%s : %s): finished download 
of uid '%s' in thread %p, %s\n", camel_folder_get_parent_store (folder),
+                       camel_service_get_display_name (CAMEL_SERVICE 
(camel_folder_get_parent_store (folder))), camel_folder_get_full_name (folder),
+                       uid, g_thread_self (), success ? "success" : "failure");
+       }
+
+       g_mutex_unlock (&offline_folder->priv->ongoing_downloads_lock);
+
+       return success;
+}
+
 static void
 offline_downsync_data_free (OfflineDownsyncData *data)
 {
@@ -160,7 +218,7 @@
                                        continue;
                        }
 
-                       success = camel_folder_synchronize_message_sync (
+                       success = 
offline_folder_synchronize_message_wrapper_sync (
                                data->folder, uid, cancellable, error);
                }
        } else {
@@ -386,6 +444,9 @@
        CamelOfflineFolder *offline_folder = CAMEL_OFFLINE_FOLDER (object);
 
        g_mutex_clear (&offline_folder->priv->store_changes_lock);
+       g_mutex_clear (&offline_folder->priv->ongoing_downloads_lock);
+
+       g_hash_table_destroy (offline_folder->priv->ongoing_downloads);
 
        /* Chain up to parent's method. */
        G_OBJECT_CLASS (camel_offline_folder_parent_class)->finalize (object);
@@ -530,7 +591,7 @@
                                camel_folder_get_full_name (folder));
 
                        /* Stop on failure */
-                       if (!camel_folder_synchronize_message_sync (folder, 
uid, cancellable, &local_error)) {
+                       if (!offline_folder_synchronize_message_wrapper_sync 
(folder, uid, cancellable, &local_error)) {
                                if (camel_debug ("downsync")) {
                                        printf ("[downsync]          %p: (%s : 
%s): aborting, failed to download uid:%s error:%s\n", 
camel_folder_get_parent_store (folder),
                                                camel_service_get_display_name 
(CAMEL_SERVICE (camel_folder_get_parent_store (folder))), 
camel_folder_get_full_name (folder),
@@ -539,10 +600,6 @@
                                g_clear_error (&local_error);
                                camel_operation_pop_message (cancellable);
                                break;
-                       } else if (camel_debug ("downsync")) {
-                               printf ("[downsync]          %p: (%s : %s): uid 
'%s' downloaded\n", camel_folder_get_parent_store (folder),
-                                       camel_service_get_display_name 
(CAMEL_SERVICE (camel_folder_get_parent_store (folder))), 
camel_folder_get_full_name (folder),
-                                       uid);
                        }
 
                        camel_operation_pop_message (cancellable);
@@ -603,8 +660,10 @@
        folder->priv = CAMEL_OFFLINE_FOLDER_GET_PRIVATE (folder);
 
        g_mutex_init (&folder->priv->store_changes_lock);
+       g_mutex_init (&folder->priv->ongoing_downloads_lock);
        folder->priv->store_changes_after_frozen = FALSE;
        folder->priv->offline_sync = CAMEL_THREE_STATE_INCONSISTENT;
+       folder->priv->ongoing_downloads = g_hash_table_new_full (g_str_hash, 
g_str_equal, (GDestroyNotify) camel_pstring_free, NULL);
 
        g_signal_connect (
                folder, "changed",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.3/src/camel/camel-offline-store.c 
new/evolution-data-server-3.32.4/src/camel/camel-offline-store.c
--- old/evolution-data-server-3.32.3/src/camel/camel-offline-store.c    
2019-06-17 15:21:44.000000000 +0200
+++ new/evolution-data-server-3.32.4/src/camel/camel-offline-store.c    
2019-07-15 10:56:38.000000000 +0200
@@ -155,12 +155,7 @@
                g_object_notify (object, "online");
        else if (g_strcmp0 (pspec->name, "connection-status") == 0 &&
                 camel_service_get_connection_status (CAMEL_SERVICE (object)) 
== CAMEL_SERVICE_DISCONNECTED) {
-               CamelOfflineStore *store = CAMEL_OFFLINE_STORE (object);
-
-               if (store->priv->online) {
-                       store->priv->online = FALSE;
-                       g_object_notify (object, "online");
-               }
+               g_object_notify (object, "online");
        }
 
        /* Chain up to parent's notify() method. */
@@ -253,8 +248,10 @@
 
        g_return_val_if_fail (CAMEL_IS_OFFLINE_STORE (store), FALSE);
 
-       if (camel_offline_store_get_online (store) == online)
+       if (camel_offline_store_get_online (store) == online && (!online ||
+           camel_service_get_connection_status (CAMEL_SERVICE (store)) == 
CAMEL_SERVICE_CONNECTED)) {
                return TRUE;
+       }
 
        service = CAMEL_SERVICE (store);
 
@@ -273,7 +270,8 @@
                                CAMEL_NETWORK_SERVICE (store));
        }
 
-       store_is_online = camel_offline_store_get_online (store);
+       store_is_online = camel_offline_store_get_online (store) &&
+               camel_service_get_connection_status (service) == 
CAMEL_SERVICE_CONNECTED;
 
        /* Returning to online mode is the simpler case. */
        if (!store_is_online) {


Reply via email to