No description
Find a file
randogoth edb16204fa Pull Google calendars into their local vdirs
The Google equivalent of the pimsync pull, which pimsync cannot do: incremental
fetch by syncToken, converted to iCalendar and written into the endpoint's vdir.
A cursor Google no longer accepts comes back as 410, which means start again
rather than something broke, so that case refetches instead of failing.

The conversion was written against what the API actually returns, having probed
a real calendar first. Three findings shaped it:

- A recurring event's exceptions carry the same iCalUID as their master, so a
  series belongs in one file, which is exactly the vdir convention.
- start.dateTime is an absolute instant while start.timeZone names the zone the
  recurrence expands in, and the two need not agree: a real event reads
  2023-10-31T13:00:00+02:00 with timeZone Asia/Karachi, which is +05:00.
  Emitting the instant under that TZID unconverted would move it three hours, so
  the instant is converted into its zone. That needs a timezone database, hence
  jiff.
- A deleted occurrence arrives as an override with status cancelled. That is an
  absence rather than an event, so it becomes an EXDATE on the master; moved
  occurrences become RECURRENCE-ID events.

Timed values are written in UTC unless the event recurs. Only a recurrence needs
a zone to expand in, and confining TZID to those events limits how far we depend
on clients tolerating a TZID with no VTIMEZONE alongside it.

Verified against a live calendar: 30 real events, including a weekly series with
both a cancelled and several moved occurrences, converted and re-parsed intact.

The retarget tests no longer run a full cycle. They had used Google endpoints as
inert local stand-ins, which stopped being true the moment sync learned to
contact Google; they now reconcile directly.

115 tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 13:19:34 +03:00
src Pull Google calendars into their local vdirs 2026-09-10 13:19:34 +03:00
.gitignore Add Google OAuth, and let feed URLs come from a secret command 2026-09-10 13:01:06 +03:00
Cargo.lock Pull Google calendars into their local vdirs 2026-09-10 13:19:34 +03:00
Cargo.toml Pull Google calendars into their local vdirs 2026-09-10 13:19:34 +03:00
devbox.json Scaffold calcalist: repo, toolchain, config model and doctor 2026-09-10 09:31:32 +03:00
devbox.lock Scaffold calcalist: repo, toolchain, config model and doctor 2026-09-10 09:31:32 +03:00
SPECS.md Scaffold calcalist: repo, toolchain, config model and doctor 2026-09-10 09:31:32 +03:00
TODO.md Pull Google calendars into their local vdirs 2026-09-10 13:19:34 +03:00