diff options
| author | Craig Jennings <c@cjennings.net> | 2025-11-17 02:54:02 -0600 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2025-11-17 02:54:02 -0600 |
| commit | 0afa3fba94157d5e18f9a086e0b67b7cfd2aedf0 (patch) | |
| tree | 08178068136b5bdf2847921cf14b65cce7f09f5a /modules | |
| parent | cee86049043be47d82a274a1202641fc0a5c68b4 (diff) | |
fix(calendar-sync): Remove carriage return characters from synced events
Problem:
Google Calendar .ics files use CRLF line endings (RFC 5545 spec), which
resulted in 11,685 ^M (CR) characters appearing in gcal.org, particularly
at the end of org header lines.
Solution:
- Created calendar-sync--normalize-line-endings function to strip all \r
characters from .ics content
- Integrated into calendar-sync--fetch-ics immediately after curl download
- Ensures clean Unix LF-only line endings throughout parsing pipeline
Testing:
- Added comprehensive test suite: test-calendar-sync--normalize-line-endings.el
- 16 tests covering Normal, Boundary, and Error cases
- All 56 existing calendar-sync tests still pass (no regressions)
- Verified: gcal.org now has 0 CR characters (was 11,685)
Files modified:
- modules/calendar-sync.el: Added normalize function, updated fetch function
- tests/test-calendar-sync--normalize-line-endings.el: New comprehensive test suite
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/calendar-sync.el | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/modules/calendar-sync.el b/modules/calendar-sync.el index 8450b282..feb7188d 100644 --- a/modules/calendar-sync.el +++ b/modules/calendar-sync.el @@ -144,6 +144,20 @@ Example: -21600 → 'UTC-6' or 'UTC-6:00'." (error (message "calendar-sync: Error loading state: %s" (error-message-string err)))))) +;;; Line Ending Normalization + +(defun calendar-sync--normalize-line-endings (content) + "Normalize line endings in CONTENT to Unix format (LF only). +Removes all carriage return characters (\\r) from CONTENT. +The iCalendar format (RFC 5545) uses CRLF line endings, but Emacs +and org-mode expect LF only. This function ensures consistent line +endings throughout the parsing pipeline. + +Returns CONTENT with all \\r characters removed." + (if (not (stringp content)) + content + (replace-regexp-in-string "\r" "" content))) + ;;; .ics Parsing (defun calendar-sync--split-events (ics-content) @@ -293,7 +307,7 @@ Events are sorted chronologically by start time." (defun calendar-sync--fetch-ics (url) "Fetch .ics file from URL using curl. -Returns .ics content as string, or nil on error. +Returns .ics content as string with normalized Unix line endings (LF only), or nil on error. Uses curl instead of url-retrieve-synchronously to avoid daemon mode hanging." (condition-case err (with-temp-buffer @@ -303,7 +317,7 @@ Uses curl instead of url-retrieve-synchronously to avoid daemon mode hanging." "-m" "10" ; Max 10 seconds url))) (if (= exit-code 0) - (buffer-string) + (calendar-sync--normalize-line-endings (buffer-string)) (setq calendar-sync--last-error (format "curl exited with code %d" exit-code)) (message "calendar-sync: Fetch error: %s" calendar-sync--last-error) nil))) |
