75c01d2a

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.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 19s 1s 1s 21s 19s
Eval 22s 14s 14s 37s 1s
Build 36s 6m03s 6m12s 6m49s 3m21s
Suite 19s 6m19s 6m29s 6m49s 3m42s