Merge tag 'syncevolution-1-2-99-4' into FREMANTLE-1-2-99-4

This commit is contained in:
Ove Kåven 2012-08-12 19:34:03 +02:00
commit 0352113e8d
16 changed files with 484 additions and 48 deletions

1
.gitignore vendored
View file

@ -10,6 +10,7 @@ Makefile
Makefile.in
# top level
/INSTALL
/autom4te.cache
/aclocal.m4
/compile

38
NEWS
View file

@ -1,3 +1,41 @@
SyncEvolution 1.2.99.3 -> 1.2.99.4, 07.08.2012
==============================================
Another release candidate for SyncEvolution 1.3. Lesson learned:
declaring a snapshot as "final" is a good way of luring the hidden bugs
into the light. Of course, then another snapshot is needed...
Details:
* D-Bus server: fix support for autoSyncDelay > 0
Auto syncing was not getting triggered when using an autoSyncDelay > 0;
by default it is 5 minutes. Thanks to Vladimir Elisseev for reporting
this problem.
* command line: fixed --export <file name>
When exporting items into a file, the delimiter between items
was missing.
* config: improved 'maxlogdirs' documentation
The old explanation made it sound like nothing would get deleted by
default ("If set, ..."). That's not correct, by default only 10
sessions are kept.
Also explain the behavior of deleting intermediate sessions first.
* developers: fixed D-Bus interface XML
Reverted to Qt 4.x compatible annotations and changed "templateName"
to "getTemplate" to make it more obvious what the parameter does.
Only relevant for the out-of-tree Qt UI.
Fixed accidental removal of the "template" parameter in
Session.GetNamedConfig(). Was not used in practice, but has to be
correct in case that someone wants to use it.
SyncEvolution 1.2.99.2 -> 1.2.99.3, 24.07.2012
==============================================

View file

@ -8,7 +8,7 @@ dnl Invoke autogen.sh to produce a configure script.
#
# Starting with the 1.1 release cycle, the rpm-style
# .99 pseudo-version number is used to mark a pre-release.
AC_INIT([syncevolution], [m4_esyscmd([build/gen-git-version.sh 1.2.99.3])])
AC_INIT([syncevolution], [m4_esyscmd([build/gen-git-version.sh 1.2.99.4])])
# STABLE_VERSION=1.0.1+
AC_SUBST(STABLE_VERSION)

View file

@ -102,7 +102,7 @@
"URL" - the URL for an HTTP POST.
</doc:summary>
</doc:doc>
<annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In2" value="QStringMap"/>
</arg>
<arg type="b" name="final">

View file

@ -129,7 +129,7 @@
"system" - some plain text information about system libraries,
"backends" - available backend libraries
</doc:summary></doc:doc>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QStringMap"/>
</arg>
</method>
@ -234,7 +234,7 @@
and thus can be used to find all templates refering to the same device.
</doc:para>
</doc:description></doc:doc>
<arg type="b" name="templateName" direction="in">
<arg type="b" name="getTemplate" direction="in">
<doc:doc><doc:summary>
if TRUE, will return template names, otherwise will return
configured servers
@ -331,7 +331,7 @@
<arg type="s" name="server" direction="in">
<doc:doc><doc:summary>server name</doc:summary></doc:doc>
</arg>
<arg type="b" name="templateName" direction="in">
<arg type="b" name="getTemplate" direction="in">
<doc:doc><doc:summary>
if TRUE, will return a matching template configuration, otherwise
will return a matching server configuration
@ -342,7 +342,7 @@
server (or template) configuration
</doc:summary></doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringMultiMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QStringMultiMap"/>
</method>
<method name="CheckPresence">
@ -411,7 +411,7 @@
its pair-value won't be included in the dictionary.
</doc:description></doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QArrayOfStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QArrayOfStringMap"/>
</method>
<method name="GetDatabases">
@ -444,7 +444,7 @@
</doc:description>
</doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QArrayOfDatabases"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QArrayOfDatabases"/>
</method>
<method name="CheckSource">
@ -585,7 +585,7 @@
version of the transport entity.
</doc:summary>
</doc:doc>
<annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="QStringMap"/>
</arg>
<arg type="b" name="must_authenticate" direction="in">
<doc:doc>
@ -824,7 +824,7 @@
</doc:summary>
</doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.In5" value="QStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In5" value="QStringMap"/>
</signal>
<method name="InfoResponse">
@ -853,7 +853,7 @@
</doc:summary>
</doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In2" value="QStringMap"/>
</method>
<signal name="LogOutput">

