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):

Reply via email to