From 64ff74e5d276bc35afa94312c901256834d36907 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sat, 4 Jul 2026 23:35:50 +0200 Subject: [PATCH] =?UTF-8?q?Behebe=20Termin=C3=BCbersicht=20bei=20Wiederhol?= =?UTF-8?q?ungen=20mit=20UNTIL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gen_upcoming.py normalisiert dtstart auf naive lokale Zeit, reichte die laut RFC 5545 in UTC anzugebende UNTIL-Zeit der RRULE aber tz-aware an dateutil weiter. Die Mischung aus naivem dtstart und tz-awarer UNTIL lässt dateutil.rrule mit "RRULE UNTIL values must be specified in UTC when DTSTART is timezone-aware" abbrechen -- der Build schlägt fehl, sobald ein wiederkehrender Termin ein UNTIL enthält. Mit ignoretz=True wird die UNTIL-Zeit ebenfalls naiv behandelt, konsistent zur restlichen Verarbeitung. Für Termine ohne UNTIL ist das ein No-Op. Fixes: 2e3a02af0cf4 ("refacture all the things!") Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Hauke Mehrtens --- tools/gen_upcoming.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/gen_upcoming.py b/tools/gen_upcoming.py index 33b093d..31763f7 100755 --- a/tools/gen_upcoming.py +++ b/tools/gen_upcoming.py @@ -44,7 +44,10 @@ def parse_recurring_event(event, start, end): logging.info(f"Processing recurring event {event['SUMMARY'].to_ical().decode('utf-8')}") dtstart = parse(event["DTSTART"].to_ical()) rs = rruleset() - rs.rrule(rrulestr(event["RRULE"].to_ical().decode("utf-8"), dtstart=dtstart)) + # dtstart is normalized to naive local time above; pass ignoretz so a + # tz-aware UNTIL (RFC 5545 requires UTC for it) is treated as naive too, + # otherwise dateutil rejects the naive/aware mismatch. + rs.rrule(rrulestr(event["RRULE"].to_ical().decode("utf-8"), dtstart=dtstart, ignoretz=True)) if "EXDATE" in event.keys(): for exdate in event["EXDATE"]: rs.exdate(parse(exdate.to_ical()))