diff options
author | Milan Crha <mcrha@redhat.com> | 2021-06-10 11:49:53 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2021-06-10 11:52:26 +0200 |
commit | acbab8a2dd106dfbff5fa54b3eb350941df47335 (patch) | |
tree | 25d755a30eaedc0ca64497964a6adf899b05c3c8 | |
parent | b9785b895ee15815701d4056ebee0debf75f192f (diff) | |
download | evolution-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
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); |