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:
parent
bcc820ea74
commit
f3fe3c818c
23
src/ical.c
23
src/ical.c
@ -302,8 +302,22 @@ 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. */
|
||||
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;
|
||||
@ -312,9 +326,8 @@ 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 {
|
||||
event_new(mesg, note, day, EVENTID);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
mem_free(mesg);
|
||||
erase_note(¬e);
|
||||
}
|
||||
|
23
test/data/ical-005.ical
Normal file
23
test/data/ical-005.ical
Normal 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
26
test/ical-005.sh
Executable 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
|
Loading…
x
Reference in New Issue
Block a user