<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs.git/modules/calendar-sync.el, branch v0.7.2</title>
<subtitle>my Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2</id>
<link rel='self' href='https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/'/>
<updated>2026-04-03T13:33:33+00:00</updated>
<entry>
<title>feat(music): add random-aware next/previous; refactor music + calendar-sync</title>
<updated>2026-04-03T13:33:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-03T13:33:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=eb01b3d24739e916d9dca33f5f039650a9de8457'/>
<id>urn:sha1:eb01b3d24739e916d9dca33f5f039650a9de8457</id>
<content type='text'>
Music: random mode now respected by next/previous keys. Previous navigates
a 50-track play history ring buffer. Fixed playlist replacement bug.
24 new tests.

Calendar-sync: consolidated duplicate parse functions, extracted timezone
localization helper, unified expand-daily/monthly/yearly into parameterized
function, removed dead code. 33 new characterization tests. -90 lines.
</content>
</entry>
<entry>
<title>fix(calendar-sync): handle variable-length date lists in RRULE UNTIL</title>
<updated>2026-03-10T04:40:26+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-10T04:40:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=4080daf948b23d0b6b59394623e12983f0a9cfad'/>
<id>urn:sha1:4080daf948b23d0b6b59394623e12983f0a9cfad</id>
<content type='text'>
date-to-time used (reverse date) which broke when RRULE UNTIL values
were parsed as 5-element lists (year month day hour minute) from UTC
timestamps. This caused recurring events with UTC UNTIL dates to
expand to 0 occurrences, producing stale calendar entries.
</content>
</entry>
<entry>
<title>chore: rename chime.el references to Chime</title>
<updated>2026-02-23T11:14:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-23T11:14:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=6ec4857d0c4c1f43b42bb83c355e150f1aabd4d8'/>
<id>urn:sha1:6ec4857d0c4c1f43b42bb83c355e150f1aabd4d8</id>
<content type='text'>
Update load-path, GitHub URL, and all project/package name
references to reflect the chime.el → Chime rename.
</content>
</entry>
<entry>
<title>perf(calendar-sync): replace shell-out timezone conversion with pure Elisp</title>
<updated>2026-02-14T23:19:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-14T23:19:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=855845815c626b15c1ca739ee91381b393c86af6'/>
<id>urn:sha1:855845815c626b15c1ca739ee91381b393c86af6</id>
<content type='text'>
convert-tz-to-local was spawning a `date` subprocess per timestamp,
causing ~15s parse freezes on Proton (223 events) and ~10s on Google
(1543 events). Replaced with encode-time/decode-time ZONE argument —
same TZ database, no subprocess overhead. Parse times now 0.2-2.8s.

Also adds phase timing instrumentation behind cj/debug-modules flag.
</content>
</entry>
<entry>
<title>fix(calendar-sync): increase fetch timeout for large calendars</title>
<updated>2026-02-06T16:26:05+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-06T16:26:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=25a2acb634212455abeb0a0c8fb1a97c3ece3a2c'/>
<id>urn:sha1:25a2acb634212455abeb0a0c8fb1a97c3ece3a2c</id>
<content type='text'>
Google calendar (7k+ events, 4.5MB) was hitting the 30s hard-coded curl
timeout. Use configurable calendar-sync-fetch-timeout (default 120s) with
a separate 10s connect-timeout for fast failure on unreachable hosts.
</content>
</entry>
<entry>
<title>fix(calendar-sync): sanitize description text to prevent org heading corruption</title>
<updated>2026-02-06T16:15:08+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-06T16:15:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=a980541c7300001181a25c2ed80401766d3abcaa'/>
<id>urn:sha1:a980541c7300001181a25c2ed80401766d3abcaa</id>
<content type='text'>
Event descriptions containing lines starting with * were being interpreted
as org headings, breaking file structure. Replace leading asterisks with
dashes before writing descriptions.
</content>
</entry>
<entry>
<title>fix(calendar-sync): fix heading order, continuation lines, and exception text cleaning</title>
<updated>2026-02-05T22:10:09+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-05T22:10:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=00ddf74b232b0762baa7826e62f6765d087041fb'/>
<id>urn:sha1:00ddf74b232b0762baa7826e62f6765d087041fb</id>
<content type='text'>
Three bugs found during manual verification of calendar sync output:

1. Heading/timestamp order reversed in event-to-org — nreverse pattern
   put timestamp before the org heading. Swap initial list order.

2. get-property continuation line regex broken — the ^ anchor in
   "^\n[ \t]" prevented matching at the correct position, truncating
   long DESCRIPTION values at the first ICS line fold. Remove anchor,
   add explicit position check (matching get-all-property-lines pattern).

3. collect-recurrence-exceptions didn't clean text — exception instances
   got raw ICS text (literal \n, HTML tags) replacing the cleaned base
   event text. Wrap summary/description/location in clean-text.
</content>
</entry>
<entry>
<title>feat(calendar-sync): add event details — attendees, organizer, status, URL</title>
<updated>2026-02-05T21:13:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-05T21:13:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=b7cb1c51e5663419344d8b55766635801f3ee4c8'/>
<id>urn:sha1:b7cb1c51e5663419344d8b55766635801f3ee4c8</id>
<content type='text'>
Add ICS text unescaping (RFC 5545), HTML stripping, and new fields
(attendees/status, organizer, meeting URL) to calendar-sync.el.
event-to-org now outputs org property drawers. 88 new tests across
10 test files, 146/146 pass. Also fix pre-existing test require
order and keymap guard issues.
</content>
</entry>
<entry>
<title>refactor(calendar): move calendar URLs into calendar-sync.el</title>
<updated>2026-02-04T11:41:08+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-04T11:41:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=3d6a6155b68ae194fc17f8e0ca877a7f934a46b7'/>
<id>urn:sha1:3d6a6155b68ae194fc17f8e0ca877a7f934a46b7</id>
<content type='text'>
Consolidate calendar configuration within the module itself rather
than requiring setup in init.el. Improves module encapsulation.
</content>
</entry>
<entry>
<title>feat(calendar-sync): add EXDATE support for excluded recurring event dates</title>
<updated>2026-02-03T14:09:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-03T14:09:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=09cfcfd6826f9bc8b379dde88e1d9ca719c1bdb2'/>
<id>urn:sha1:09cfcfd6826f9bc8b379dde88e1d9ca719c1bdb2</id>
<content type='text'>
When someone deletes a single instance of a recurring meeting in Google
Calendar, the calendar exports an EXDATE property marking that date as
excluded. Previously, calendar-sync expanded the RRULE without filtering
out these excluded dates, causing deleted instances to appear in org output.

New functions:
- calendar-sync--get-exdates: Extract all EXDATE values from event
- calendar-sync--get-exdate-line: Get full EXDATE line with parameters
- calendar-sync--parse-exdate: Parse EXDATE into datetime list
- calendar-sync--collect-exdates: Collect excluded dates with TZ conversion
- calendar-sync--exdate-matches-p: Check if occurrence matches an EXDATE
- calendar-sync--filter-exdates: Filter out excluded dates from occurrences

Modified calendar-sync--expand-recurring-event to collect and filter
EXDATEs after RRULE expansion.

Includes 47 new tests covering extraction, parsing, collection, filtering,
and integration with RECURRENCE-ID exceptions.
</content>
</entry>
</feed>
