3f5db7d9

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

ical-recurrence: compare a UTC Until in the time zone of DTSTART

@
The UNTIL rule part defines a DATE or DATE-TIME value that bounds
the recurrence rule in an inclusive manner.
@

@
If the "DTSTART" property
is specified as a date with UTC time or a date with local time and time
zone reference, then the UNTIL rule part MUST be specified as a date
with UTC time.
@

A zoned DTSTART is therefore bounded by an UNTIL in UTC, while the
occurrences are generated as local times in that same zone.  Comparing
the two directly is out by the zone's offset: east of UTC the last
instance is dropped, west of it an instance past the bound is kept.

Unresolve the UNTIL into DTSTART's time zone before handing the rule to
recurRecurrenceRuleDateTimeStarts.  Moving the bound rather than the
occurrences keeps recurRecurrenceRuleLocalTimes taking a bare LocalTime,
which it has to, since it has no time zone to resolve with and lives in a
module that ICal.Recurrence imports rather than the other way around.
A UTC or floating DTSTART is untouched, because there the local times and
the UNTIL are already in the same frame.
coverage-reportforwardCompatibilitynixpkgs-25_11pre-commitconfiguredevShelldefaultx86_64-linux