Update import of basic recurrence rules
Conversion of COUNT to UNTIL was a simple calculation which assumed one repetiton per period (day, week, month or year); it does not take exception days and invalid dates into account. Solved by a new function which returns the n'th occurrence of a recurrence rule. In calcurse UNTIL is interpreted as a day (DATE), in RFC 5545 as a time of day (DATE-TIME). This has implications when a recurrence rule has an occurrence on the UNTIL day, see comment in ical.c An "Import:" note is added when a multi-day event is imported and turned into a calcurse all-day event. Icalendar quotes in comments have been updated to RFC 5545. Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This commit is contained in:
committed by
Lukas Fleischer
parent
d8c1c48e78
commit
d2791b046a
@@ -22,4 +22,31 @@ EXDATE:20000215T000000
|
||||
EXDATE:20000223T000000
|
||||
SUMMARY:Recurring appointment
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTART:20200526T120000
|
||||
DURATION:PT1H17M0S
|
||||
RRULE:FREQ=DAILY;UNTIL=20200529T130000
|
||||
SUMMARY: until May 29 2020\, 13:00
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTART:20200526T120000
|
||||
DURATION:PT1H17M0S
|
||||
RRULE:FREQ=DAILY;UNTIL=20200529T110000
|
||||
SUMMARY: until May 29 2020\, 11:00
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTART:20200531T214500
|
||||
DURATION:PT15M0S
|
||||
RRULE:FREQ=MONTHLY;COUNT=10
|
||||
EXDATE:20200731T214500,20210131T214500
|
||||
SUMMARY:monthly on 31th\, count 10\, exceptions 31/7/2020 and 31/1/2021
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTAMP:
|
||||
UID:
|
||||
DTSTART;VALUE=DATE:20200502
|
||||
DTEND;VALUE=DATE:20200504
|
||||
DESCRIPTION:The first weekend in May is a two-day event.
|
||||
SUMMARY:First weekend in May
|
||||
END:VEVENT
|
||||
END:VCALENDAR
|
||||
|
||||
@@ -111,6 +111,17 @@ RRULE:FREQ=MONTHLY;UNTIL=20201030
|
||||
EXDATE;VALUE=DATE:20200606T120000Z
|
||||
SUMMARY:Invalid EXDATE value
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTART:20200527T163000
|
||||
DTEND:20200528T163000
|
||||
DURATION:P1D
|
||||
SUMMARY:Both end time and duration
|
||||
END:VEVENT
|
||||
BEGIN:VEVENT
|
||||
DTSTART:20200527T163000
|
||||
DTEND:20200526T163000
|
||||
SUMMARY:End time before start
|
||||
END:VEVENT
|
||||
BEGIN:VTODO
|
||||
SUMMARY:finally\, missing end of item
|
||||
END:VCALENDAR
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/bin/sh
|
||||
# Recurrence rules.
|
||||
|
||||
. "${TEST_INIT:-./test-init.sh}"
|
||||
|
||||
@@ -7,11 +8,13 @@ if [ "$1" = 'actual' ]; then
|
||||
cp "$DATA_DIR/conf" .calcurse || exit 1
|
||||
"$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-003.ical"
|
||||
"$CALCURSE" -D "$PWD/.calcurse" -s01/01/2000 -r365
|
||||
"$CALCURSE" -D "$PWD/.calcurse" -s05/01/2020 --to 01/01/2022
|
||||
cat "$PWD/.calcurse/notes"/*
|
||||
rm -rf .calcurse || exit 1
|
||||
elif [ "$1" = 'expected' ]; then
|
||||
cat <<EOD
|
||||
Import process report: 0025 lines read
|
||||
3 apps / 0 events / 0 todos / 0 skipped
|
||||
Import process report: 0052 lines read
|
||||
6 apps / 1 event / 0 todos / 0 skipped
|
||||
01/01/00:
|
||||
- 00:00 -> 01:30
|
||||
Recurring appointment
|
||||
@@ -131,6 +134,76 @@ Import process report: 0025 lines read
|
||||
02/29/00:
|
||||
- 00:00 -> 01:30
|
||||
Recurring appointment
|
||||
05/02/20:
|
||||
* First weekend in May
|
||||
|
||||
05/03/20:
|
||||
* First weekend in May
|
||||
|
||||
05/26/20:
|
||||
- 12:00 -> 13:17
|
||||
until May 29 2020, 11:00
|
||||
- 12:00 -> 13:17
|
||||
until May 29 2020, 13:00
|
||||
|
||||
05/27/20:
|
||||
- 12:00 -> 13:17
|
||||
until May 29 2020, 11:00
|
||||
- 12:00 -> 13:17
|
||||
until May 29 2020, 13:00
|
||||
|
||||
05/28/20:
|
||||
- 12:00 -> 13:17
|
||||
until May 29 2020, 11:00
|
||||
- 12:00 -> 13:17
|
||||
until May 29 2020, 13:00
|
||||
|
||||
05/29/20:
|
||||
- 12:00 -> 13:17
|
||||
until May 29 2020, 13:00
|
||||
|
||||
05/31/20:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
08/31/20:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
10/31/20:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
12/31/20:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
03/31/21:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
05/31/21:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
07/31/21:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
08/31/21:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
10/31/21:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
|
||||
12/31/21:
|
||||
- 21:45 -> 22:00
|
||||
monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
|
||||
The first weekend in May is a two-day event.
|
||||
--
|
||||
Import: multi-day event changed to one-day event
|
||||
EOD
|
||||
else
|
||||
./run-test "$0"
|
||||
|
||||
@@ -7,6 +7,7 @@ if [ "$1" = 'actual' ]; then
|
||||
cp "$DATA_DIR/conf" .calcurse || exit 1
|
||||
"$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-005.ical"
|
||||
"$CALCURSE" -D "$PWD/.calcurse" -s10/03/2013 -r3
|
||||
cat "$PWD/.calcurse/notes"/*
|
||||
rm -rf .calcurse || exit 1
|
||||
elif [ "$1" = 'expected' ]; then
|
||||
cat <<EOD
|
||||
@@ -20,6 +21,7 @@ Import process report: 0023 lines read
|
||||
|
||||
10/04/13:
|
||||
* Two days
|
||||
Import: multi-day event changed to one-day event
|
||||
EOD
|
||||
else
|
||||
./run-test "$0"
|
||||
|
||||
@@ -17,10 +17,10 @@ if [ "$1" = 'actual' ]; then
|
||||
rm -rf .calcurse || exit 1
|
||||
elif [ "$1" = 'expected' ]; then
|
||||
cat <<EOD
|
||||
Import process report: 0116 lines read
|
||||
2 apps / 0 events / 1 todo / 18 skipped
|
||||
Import process report: 0127 lines read
|
||||
2 apps / 0 events / 1 todo / 20 skipped
|
||||
VEVENT [12]: invalid or malformed event start time.
|
||||
VEVENT [17]: recurrence frequency not recognized.
|
||||
VEVENT [17]: rrule frequency not supported.
|
||||
VEVENT [23]: malformed summary line.
|
||||
VTODO [28]: item priority is invalid (must be between 0 and 9).
|
||||
VEVENT [32]: malformed exceptions line.
|
||||
@@ -36,7 +36,9 @@ VEVENT [89]: invalid end time value type.
|
||||
VEVENT [94]: invalid until format.
|
||||
VEVENT [100]: invalid exception date value type.
|
||||
VEVENT [107]: invalid exception.
|
||||
VTODO [114]: The ical file seems to be malformed. The end of item was not found.
|
||||
VEVENT [114]: either end or duration.
|
||||
VEVENT [120]: end must be later than start.
|
||||
VTODO [125]: The ical file seems to be malformed. The end of item was not found.
|
||||
101
|
||||
EOD
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user