[PATCH 2/4] Re: Handle when UID can't be found on saved messages

Nicolas Sebrecht nicolas.s-dev at laposte.net
Tue Jul 26 17:31:09 BST 2011


On Tue, Jul 26, 2011 at 10:59:54AM +0200, Vladimir.Marek at oracle.com wrote:
> From: Vladimir Marek <vlmarek at volny.cz>
> 
> Message was stored to dstfolder, but we can't find it's UID. This means we can't
> link current message to the one created in IMAP. So we just delete local message
> and on next run we'll sync it back. Also fixed imap.savemessage description.
> 
> This was broken by e20d8b967942934ddbf4659b5ec328a9a18da6bc.

Thanks. Whole topic looks interesting enough to have another -rc4 cycle
before the stable, IMHO.

> Signed-off-by: Vladimir Marek <vlmarek at volny.cz>
> ---
>  offlineimap/folder/Base.py |    8 ++++++++
>  offlineimap/folder/IMAP.py |    6 ++++--
>  2 files changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/offlineimap/folder/Base.py b/offlineimap/folder/Base.py
> index 608d361..0d5ddae 100644
> --- a/offlineimap/folder/Base.py
> +++ b/offlineimap/folder/Base.py
> @@ -264,6 +264,14 @@ class BaseFolder(object):
>                      uid = newuid
>                  # Save uploaded status in the statusfolder
>                  statusfolder.savemessage(uid, message, flags, rtime)
> +            elif newuid == 0:
> +                # Message was stored to dstfolder, but we can't find it's UID
> +                # This means we can't link current message to the one created
> +                # in IMAP. So we just delete local message and on next run
> +                # we'll sync it back
> +                # XXX This could cause infinite loop on syncing between two
> +                # IMAP servers ...

I'm afraid about this infinite loop. Can you tell more?

I understand it could be done only if two instances of offlineimap are
running on both side.  Am I correct or did I miss something?

> +                self.deletemessage(uid)
>              else:
>                  raise UserWarning("Trying to save msg (uid %d) on folder "
>                                    "%s returned invalid uid %d" % \
> diff --git a/offlineimap/folder/IMAP.py b/offlineimap/folder/IMAP.py
> index 19a0340..1fa35f7 100644
> --- a/offlineimap/folder/IMAP.py
> +++ b/offlineimap/folder/IMAP.py
> @@ -409,8 +409,10 @@ class IMAPFolder(BaseFolder):
>          the new message after sucessfully saving it.
>  
>          :param rtime: A timestamp to be used as the mail date
> -        :returns: the UID of the new message as assigned by the
> -                  server. If the folder is read-only it will return 0."""
> +        :returns: the UID of the new message as assigned by the server. If the
> +                  message is saved, but it's UID can not be found, it will
                                           ^^^^
                                           its (?)

> +                  return 0. If the message can't be written (folder is
> +                  read-only for example) it will return -1."""
>          self.ui.debug('imap', 'savemessage: called')
>  
>          # already have it, just save modified flags

-- 
Nicolas Sebrecht




More information about the OfflineIMAP-project mailing list