View file

@ -49,14 +49,14 @@
<method name="GetConfig">
<doc:doc><doc:description>Get the configuration identified by the name given to StartSession()</doc:description></doc:doc>
<arg type="b" name="templateName" direction="in">
<arg type="b" name="getTemplate" direction="in">
<doc:doc><doc:summary>if TRUE, will return a matching template configuration, otherwise will return the stored configuration</doc:summary></doc:doc>
</arg>
<arg type="a{sa{ss}}" name="configuration" direction="out">
<doc:doc><doc:summary>server configuration</doc:summary></doc:doc>
<doc:doc><doc:description>See Server.GetConfig() for dictionary description.</doc:description></doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringMultiMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QStringMultiMap"/>
</method>
<method name="SetConfig">
@ -104,7 +104,7 @@
<doc:doc><doc:summary>server configuration</doc:summary></doc:doc>
<doc:doc><doc:description>See Server.GetConfig() for dictionary description.</doc:description></doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QStringMultiMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In2" value="QStringMultiMap"/>
</method>
<method name="GetNamedConfig">
@ -115,8 +115,9 @@
<arg type="s" name="name" direction="in">
<doc:doc><doc:summary>configuration name</doc:summary></doc:doc>
</arg>
<arg type="b" name="getTemplate" direction="in"/>
<arg type="a{sa{ss}}" name="configuration" direction="out"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringMultiMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QStringMultiMap"/>
</method>
<method name="SetNamedConfig">
@ -129,7 +130,7 @@
<doc:doc><doc:summary>temporary changes of the configuration are currently only supported for the configuration chosen when creating the session</doc:summary></doc:doc>
</arg>
<arg type="a{sa{ss}}" name="configuration" direction="in"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In3" value="QStringMultiMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In3" value="QStringMultiMap"/>
</method>
<method name="GetReports">
@ -144,7 +145,7 @@
<doc:doc><doc:summary>synchronization reports</doc:summary></doc:doc>
<doc:doc><doc:description>See Server.GetReports() for array description.</doc:description></doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QArrayOfStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QArrayOfStringMap"/>
</method>
@ -176,7 +177,7 @@
</doc:description>
</doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QArrayOfDatabases"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QArrayOfDatabases"/>
</method>
<method name="CheckSource">
@ -230,7 +231,7 @@
<doc:doc><doc:summary>synchronization source modes</doc:summary></doc:doc>
<doc:doc><doc:description>Source modes to override the 'mode' variable for specific sources. The dictionary key is source name, value is synchronization mode. Valid synchronization modes are all synchronization modes used in syncevolution server configuration files and the empty string.</doc:description></doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="QStringMap"/>
</method>
<method name="Abort">
@ -317,7 +318,7 @@
<doc:doc><doc:summary>Synchronization source status dictionary</doc:summary></doc:doc>
<doc:doc><doc:description>Dictionary key is source name. The value structs contain synchronization mode, source status and error code. Valid values for status are the same as for status parameter above. "done" represents a synced source when the whole sync is not done yet.</doc:description></doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out2" value="QSyncStatusMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out2" value="QSyncStatusMap"/>
</method>
<method name="GetProgress">
@ -329,7 +330,7 @@
<doc:doc><doc:summary>Synchronization source progress dictionary</doc:summary></doc:doc>
<doc:doc><doc:description>Dictionary key is source name. The value structs contain phase (can be one of "", "preparing", "sending", "receiving"), prepare count, prepare total, send count, send total, receive count and receive total. -1 is used for unknown. Normally only the 'counts' increase but there are cases where the total will increase as well.</doc:description></doc:doc>
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="QSyncProgressMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out1" value="QSyncProgressMap"/>
</method>
<method name="Execute">
@ -344,7 +345,7 @@
</arg>
<arg type="a{ss}" name="vars" direction="in">
<doc:doc><doc:summary>Environment variables in clients</doc:summary></doc:doc>
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QStringMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="QStringMap"/>
</arg>
</method>
@ -353,14 +354,14 @@
<arg type="s" name="status"/>
<arg type="u" name="error"/>
<arg type="a{s(ssu)}" name="sources"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QSyncStatusMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In2" value="QSyncStatusMap"/>
</signal>
<signal name="ProgressChanged">
<doc:doc><doc:description>Synchronization progress change. See GetProgress() for argument descriptions.</doc:description></doc:doc>
<arg type="i" name="progress"/>
<arg type="a{s(siiiiii)}" name="sources"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSyncProgressMap"/>
<annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="QSyncProgressMap"/>
</signal>
</interface>

