aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-13 12:12:35 -0500
committerCraig Jennings <c@cjennings.net>2026-07-13 12:12:35 -0500
commita9e61207f6c806271cbc69fe27fde04b22e34e0a (patch)
treeacdfc94f218cdfb47da2498309e3fa4469578fe6 /modules
parent904e8885eeb66a48cce281aff23d0f6c754f3c10 (diff)
downloaddotemacs-a9e61207f6c806271cbc69fe27fde04b22e34e0a.tar.gz
dotemacs-a9e61207f6c806271cbc69fe27fde04b22e34e0a.zip
bug: fixing exdate lines and adding tests
Diffstat (limited to 'modules')
-rw-r--r--modules/calendar-sync-recurrence.el15
1 files changed, 9 insertions, 6 deletions
diff --git a/modules/calendar-sync-recurrence.el b/modules/calendar-sync-recurrence.el
index 72576a6f..bc1cc92f 100644
--- a/modules/calendar-sync-recurrence.el
+++ b/modules/calendar-sync-recurrence.el
@@ -193,21 +193,24 @@ Handles both simple values and values with parameters like TZID."
(when (and event-str (stringp event-str) (not (string-empty-p event-str)))
(let ((exdates '())
(pos 0))
- ;; Find all EXDATE lines
+ ;; Find all EXDATE lines. One line may carry several comma-separated
+ ;; datetimes (RFC 5545); split them so each is excluded individually.
(while (string-match "^EXDATE[^:\n]*:\\([^\n]+\\)" event-str pos)
- (push (match-string 1 event-str) exdates)
+ (dolist (val (split-string (match-string 1 event-str) "," t))
+ (push val exdates))
(setq pos (match-end 0)))
(nreverse exdates))))
(defun calendar-sync--get-exdate-line (event-str exdate-value)
"Find the full EXDATE line containing EXDATE-VALUE from EVENT-STR.
Returns the complete line like
-`EXDATE;TZID=America/New_York:20260210T130000'.
-Returns nil if not found."
+`EXDATE;TZID=America/New_York:20260210T130000'. Matches the value anywhere
+in the value list, so a comma-separated line's shared TZID reaches every
+value on it. Returns nil if not found."
(when (and event-str (stringp event-str) exdate-value)
- (let ((pattern (format "^\\(EXDATE[^:]*:%s\\)" (regexp-quote exdate-value))))
+ (let ((pattern (format "^EXDATE[^:\n]*:[^\n]*%s" (regexp-quote exdate-value))))
(when (string-match pattern event-str)
- (match-string 1 event-str)))))
+ (match-string 0 event-str)))))
(defalias 'calendar-sync--parse-exdate #'calendar-sync--parse-ics-datetime
"Parse EXDATE value. See `calendar-sync--parse-ics-datetime'.")