Package: opensync-plugin-google-calendar Version: 0.19-2 Severity: grave Tags: patch Justification: renders package unusable
(I believe this applies to anyone using this plugin hence the severity) Any attempt to synchronise using the google-calendar plugin will fail with an exception: __main__.DateConversionError: Invalid date/time e.g: [EMAIL PROTECTED]:~$ msynctool --sync mysink Synchronizing group "mysink" The previous synchronization was unclean. Slow-syncing Member 1 of type google-calendar just connected Member 2 of type kdepim-sync just connected All clients connected or error Received an entry libkcal-744074169.903 with data of size 4 from member 2. Changetype ADDED Member 2 of type kdepim-sync just sent all changes Traceback (most recent call last): File "/usr/lib/opensync/google-cal-helper", line 402, in ? sys.exit(main(sys.argv)) File "/usr/lib/opensync/google-cal-helper", line 394, in main return fn(argv) File "/usr/lib/opensync/google-cal-helper", line 286, in oper_get_all data = e.dumpOsync() File "/usr/lib/opensync/google-cal-helper", line 200, in dumpOsync self.addElementContent(doc, event, 'DateStarted', xsdateToOsync(self.dtstart)) File "/usr/lib/opensync/google-cal-helper", line 118, in xsdateToOsync raise DateConversionError("Invalid date/time: %s" % (s)) __main__.DateConversionError: Invalid date/time: Member 1 of type google-calendar had an error while getting changes: Helper exited abnormally Member 1 of type google-calendar just disconnected Member 2 of type kdepim-sync just disconnected All clients have disconnected The sync failed: Unable to read from one of the members Error synchronizing: Unable to read from one of the members Pipe closed! Exiting. Pipe closed! Exiting. Investigation reveals this is a known bug with a patch available. See: http://opensync.gforge.punktart.de/ticket/18 ..for details, or indeed: http://www.nabble.com/-PATCH--google-calendar-recurrency-support-p9781043.html ...For a different source. -- System Information: Debian Release: lenny/sid APT prefers unstable APT policy: (990, 'unstable'), (500, 'testing'), (200, 'stable'), (50, 'experimental') Architecture: i386 (i686) Kernel: Linux 2.6.16.30.2006110301 (PREEMPT) Locale: LANG=en_GB, LC_CTYPE=en_GB (charmap=ISO-8859-1) (ignored: LC_ALL set to en_GB) Shell: /bin/sh linked to /bin/bash Versions of packages opensync-plugin-google-calendar depends on: ii libc6 2.5-11 GNU C Library: Shared libraries ii libglib2.0-0 2.12.12-1 The GLib library of C routines ii libopensync0 0.19-1.2 Synchronisation framework for emai ii libxml2 2.6.29.dfsg-1 GNOME XML library ii python 2.4.4-6 An interactive high-level object-o ii python-httplib2 0.2.0-2 A comprehensive HTTP client librar ii python-xml 0.8.4-7 XML tools for Python opensync-plugin-google-calendar recommends no packages. -- no debconf information
--- src/google-cal-helper.py~ 2007-04-01 14:51:03.000000000 -0400 +++ src/google-cal-helper.py 2007-04-01 14:51:05.000000000 -0400 @@ -138,6 +138,41 @@ sys.stderr.write("xs to osync: %s => %s\n" % (s, r)) return r +GDEND_RE = re.compile("DTEND;[^:]*:(\S+)") +def gdRecurToEnd(recur): + m = GDEND_RE.search(recur) + if m is None: + raise DateConversionError("failed to find end in \"%s\"" % recur) + start = m.group(1) + year = start[0:4] + month = start[4:6] + day = start[6:8] + hour = start[9:11] + min = start[11:13] + sec = start[13:15] + return "%s-%2s-%2sT%2s:%2s:%2s" % (year, month, day, hour, min, sec) + +GDSTART_RE = re.compile("DTSTART;[^:]*:(\S+)") +def gdRecurToStart(recur): + m = GDSTART_RE.search(recur) + if m is None: + raise DateConversionError("failed to find start in \"%s\"" % recur) + start = m.group(1) + year = start[0:4] + month = start[4:6] + day = start[6:8] + hour = start[9:11] + min = start[11:13] + sec = start[13:15] + return "%s-%2s-%2sT%2s:%2s:%2s" % (year, month, day, hour, min, sec) + +GDRECUR_RE = re.compile("RRULE:(\S+)") +def gdRecurToORecur(recur): + m = GDRECUR_RE.search(recur) + if m is None: + raise DateConversionError("failed to find rule in \"%s\"" % recur) + return m.group(1) + class GCalRequestError(Exception): def __init__(self, response): self.response = response @@ -159,13 +194,19 @@ self.id = self.elementValue('atom:id/text()') self.editUri = self.elementValue('atom:[EMAIL PROTECTED]"edit"]/@href') self.content = self.elementValue('atom:[EMAIL PROTECTED]"text"]/text()') - self.dtstart = self.elementValue('gd:when/@startTime') - self.dtend = self.elementValue('gd:when/@endTime') + self.dtrecur = self.elementValue('gd:recurrence/text()') + if self.dtrecur: + pass + self.dtstart = gdRecurToStart(self.dtrecur) + self.dtend = gdRecurToEnd(self.dtrecur) + self.dtrecur = gdRecurToORecur(self.dtrecur) + else: + self.dtstart = self.elementValue('gd:when/@startTime') + self.dtend = self.elementValue('gd:when/@endTime') self.eventStatus = self.elementValue('gd:eventStatus/@value') self.whereString = self.elementValue('gd:where/@valueString') - #FIXME: Handle recurrency #FIXME: Handle gd:eventStatus @@ -197,11 +238,15 @@ self.addElementContent(doc, event, 'Summary', self.title) self.addElementContent(doc, event, 'Description', self.content) - self.addElementContent(doc, event, 'DateStarted', xsdateToOsync(self.dtstart)) - self.addElementContent(doc, event, 'DateEnd', xsdateToOsync(self.dtend)) + self.addElementContent(doc, event, 'DateStarted', xsdateToOsync(self.dtstart)) + self.addElementContent(doc, event, 'DateEnd', xsdateToOsync(self.dtend)) + if self.dtrecur: + self.addElementContent(doc, event, 'RecurrenceRule', + self.dtrecur) + self.addElementContent(doc, event, 'Location', self.whereString) - #TODO: UID, editUri, dtstart, dtend, recurrency, eventStatus + #TODO: UID, editUri, dtstart, dtend, eventStatus return doc.toxml(encoding='utf-8') def dumpGdata(self):