View file

@ -261,7 +261,10 @@ void AutoSyncManager::schedule(const std::string &reason)
// Ran too recently, check again in the future. Always
// reset timer, because both m_lastSyncTime and m_interval
// may have changed.
int seconds = (task->m_lastSyncTime + task->m_interval - now).seconds() + 1;
//
// Adds two seconds just to be on the safe side and not
// wake up again too soon.
int seconds = (task->m_lastSyncTime + task->m_interval - now).seconds() + 2;
SE_LOG_DEBUG(NULL, NULL, "auto sync: %s: interval expires in %ds",
configName.c_str(),
seconds);
@ -303,10 +306,12 @@ void AutoSyncManager::schedule(const std::string &reason)
}
if (!starttime || // some other transport, assumed to be online, use it
(*starttime && // present
(task->m_delay <= 0 || *starttime + task->m_delay > now))) { // present long enough
SE_LOG_DEBUG(NULL, NULL, "auto sync: %s: ready to run via %s",
(task->m_delay <= 0 || *starttime + task->m_delay <= now))) { // present long enough
SE_LOG_DEBUG(NULL, NULL, "auto sync: %s: ready to run via %s (transport present for %lds > %ds auto sync delay)",
configName.c_str(),
urlinfo.second.c_str());
urlinfo.second.c_str(),
(long)(*starttime - now).seconds(),
task->m_delay);
readyURL = urlinfo.second;
break;
}
@ -320,7 +325,7 @@ void AutoSyncManager::schedule(const std::string &reason)
urlinfo.second.c_str());
} else {
// check again after waiting the requested amount of time
int seconds = (*starttime + task->m_delay - now).seconds() + 1;
int seconds = (*starttime + task->m_delay - now).seconds() + 2;
SE_LOG_DEBUG(NULL, NULL, "auto sync: %s: presence delay of transport for %s expires in %ds",
configName.c_str(),
urlinfo.second.c_str(),

View file

@ -1772,7 +1772,7 @@ class Watch : private boost::noncopyable
{
}
virtual void setCallback(const boost::function<void (void)> &callback)
void setCallback(const boost::function<void (void)> &callback)
{
m_callback = callback;
if (m_called && m_callback) {

View file

@ -1521,7 +1521,7 @@ bool Cmdline::run() {
haveNewline = true;
} else {
// write to file
*out << item;
*out << delimiter << item;
haveNewline = boost::ends_with(item, "\n");
}
haveItem = true;

View file

@ -1263,12 +1263,14 @@ static ConfigProperty syncPropLogDir("logdir",
"if \"none\", then no backups of the databases are made and any\n"
"output is printed directly to the screen");
static UIntConfigProperty syncPropMaxLogDirs("maxlogdirs",
"Unless this option is set, SyncEvolution will never delete\n"
"anything in the \"logdir\". If set, the oldest directories and\n"
"all their content will be removed after a successful sync\n"
"to prevent the number of log directories from growing beyond\n"
"the given limit.",
"10");
"Controls how many session directories are kept at most in the logdir.\n"
"Unless set to zero, SyncEvolution will remove old directories and\n"
"all their content to prevent the number of log directories from\n"
"growing beyond the given limit. It tries to be intelligent and will\n"
"remove sessions in which nothing interesting happened (no errors,\n"
"no data changes) in favor of keeping sessions where something\n"
"happened, even if those sessions are older.",
"10");
static UIntConfigProperty syncPropLogLevel("loglevel",
"level of detail for log messages:\n"
"- 0 (or unset) = INFO messages without log file, DEBUG with log file\n"

View file

@ -39,7 +39,7 @@ trap atexit EXIT
E_CAL_PID=
E_BOOK_PID=
case "$@" in *valgrind*) prefix=`echo $@ | perl -p -e 's;.*?(\S*/?valgrind\S*).*;$1;'`;;
*syncevolution\ *|*client-test\ *|*bash*|*test-dbus.py\ *|*gdb\ *) prefix=env;;
*setup-syncevolution.sh*|*syncevolution\ *|*client-test\ *|*bash*|*test-dbus.py\ *|*gdb\ *) prefix=env;;
*) prefix=;; # don't start EDS
esac
akonadi=$prefix
@ -64,7 +64,7 @@ else
DBUS_SESSION_SH_EDS_BASE=
fi
sleep $SLEEP
[ "$SLEEP" ] && sleep $SLEEP
# run program
"$@"

