summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2021-06-10 11:49:53 +0200
committerMilan Crha <mcrha@redhat.com>2021-06-10 11:52:26 +0200
commitacbab8a2dd106dfbff5fa54b3eb350941df47335 (patch)
tree25d755a30eaedc0ca64497964a6adf899b05c3c8
parentb9785b895ee15815701d4056ebee0debf75f192f (diff)
downloadevolution-data-server-acbab8a2dd106dfbff5fa54b3eb350941df47335.tar.gz
I#336 - Handle "Object is out of sync" during backend refresh better
This lets the local offline changes being overwritten by the server changes when the server has changed the object. Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/336
-rw-r--r--src/addressbook/backends/carddav/e-book-backend-carddav.c16
-rw-r--r--src/addressbook/libedata-book/e-book-meta-backend.c2
-rw-r--r--src/calendar/backends/caldav/e-cal-backend-caldav.c16
-rw-r--r--src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c16
-rw-r--r--src/calendar/libedata-cal/e-cal-meta-backend.c2
5 files changed, 44 insertions, 8 deletions
diff --git a/src/addressbook/backends/carddav/e-book-backend-carddav.c b/src/addressbook/backends/carddav/e-book-backend-carddav.c
index 0f587eaef..17211b148 100644
--- a/src/addressbook/backends/carddav/e-book-backend-carddav.c
+++ b/src/addressbook/backends/carddav/e-book-backend-carddav.c
@@ -1285,7 +1285,13 @@ ebb_carddav_save_contact_sync (EBookMetaBackend *meta_backend,
if (overwrite_existing && g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_PRECONDITION_FAILED)) {
g_clear_error (&local_error);
- local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
+
+ /* Pretend success when using the serer version on conflict,
+ the component will be updated during the refresh */
+ if (conflict_resolution == E_CONFLICT_RESOLUTION_KEEP_SERVER)
+ success = TRUE;
+ else
+ local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
}
if (local_error) {
@@ -1374,7 +1380,13 @@ ebb_carddav_remove_contact_sync (EBookMetaBackend *meta_backend,
success = TRUE;
} else if (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_PRECONDITION_FAILED)) {
g_clear_error (&local_error);
- local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
+
+ /* Pretend success when using the serer version on conflict,
+ the component will be updated during the refresh */
+ if (conflict_resolution == E_CONFLICT_RESOLUTION_KEEP_SERVER)
+ success = TRUE;
+ else
+ local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
}
if (local_error) {
diff --git a/src/addressbook/libedata-book/e-book-meta-backend.c b/src/addressbook/libedata-book/e-book-meta-backend.c
index 11aeac40e..9d50cc6b7 100644
--- a/src/addressbook/libedata-book/e-book-meta-backend.c
+++ b/src/addressbook/libedata-book/e-book-meta-backend.c
@@ -813,7 +813,7 @@ ebmb_refresh_internal_sync (EBookMetaBackend *meta_backend,
} else {
GError *local_error = NULL;
- success = ebmb_upload_local_changes_sync (meta_backend, book_cache, E_CONFLICT_RESOLUTION_FAIL, cancellable, &local_error);
+ success = ebmb_upload_local_changes_sync (meta_backend, book_cache, E_CONFLICT_RESOLUTION_KEEP_SERVER, cancellable, &local_error);
if (local_error) {
if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_HOST_NOT_FOUND))
diff --git a/src/calendar/backends/caldav/e-cal-backend-caldav.c b/src/calendar/backends/caldav/e-cal-backend-caldav.c
index 5f2c9bbad..7fc2e8e5e 100644
--- a/src/calendar/backends/caldav/e-cal-backend-caldav.c
+++ b/src/calendar/backends/caldav/e-cal-backend-caldav.c
@@ -1524,7 +1524,13 @@ ecb_caldav_save_component_sync (ECalMetaBackend *meta_backend,
if (overwrite_existing && g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_PRECONDITION_FAILED)) {
g_clear_error (&local_error);
- local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
+
+ /* Pretend success when using the serer version on conflict,
+ the component will be updated during the refresh */
+ if (conflict_resolution == E_CONFLICT_RESOLUTION_KEEP_SERVER)
+ success = TRUE;
+ else
+ local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
}
if (local_error) {
@@ -1613,7 +1619,13 @@ ecb_caldav_remove_component_sync (ECalMetaBackend *meta_backend,
success = TRUE;
} else if (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_PRECONDITION_FAILED)) {
g_clear_error (&local_error);
- local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
+
+ /* Pretend success when using the serer version on conflict,
+ the component will be updated during the refresh */
+ if (conflict_resolution == E_CONFLICT_RESOLUTION_KEEP_SERVER)
+ success = TRUE;
+ else
+ local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
}
if (local_error) {
diff --git a/src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c b/src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c
index 2d27b08b4..906ade966 100644
--- a/src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c
+++ b/src/calendar/backends/webdav-notes/e-cal-backend-webdav-notes.c
@@ -1172,7 +1172,13 @@ ecb_webdav_notes_save_component_sync (ECalMetaBackend *meta_backend,
if (overwrite_existing && g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_PRECONDITION_FAILED)) {
g_clear_error (&local_error);
- local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
+
+ /* Pretend success when using the serer version on conflict,
+ the component will be updated during the refresh */
+ if (conflict_resolution == E_CONFLICT_RESOLUTION_KEEP_SERVER)
+ success = TRUE;
+ else
+ local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
}
if (local_error) {
@@ -1237,7 +1243,13 @@ ecb_webdav_notes_remove_component_sync (ECalMetaBackend *meta_backend,
success = TRUE;
} else if (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_PRECONDITION_FAILED)) {
g_clear_error (&local_error);
- local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
+
+ /* Pretend success when using the serer version on conflict,
+ the component will be updated during the refresh */
+ if (conflict_resolution == E_CONFLICT_RESOLUTION_KEEP_SERVER)
+ success = TRUE;
+ else
+ local_error = EC_ERROR (E_CLIENT_ERROR_OUT_OF_SYNC);
}
if (local_error) {
diff --git a/src/calendar/libedata-cal/e-cal-meta-backend.c b/src/calendar/libedata-cal/e-cal-meta-backend.c
index 7dd5ad065..a12e778e9 100644
--- a/src/calendar/libedata-cal/e-cal-meta-backend.c
+++ b/src/calendar/libedata-cal/e-cal-meta-backend.c
@@ -714,7 +714,7 @@ ecmb_refresh_internal_sync (ECalMetaBackend *meta_backend,
} else {
GError *local_error = NULL;
- success = ecmb_upload_local_changes_sync (meta_backend, cal_cache, E_CONFLICT_RESOLUTION_FAIL, cancellable, &local_error);
+ success = ecmb_upload_local_changes_sync (meta_backend, cal_cache, E_CONFLICT_RESOLUTION_KEEP_SERVER, cancellable, &local_error);
if (local_error) {
if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_HOST_NOT_FOUND))
e_backend_set_online (E_BACKEND (meta_backend), FALSE);