Merge pull request #136 from aroig/gh/label-fix

Fix issue with multiple instances of gmail labels header
This commit is contained in:
Nicolas Sebrecht 2014-12-23 03:30:36 +01:00
commit 9b2c275561
3 changed files with 48 additions and 12 deletions

View File

@ -401,6 +401,9 @@ class BaseFolder(object):
""" """
Adds new header to the provided message. Adds new header to the provided message.
WARNING: This function is a bit tricky, and modifying it in the wrong way,
may easily lead to data-loss.
Arguments: Arguments:
- content: message content, headers and body as a single string - content: message content, headers and body as a single string
- linebreak: string that carries line ending - linebreak: string that carries line ending
@ -512,8 +515,8 @@ class BaseFolder(object):
def getmessageheader(self, content, name): def getmessageheader(self, content, name):
""" """
Searches for the given header and returns its value. Searches for the first occurence of the given header and returns
Header name is case-insensitive. its value. Header name is case-insensitive.
Arguments: Arguments:
- contents: message itself - contents: message itself
@ -535,6 +538,27 @@ class BaseFolder(object):
return None return None
def getmessageheaderlist(self, content, name):
"""
Searches for the given header and returns a list of values for
that header.
Arguments:
- contents: message itself
- name: name of the header to be searched
Returns: list of header values or emptylist if no such header was found
"""
self.ui.debug('', 'getmessageheaderlist: called to get %s' % name)
eoh = self.__find_eoh(content)
self.ui.debug('', 'getmessageheaderlist: eoh = %d' % eoh)
headers = content[0:eoh]
self.ui.debug('', 'getmessageheaderlist: headers = %s' % repr(headers))
return re.findall('^%s:(.*)$' % name, headers, flags = re.MULTILINE | re.IGNORECASE)
def deletemessageheaders(self, content, header_list): def deletemessageheaders(self, content, header_list):
""" """
Deletes headers in the given list from the message content. Deletes headers in the given list from the message content.

View File

@ -93,6 +93,10 @@ class GmailFolder(IMAPFolder):
labels = set() labels = set()
labels = labels - self.ignorelabels labels = labels - self.ignorelabels
labels_str = imaputil.format_labels_string(self.labelsheader, sorted(labels)) labels_str = imaputil.format_labels_string(self.labelsheader, sorted(labels))
# First remove old label headers that may be in the message content retrieved
# from gmail Then add a labels header with current gmail labels.
body = self.deletemessageheaders(body, self.labelsheader)
body = self.addmessageheader(body, '\n', self.labelsheader, labels_str) body = self.addmessageheader(body, '\n', self.labelsheader, labels_str)
if len(body)>200: if len(body)>200:
@ -189,8 +193,9 @@ class GmailFolder(IMAPFolder):
if not self.synclabels: if not self.synclabels:
return super(GmailFolder, self).savemessage(uid, content, flags, rtime) return super(GmailFolder, self).savemessage(uid, content, flags, rtime)
labels = imaputil.labels_from_header(self.labelsheader, labels = set()
self.getmessageheader(content, self.labelsheader)) for hstr in self.getmessageheaderlist(content, self.labelsheader):
labels.update(imaputil.labels_from_header(self.labelsheader, hstr))
ret = super(GmailFolder, self).savemessage(uid, content, flags, rtime) ret = super(GmailFolder, self).savemessage(uid, content, flags, rtime)
self.savemessagelabels(ret, labels) self.savemessagelabels(ret, labels)

View File

@ -87,9 +87,10 @@ class GmailMaildirFolder(MaildirFolder):
content = file.read() content = file.read()
file.close() file.close()
self.messagelist[uid]['labels'] = \ self.messagelist[uid]['labels'] = set()
imaputil.labels_from_header(self.labelsheader, for hstr in self.getmessageheaderlist(content, self.labelsheader):
self.getmessageheader(content, self.labelsheader)) self.messagelist[uid]['labels'].update(
imaputil.labels_from_header(self.labelsheader, hstr))
self.messagelist[uid]['labels_cached'] = True self.messagelist[uid]['labels_cached'] = True
return self.messagelist[uid]['labels'] return self.messagelist[uid]['labels']
@ -111,8 +112,10 @@ class GmailMaildirFolder(MaildirFolder):
if not self.synclabels: if not self.synclabels:
return super(GmailMaildirFolder, self).savemessage(uid, content, flags, rtime) return super(GmailMaildirFolder, self).savemessage(uid, content, flags, rtime)
labels = imaputil.labels_from_header(self.labelsheader, labels = set()
self.getmessageheader(content, self.labelsheader)) for hstr in self.getmessageheaderlist(content, self.labelsheader):
labels.update(imaputil.labels_from_header(self.labelsheader, hstr))
ret = super(GmailMaildirFolder, self).savemessage(uid, content, flags, rtime) ret = super(GmailMaildirFolder, self).savemessage(uid, content, flags, rtime)
# Update the mtime and labels # Update the mtime and labels
@ -135,9 +138,9 @@ class GmailMaildirFolder(MaildirFolder):
content = file.read() content = file.read()
file.close() file.close()
oldlabels = imaputil.labels_from_header(self.labelsheader, oldlabels = set()
self.getmessageheader(content, self.labelsheader)) for hstr in self.getmessageheaderlist(content, self.labelsheader):
oldlabels.update(imaputil.labels_from_header(self.labelsheader, hstr))
labels = labels - ignorelabels labels = labels - ignorelabels
ignoredlabels = oldlabels & ignorelabels ignoredlabels = oldlabels & ignorelabels
@ -150,7 +153,11 @@ class GmailMaildirFolder(MaildirFolder):
# Change labels into content # Change labels into content
labels_str = imaputil.format_labels_string(self.labelsheader, labels_str = imaputil.format_labels_string(self.labelsheader,
sorted(labels | ignoredlabels)) sorted(labels | ignoredlabels))
# First remove old labels header, and then add the new one
content = self.deletemessageheaders(content, self.labelsheader)
content = self.addmessageheader(content, '\n', self.labelsheader, labels_str) content = self.addmessageheader(content, '\n', self.labelsheader, labels_str)
rtime = self.messagelist[uid].get('rtime', None) rtime = self.messagelist[uid].get('rtime', None)
# write file with new labels to a unique file in tmp # write file with new labels to a unique file in tmp