Moving recurring event to a different calendar creates broken or incomplete cache.
I create an event repeating twice. Evolution-calendar-factory uploads:
> PUT /dav/calendars/user/zzz%40example.org/208cb106-6228-4bcc-af3b-23b7f38c9deb/89cfb512324145157762fd093ab79a7d01121ae9.ics HTTP/1.1
> Soup-Debug-Timestamp: 1651039448
> Soup-Debug: EWebDAVSession 1 (0x7f93c8007490), SoupMessage 6 (0x7f941c007760), SoupSocket 6 (0x7f93cc00f450)
> Host: zzz.example.org
> User-Agent: Evolution/3.45.1
> Connection: close
> Cache-Control: no-cache
> Pragma: no-cache
> If-None-Match: *
> Prefer: return=minimal
> Content-Type: text/calendar; charset="utf-8"
> Accept-Encoding: gzip, deflate
> Accept-Language: en-gb, en;q=0.9
> Authorization: Basic [zzz@example.org:*****]
>
> BEGIN:VCALENDAR
> CALSCALE:GREGORIAN
> PRODID:-//Ximian//NONSGML Evolution Calendar//EN
> VERSION:2.0
> BEGIN:VTIMEZONE
> TZID:Europe/Sofia
> X-LIC-LOCATION:Europe/Sofia
> BEGIN:DAYLIGHT
> TZNAME:EEST
> TZOFFSETFROM:+0200
> TZOFFSETTO:+0300
> DTSTART:19970330T030000
> RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=20370329T010000Z
> END:DAYLIGHT
> BEGIN:STANDARD
> TZNAME:EET
> TZOFFSETFROM:+0300
> TZOFFSETTO:+0200
> DTSTART:19971026T040000
> RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=20361026T010000Z
> END:STANDARD
> BEGIN:STANDARD
> TZNAME:EET
> TZOFFSETFROM:+0300
> TZOFFSETTO:+0200
> DTSTART:20371025T040000
> RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
> END:STANDARD
> BEGIN:DAYLIGHT
> TZNAME:EEST
> TZOFFSETFROM:+0200
> TZOFFSETTO:+0300
> DTSTART:20380328T030000
> RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
> END:DAYLIGHT
> END:VTIMEZONE
> BEGIN:VEVENT
> UID:89cfb512324145157762fd093ab79a7d01121ae9
> DTSTAMP:20220427T060307Z
> DTSTART;TZID=Europe/Sofia:20220427T190000
> DTEND;TZID=Europe/Sofia:20220427T200000
> SEQUENCE:2
> SUMMARY:Twice
> TRANSP:OPAQUE
> RRULE:FREQ=DAILY;COUNT=2
> CLASS:PUBLIC
> CREATED:20220427T060408Z
> LAST-MODIFIED:20220427T060408Z
> END:VEVENT
> END:VCALENDAR
< HTTP/1.1 201 Created
< Soup-Debug-Timestamp: 1651039448
< Soup-Debug: SoupMessage 6 (0x7f941c007760)
< Server: nginx
< Date: Wed, 27 Apr 2022 06:04:08 GMT
< Content-Length: 0
< Connection: close
< Cache-Control: no-cache
< Accept-Patch: text/calendar; charset=utf-8; component=VPATCH; optinfo="PATCH-VERSION:1"
< Accept-Encoding: deflate, gzip
< ETag: "0fdf64964f987ceb42087ab0eb7dfc28cfa0223a"
I open the second instance of the event and select from the top a different calendar, to a different account. Save && Close. “You are modifying a recurring event. What would you like to modify?” → “All Instances” → OK. Evolution-calendar-factory uploads:
> PUT /dav/calendars/user/aaa%40example.org/B2/89cfb512324145157762fd093ab79a7d01121ae9.ics HTTP/1.1
> Soup-Debug-Timestamp: 1651039691
> Soup-Debug: EWebDAVSession 1 (0x7f93e803ade0), SoupMessage 6 (0x1946760), SoupSocket 6 (0x7f93c800c5d0)
> Host: example.org
> User-Agent: Evolution/3.45.1
> Connection: close
> Cache-Control: no-cache
> Pragma: no-cache
> If-None-Match: *
> Prefer: return=minimal
> Content-Type: text/calendar; charset="utf-8"
> Accept-Encoding: gzip, deflate
> Accept-Language: en-gb, en;q=0.9
> Authorization: Basic [aaa@example.org:***]
>
> BEGIN:VCALENDAR
> CALSCALE:GREGORIAN
> PRODID:-//Ximian//NONSGML Evolution Calendar//EN
> VERSION:2.0
> BEGIN:VTIMEZONE
> TZID:Europe/Sofia
> X-LIC-LOCATION:Europe/Sofia
> BEGIN:DAYLIGHT
> TZNAME:EEST
> TZOFFSETFROM:+0200
> TZOFFSETTO:+0300
> DTSTART:19970330T030000
> RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=20370329T010000Z
> END:DAYLIGHT
> BEGIN:STANDARD
> TZNAME:EET
> TZOFFSETFROM:+0300
> TZOFFSETTO:+0200
> DTSTART:19971026T040000
> RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=20361026T010000Z
> END:STANDARD
> BEGIN:STANDARD
> TZNAME:EET
> TZOFFSETFROM:+0300
> TZOFFSETTO:+0200
> DTSTART:20371025T040000
> RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
> END:STANDARD
> BEGIN:DAYLIGHT
> TZNAME:EEST
> TZOFFSETFROM:+0200
> TZOFFSETTO:+0300
> DTSTART:20380328T030000
> RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
> END:DAYLIGHT
> END:VTIMEZONE
> BEGIN:VEVENT
> UID:89cfb512324145157762fd093ab79a7d01121ae9
> DTSTAMP:20220427T060307Z
> DTSTART;TZID=Europe/Sofia:20220428T190000
> DTEND;TZID=Europe/Sofia:20220428T200000
> SEQUENCE:3
> SUMMARY:Twice
> TRANSP:OPAQUE
> CLASS:PUBLIC
> CREATED:20220427T060408Z
> LAST-MODIFIED:20220427T060408Z
> RECURRENCE-ID;TZID=Europe/Sofia:20220428T190000
> RRULE:FREQ=DAILY;COUNT=2
> END:VEVENT
> END:VCALENDAR
< HTTP/1.1 201 Created
< Soup-Debug-Timestamp: 1651039693
< Soup-Debug: SoupMessage 6 (0x1946760)
< Date: Wed, 27 Apr 2022 06:08:13 GMT
< Content-Length: 0
< Connection: close
< Cache-Control: no-cache
< Accept-Patch: text/calendar; charset=utf-8; component=VPATCH; optinfo="PATCH-VERSION:1"
< Accept-Encoding: deflate, gzip
< ETag: "e01612243cf3c0216aba225c88f6331d85765684"
<
> DELETE /dav/calendars/user/zzz%40example.org/208cb106-6228-4bcc-af3b-23b7f38c9deb/89cfb512324145157762fd093ab79a7d01121ae9.ics HTTP/1.1
> Soup-Debug-Timestamp: 1651039699
> Soup-Debug: EWebDAVSession 1 (0x7f93c8007490), SoupMessage 7 (0x7f942812e8c0), SoupSocket 7 (0x7f93cc00f520)
> Host: zzz.example.org
> User-Agent: Evolution/3.45.1
> Connection: close
> Cache-Control: no-cache
> Pragma: no-cache
> Accept-Encoding: gzip, deflate
> Accept-Language: en-gb, en;q=0.9
> Authorization: Basic [zzz@example.org:*****]
< HTTP/1.1 204 No Content
< Soup-Debug-Timestamp: 1651039699
< Soup-Debug: SoupMessage 7 (0x7f942812e8c0)
< Date: Wed, 27 Apr 2022 06:08:19 GMT
< Connection: close
< Cache-Control: no-cache
<
The uploaded file in the second calendar has “RECURRENCE-ID;TZID=Europe/Sofia:20220428T190000”, thus it is a single instance.
I open it, change the SUMMARY and save. “You are modifying a recurring event. What would you like to modify?” → “All Instances” → OK. Now comes the error:
«Failed to modify an event in the calendar “aaa@example.org : ABCDEF”
Cannot modify calendar object: Missing information about component URL, local cache is possibly incomplete or broken. Remove it, please.»
- Evolution-calendar-factory shall not create possibly incomplete or broken local cache in this case.
- When moving series of events from one calendar to another, all events must be moved, and the destination event shall not suddenly include “RECURRENCE-ID:”.