diff options
author | Lukas Fleischer <calcurse@cryptocrack.de> | 2014-08-18 12:16:42 +0200 |
---|---|---|
committer | Lukas Fleischer <calcurse@cryptocrack.de> | 2014-08-18 12:20:09 +0200 |
commit | f3fe3c818cf277a547024492abd90c155dab1cd4 (patch) | |
tree | 8799d48a8bacc56fefae14b771a12a9a27f770f8 | |
parent | bcc820ea743e0448b26a8fee5e8e0a9f85bc3c70 (diff) | |
download | calcurse-f3fe3c818cf277a547024492abd90c155dab1cd4.zip |
Gracefully handle all day events in iCal imports
Do not create two events when importing an event that lasts an entire
day.
Reported-by: Jörn Tillmanns <tillmanns@tuxzone.org>
Reported-by: Håkan Jerning <jerning@home.se>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
-rw-r--r-- | src/ical.c | 35 | ||||
-rw-r--r-- | test/data/ical-005.ical | 23 | ||||
-rwxr-xr-x | test/ical-005.sh | 26 |
3 files changed, 73 insertions, 11 deletions
@@ -302,19 +302,32 @@ ical_store_event(char *mesg, char *note, long day, long end, recur_event_new(mesg, note, day, EVENTID, rpt->type, rpt->freq, rpt->until, exc); mem_free(rpt); - } else if (end && end != day) { - /* Here we have an event that spans over several days. */ - rpt = mem_malloc(sizeof(ical_rpt_t)); - rpt->type = RECUR_DAILY; - rpt->freq = 1; - rpt->count = 0; - rpt->until = end; - recur_event_new(mesg, note, day, EVENTID, rpt->type, - rpt->freq, rpt->until, exc); - mem_free(rpt); - } else { + goto cleanup; + } + + if (end == 0 || end - day <= DAYINSEC) { event_new(mesg, note, day, EVENTID); + goto cleanup; } + + /* + * Here we have an event that spans over several days. + * + * In iCal, the end specifies when the event is supposed to end, in + * calcurse, the end specifies the time that the last occurrence of the + * event starts, so we need to do some conversion here. + */ + end = day + ((end - day - 1) / DAYINSEC) * DAYINSEC; + rpt = mem_malloc(sizeof(ical_rpt_t)); + rpt->type = RECUR_DAILY; + rpt->freq = 1; + rpt->count = 0; + rpt->until = end; + recur_event_new(mesg, note, day, EVENTID, rpt->type, + rpt->freq, rpt->until, exc); + mem_free(rpt); + +cleanup: mem_free(mesg); erase_note(¬e); } diff --git a/test/data/ical-005.ical b/test/data/ical-005.ical new file mode 100644 index 0000000..5f20f48 --- /dev/null +++ b/test/data/ical-005.ical @@ -0,0 +1,23 @@ +BEGIN:VCALENDAR +VERSION:2.0 +BEGIN:VEVENT +SUMMARY:All day +DTSTART;VALUE=DATE:20131003 +DTEND;VALUE=DATE:20131004 +END:VEVENT +BEGIN:VEVENT +SUMMARY:Two days +DTSTART;VALUE=DATE:20131003 +DTEND;VALUE=DATE:20131005 +END:VEVENT +BEGIN:VEVENT +SUMMARY:On day 1 +DTSTART;VALUE=DATE:20131003 +DTEND;VALUE=DATE:20131004 +TRANSP:TRANSPARENT +END:VEVENT +BEGIN:VEVENT +SUMMARY:On day 2 +DTSTART;VALUE=DATE:20131003 +END:VEVENT +END:VCALENDAR diff --git a/test/ical-005.sh b/test/ical-005.sh new file mode 100755 index 0000000..59c08c8 --- /dev/null +++ b/test/ical-005.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +. "${TEST_INIT:-./test-init.sh}" + +if [ "$1" = 'actual' ]; then + mkdir .calcurse || exit 1 + 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 + rm -rf .calcurse || exit 1 +elif [ "$1" = 'expected' ]; then + cat <<EOD +Import process report: 0030 lines read +0 apps / 4 events / 0 todos / 0 skipped +10/03/13: + * Two days + * All day + * On day 1 + * On day 2 + +10/04/13: + * Two days +EOD +else + ./run-test "$0" +fi |