View file

@ -662,7 +662,7 @@ sub NormalizeItem {
s/^(FN|X-EVOLUTION-FILE-AS|CATEGORIES)(;[^:;\n]*)*:.*\r?\n?//gm;
}
if ($googleeas) {
if ($googleeas || $exchange) {
# temporarily ignore modified properties
s/^(BDAY|X-ANNIVERSARY)(;[^:;\n]*)*:.*\r?\n?//gm;
}

View file

@ -0,0 +1,32 @@
master:
testConcurrency (__main__.TestLocalSync)
TestLocalSync.testConcurrency - D-Bus server must remain responsive while sync runs ... ok
----------------------------------------------------------------------
Ran 1 test in 7.814s
$ cat temp-test-dbus/cache/syncevolution/server-2012-01-21-20-44/status.ini
status = 20017
start = 1327175092, 2012-01-21 20:44:52 +0100
end = 1327175094, 2012-01-21 20:44:54 +0100
source-addressbook-mode = disabled
source-addressbook-first = false
source-addressbook-resume = false
source-addressbook-status = 0
source-addressbook-backup-before = -1
source-addressbook-backup-after = -1
[2012-01-21 20:44:52.365] parent: read select on message channel 0.000000000s
[2012-01-21 20:44:54.111] quit transport as requested as part of GLib event loop
[2012-01-21 20:44:54.111] aborting after TransportAgent::FAILED as requested by user
=> source not active, no error in it
=> abort detected in loop, not in transport
for-master/fork-local-sync:
sync *runs* ?!

View file

@ -2518,8 +2518,7 @@ class TestSessionAPIsDummy(DBusUtil, unittest.TestCase):
Timeout.removeTimeout(timeout_handler)
self.assertEqual(self.lastState, "done")
@timeout(60)
def testAutoSyncNetworkFailure(self):
def doAutoSyncNetworkFailure(self):
"""TestSessionAPIsDummy.testAutoSyncNetworkFailure - test that auto-sync is triggered, fails due to (temporary?!) network error here"""
self.setupConfig()
# enable auto-sync
@ -2529,7 +2528,7 @@ class TestSessionAPIsDummy(DBusUtil, unittest.TestCase):
# or any other D-Bus test.
config[""]["syncURL"] = "http://no-such-domain.foobar"
config[""]["autoSync"] = "1"
config[""]["autoSyncDelay"] = "0"
config[""]["autoSyncDelay"] = "1"
config[""]["autoSyncInterval"] = "10s"
config[""]["password"] = "foobar"
self.session.SetConfig(True, False, config, utf8_strings=True)
@ -2599,6 +2598,17 @@ class TestSessionAPIsDummy(DBusUtil, unittest.TestCase):
# done as part of post-processing in runTest()
self.runTestDBusCheck = checkDBusLog
@timeout(60)
def testAutoSyncNetworkFailure(self):
"""TestSessionAPIsDummy.testAutoSyncNetworkFailure - test that auto-sync is triggered, fails due to (temporary?!) network error here"""
self.doAutoSyncNetworkFailure()
@timeout(60)
@property("ENV", "DBUS_TEST_CONNMAN=session DBUS_TEST_NETWORK_MANAGER=session")
def testAutoSyncNoNetworkManager(self):
"""TestSessionAPIsDummy.testAutoSyncNoNetworkManager - test that auto-sync is triggered despite having neither NetworkManager nor Connman, fails due to (temporary?!) network error here"""
self.doAutoSyncNetworkFailure()
@timeout(60)
def doAutoSyncLocalConfigError(self, notifyLevel):
self.setupConfig()
@ -6766,6 +6776,13 @@ END:VCARD
self.assertNoErrors(err)
self.assertEqualDiff(john + "\n" + joan, out)
# export all into file
exportfile = xdg_root + "/export.vcf"
out, err, code = self.runCmdline(["--export", exportfile,
"foo", "bar"])
self.assertNoErrors(err)
self.assertEqualDiff(john + "\n" + joan, open(exportfile).read())
# export one
out, err, code = self.runCmdline(["--export", "-",
"backend=file",
@ -6781,6 +6798,13 @@ END:VCARD
self.assertNoErrors(err)
self.assertEqualDiff(john, out)
# export one into file
exportfile = xdg_root + "/export.vcf"
out, err, code = self.runCmdline(["--export", exportfile,
"foo", "bar", "1"])
self.assertNoErrors(err)
self.assertEqualDiff(john, open(exportfile).read())
# Copied from C++ test:
# TODO: check configuration of just the source as @foo bar
# without peer
@ -6879,10 +6903,11 @@ END:VCARD
# The error message is not particularly informative, but the error should
# not occur, so let it be... Also, the "connection is closed" error only
# occurs occasionally.
out = out.replace('''[ERROR] The connection is closed
''', '')
self.assertEqualDiff(out, '''[ERROR syncevo-dbus-server] child process quit because of signal 9
''')
self.assertNotEqual(out, '')
self.assertTrue('''[ERROR] The connection is closed
''' in out or
'''[ERROR syncevo-dbus-server] child process quit because of signal 9
''' in out)
@property("debug", False)
@property("ENV", "SYNCEVOLUTION_LOCAL_CHILD_DELAY2=60")
@ -6937,7 +6962,7 @@ END:VCARD
# occurs occasionally.
if out.startswith('[ERROR] child process quit because of signal 9'):
out = out.replace('''[ERROR] sending message to child failed: The connection is closed
-''', '')
''', '')
self.assertEqualDiff(out, '''[ERROR] child process quit because of signal 9
[ERROR] local transport failed: child process quit because of signal 9
[INFO] Transport giving up after x retries and y:zzmin

View file

@ -0,0 +1,223 @@
@@ -2,19 +2,16 @@
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/Europe/Berlin
-X-LIC-LOCATION:Europe/Berlin
+TZID:Standard Timezone
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
-TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
-TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
END:STANDARD
@@ -23,9 +20,9 @@
SUMMARY:phone meeting
DESCRIPTION:let's talk
CATEGORIES:MEETING
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Berlin:
+DTEND;TZID=Standard Timezone:
20060406T163000
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Berlin:
+DTSTART;TZID=Standard Timezone:
20060406T160000
UID:20060406T211449Z-4562-727-1-63@gollum
DTSTAMP:20060406T211449Z
@@ -35,6 +32,7 @@
CLASS:PUBLIC
TRANSP:OPAQUE
SEQUENCE:1
+RRULE:FREQ=DAILY;INTERVAL=1
END:VEVENT
END:VCALENDAR
@@ -53,7 +51,7 @@
CLASS:PUBLIC
CREATED:20060416T203724Z
LAST-MODIFIED:20060416T203758Z
-RRULE:FREQ=WEEKLY;UNTIL=20060427T173000Z;INTERVAL=1;BYDAY=TH
+RRULE:FREQ=WEEKLY;UNTIL=20060427T170000Z;INTERVAL=1;BYDAY=TH
END:VEVENT
END:VCALENDAR
@@ -90,7 +88,7 @@
CLASS:PUBLIC
CREATED:20060416T203924Z
LAST-MODIFIED:20060416T203949Z
-RRULE:FREQ=MONTHLY;INTERVAL=1;UNTIL=20060606T173000Z
+RRULE:BYMONTHDAY=6;FREQ=MONTHLY;INTERVAL=1;UNTIL=20060606T173000Z
END:VEVENT
END:VCALENDAR
@@ -106,7 +104,7 @@
SEQUENCE:2
SUMMARY:recurrence\, yearly\, two times
CLASS:PUBLIC
-RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20070406T180000Z
+RRULE:BYMONTH=4;BYMONTHDAY=6;FREQ=YEARLY;INTERVAL=1;UNTIL=20070406T180000Z
CREATED:20060416T204021Z
LAST-MODIFIED:20060416T204021Z
END:VEVENT
@@ -193,11 +191,28 @@
BEGIN:VCALENDAR
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:(UTC-05:00) Eastern Time (US & C
+BEGIN:STANDARD
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:(UTC-05:00) Eastern Time (US & C
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:(UTC-05:00) Eastern Time (US & C
+END:DAYLIGHT
+END:VTIMEZONE
BEGIN:VEVENT
UID:20060416T204136Z-4272-727-1-247@gollum
DTSTAMP:20060416T204136Z
-DTSTART:20060406T190000Z
-DTEND:20060406T193000Z
+DTSTART;TZID="(UTC-05:00) Eastern Time (US & C":20060406T150000
+DTEND;TZID="(UTC-05:00) Eastern Time (US & C":20060406T153000
TRANSP:TRANSPARENT
SEQUENCE:4
SUMMARY:all fields
@@ -218,7 +233,7 @@
BEGIN:VALARM
X-EVOLUTION-ALARM-UID:20060416T204833Z-4250-727-1-85@gollum
ACTION:DISPLAY
-DESCRIPTION:This is an event reminder
+DESCRIPTION:Reminder
TRIGGER;VALUE=DURATION;RELATED=START:-PT1H
END:VALARM
END:VEVENT
@@ -228,29 +243,6 @@
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
BEGIN:VEVENT
-UID:20060416T204922Z-4272-727-1-250@gollum
-DTSTAMP:20060416T204922Z
-DTSTART:20060406T193000Z
-DTEND:20060406T200000Z
-TRANSP:OPAQUE
-SEQUENCE:2
-CATEGORIES:BUSINESS,MEETING
-SUMMARY:meeting invitation
-CLASS:PUBLIC
-ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com
-CREATED:20060416T205003Z
-LAST-MODIFIED:20060416T205003Z
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VEVENT
UID:20080407T193125Z-19554-727-1-50@gollum
DTSTAMP:20080407T193125Z
DTSTART:20080406T090000Z
@@ -260,7 +252,7 @@
SUMMARY:Recurring
DESCRIPTION:recurs each Sonday\, 10 times
CLASS:PUBLIC
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU;UNTIL=20080608T090000Z
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU;COUNT=10
CREATED:20080407T193241Z
LAST-MODIFIED:20080407T193241
END:VEVENT
@@ -341,75 +333,3 @@
DESCRIPTION:second instance modified\, single detached recurrence
END:VEVENT
END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:20080407T193125Z-19554-727-1-50-YY@gollum
-DTSTAMP:20080407T193125Z
-DTSTART:20080413T090000Z
-DTEND:20080413T093000Z
-TRANSP:OPAQUE
-SEQUENCE:7
-SUMMARY:Recurring 3: Modified
-CLASS:PUBLIC
-CREATED:20080407T193241Z
-LAST-MODIFIED:20080407T193647
-RECURRENCE-ID:20080413T090000Z
-DESCRIPTION:second instance modified
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:20080407T193125Z-19554-727-1-50-YY@gollum
-DTSTAMP:20080407T193125Z
-DTSTART:20080420T100000Z
-DTEND:20080420T103000Z
-TRANSP:OPAQUE
-SEQUENCE:7
-SUMMARY:Recurring 3: Modified II
-CLASS:PUBLIC
-CREATED:20080407T193241Z
-LAST-MODIFIED:20080407T193647
-RECURRENCE-ID:20080420T090000Z
-DESCRIPTION:third instance modified\, different time
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:EST/EDT
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19671029T020000
-RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=-1SU
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19870405T020000
-RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=1SU
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20060416T205224Z-4272-727-1-251@gollum
-DTSTAMP:20060416T205224Z
-DTSTART;TZID=EST/EDT:20060406T140000
-DTEND;TZID=EST/EDT:20060406T143000
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:timezone New York with custom definition for 2006
-CLASS:PUBLIC
-CREATED:20060416T205301Z
-LAST-MODIFIED:20060416T205301Z
-END:VEVENT
-END:VCALENDAR

View file

@ -0,0 +1,109 @@
@@ -270,44 +270,6 @@
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
BEGIN:VEVENT
-UID:20080407T193125Z-19554-727-1-50@gollum
-DTSTAMP:20080407T193125Z
-DTSTART:20080413T090000Z
-DTEND:20080413T093000Z
-TRANSP:OPAQUE
-SEQUENCE:7
-SUMMARY:Recurring: Modified
-CLASS:PUBLIC
-CREATED:20080407T193241Z
-LAST-MODIFIED:20080407T193647
-RECURRENCE-ID:20080413T090000Z
-DESCRIPTION:second instance modified
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:20080407T193125Z-19554-727-1-50@gollum
-DTSTAMP:20080407T193125Z
-DTSTART:20080420T100000Z
-DTEND:20080420T103000Z
-TRANSP:OPAQUE
-SEQUENCE:7
-SUMMARY:Recurring: Modified II
-CLASS:PUBLIC
-CREATED:20080407T193241Z
-LAST-MODIFIED:20080407T193647
-RECURRENCE-ID:20080420T090000Z
-DESCRIPTION:third instance modified\, different time
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VEVENT
UID:20080407T193125Z-19554-727-1-50-XX@gollum
DTSTAMP:20080407T193125Z
DTSTART:20080406T090000Z
@@ -323,63 +285,6 @@
END:VEVENT
END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:20080407T193125Z-19554-727-1-50-XX@gollum
-DTSTAMP:20080407T193125Z
-DTSTART:20080413T090000Z
-DTEND:20080413T093000Z
-TRANSP:OPAQUE
-SEQUENCE:7
-SUMMARY:Recurring 2: Modified
-CLASS:PUBLIC
-CREATED:20080407T193241Z
-LAST-MODIFIED:20080407T193647
-RECURRENCE-ID:20080413T090000Z
-DESCRIPTION:second instance modified\, single detached recurrence
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:20080407T193125Z-19554-727-1-50-YY@gollum
-DTSTAMP:20080407T193125Z
-DTSTART:20080413T090000Z
-DTEND:20080413T093000Z
-TRANSP:OPAQUE
-SEQUENCE:7
-SUMMARY:Recurring 3: Modified
-CLASS:PUBLIC
-CREATED:20080407T193241Z
-LAST-MODIFIED:20080407T193647
-RECURRENCE-ID:20080413T090000Z
-DESCRIPTION:second instance modified
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VEVENT
-UID:20080407T193125Z-19554-727-1-50-YY@gollum
-DTSTAMP:20080407T193125Z
-DTSTART:20080420T100000Z
-DTEND:20080420T103000Z
-TRANSP:OPAQUE
-SEQUENCE:7
-SUMMARY:Recurring 3: Modified II
-CLASS:PUBLIC
-CREATED:20080407T193241Z
-LAST-MODIFIED:20080407T193647
-RECURRENCE-ID:20080420T090000Z
-DESCRIPTION:third instance modified\, different time
-END:VEVENT
-END:VCALENDAR
-
BEGIN:VCALENDAR
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0