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,
|
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. */
|
}
|
||||||
|
|
||||||
|
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 = mem_malloc(sizeof(ical_rpt_t));
|
||||||
rpt->type = RECUR_DAILY;
|
rpt->type = RECUR_DAILY;
|
||||||
rpt->freq = 1;
|
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,
|
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 {
|
|
||||||
event_new(mesg, note, day, EVENTID);
|
cleanup:
|
||||||
}
|
|
||||||
mem_free(mesg);
|
mem_free(mesg);
|
||||||
erase_note(¬e);
|
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