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>
This commit is contained in:
Lukas Fleischer 2014-08-18 12:16:42 +02:00
parent bcc820ea74
commit f3fe3c818c
3 changed files with 74 additions and 12 deletions

View File

@ -302,19 +302,32 @@ ical_store_event(char *mesg, char *note, long day, long end,
recur_event_new(mesg, note, day, EVENTID, rpt->type, recur_event_new(mesg, note, day, EVENTID, rpt->type,
rpt->freq, rpt->until, exc); rpt->freq, rpt->until, exc);
mem_free(rpt); mem_free(rpt);
} else if (end && end != day) { goto cleanup;
/* 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 {
event_new(mesg, note, day, EVENTID);
} }
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); mem_free(mesg);
erase_note(&note); erase_note(&note);
} }

23
test/data/ical-005.ical Normal file
View File

@ -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

26
test/ical-005.sh Executable file
View File

@ -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