fix inaccurate UI messages when some messages are excluded from the cached lists
Some messages were excluded from the copy/delete list after the UI message said they were copied/deleted. Also fix Internaldate2epoch(), which was wrong. Signed-off-by: Janna Martl <janna.martl109@gmail.com> Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
This commit is contained in:
parent
03114b1867
commit
428349e3f4
@ -365,7 +365,8 @@ class BaseFolder(object):
|
|||||||
dryrun mode."""
|
dryrun mode."""
|
||||||
|
|
||||||
for uid in uidlist:
|
for uid in uidlist:
|
||||||
self.addmessageflags(uid, flags)
|
if self.uidexists(uid):
|
||||||
|
self.addmessageflags(uid, flags)
|
||||||
|
|
||||||
def deletemessageflags(self, uid, flags):
|
def deletemessageflags(self, uid, flags):
|
||||||
"""Removes each flag given from the message's flag set. If a given
|
"""Removes each flag given from the message's flag set. If a given
|
||||||
@ -695,11 +696,6 @@ class BaseFolder(object):
|
|||||||
content = self.getmessage(uid)
|
content = self.getmessage(uid)
|
||||||
rtime = emailutil.get_message_date(content, 'Date')
|
rtime = emailutil.get_message_date(content, 'Date')
|
||||||
|
|
||||||
if uid > 0 and dstfolder.uidexists(uid):
|
|
||||||
# dst has message with that UID already, only update status
|
|
||||||
statusfolder.savemessage(uid, None, flags, rtime)
|
|
||||||
return
|
|
||||||
|
|
||||||
# If any of the destinations actually stores the message body,
|
# If any of the destinations actually stores the message body,
|
||||||
# load it up.
|
# load it up.
|
||||||
if dstfolder.storesmessages():
|
if dstfolder.storesmessages():
|
||||||
@ -766,6 +762,16 @@ class BaseFolder(object):
|
|||||||
# bail out on CTRL-C or SIGTERM
|
# bail out on CTRL-C or SIGTERM
|
||||||
if offlineimap.accounts.Account.abort_NOW_signal.is_set():
|
if offlineimap.accounts.Account.abort_NOW_signal.is_set():
|
||||||
break
|
break
|
||||||
|
if uid > 0 and dstfolder.uidexists(uid):
|
||||||
|
# dst has message with that UID already, only update status
|
||||||
|
flags = self.getmessageflags(uid)
|
||||||
|
rtime = self.getmessagetime(uid)
|
||||||
|
if dstfolder.utime_from_message:
|
||||||
|
content = self.getmessage(uid)
|
||||||
|
rtime = emailutil.get_message_date(content, 'Date')
|
||||||
|
statusfolder.savemessage(uid, None, flags, rtime)
|
||||||
|
copylist.remove(uid)
|
||||||
|
|
||||||
self.ui.copyingmessage(uid, num+1, num_to_copy, self, dstfolder)
|
self.ui.copyingmessage(uid, num+1, num_to_copy, self, dstfolder)
|
||||||
# exceptions are caught in copymessageto()
|
# exceptions are caught in copymessageto()
|
||||||
if self.suggeststhreads() and not globals.options.singlethreading:
|
if self.suggeststhreads() and not globals.options.singlethreading:
|
||||||
@ -790,19 +796,24 @@ class BaseFolder(object):
|
|||||||
that were deleted in 'self'. Delete those from dstfolder and
|
that were deleted in 'self'. Delete those from dstfolder and
|
||||||
statusfolder.
|
statusfolder.
|
||||||
|
|
||||||
This function checks and protects us from action in ryrun mode.
|
This function checks and protects us from action in dryrun mode.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
deletelist = filter(lambda uid: uid >= 0 and not
|
deletelist = filter(lambda uid: uid >= 0 and not
|
||||||
self.uidexists(uid), statusfolder.getmessageuidlist())
|
self.uidexists(uid), statusfolder.getmessageuidlist())
|
||||||
if len(deletelist):
|
if len(deletelist):
|
||||||
self.ui.deletingmessages(deletelist, [dstfolder])
|
# Delete in statusfolder first to play safe. In case of abort, we
|
||||||
if self.repository.account.dryrun:
|
# won't lose message, we will just unneccessarily retransmit some.
|
||||||
return #don't delete messages in dry-run mode
|
# Delete messages from statusfolder that were either deleted by the
|
||||||
# delete in statusfolder first to play safe. In case of abort, we
|
# user, or not being tracked (e.g. because of maxage).
|
||||||
# won't lose message, we will just retransmit some unneccessary.
|
statusfolder.deletemessages(deletelist)
|
||||||
for folder in [statusfolder, dstfolder]:
|
# Filter out untracked messages
|
||||||
folder.deletemessages(deletelist)
|
deletelist = filter(lambda uid: dstfolder.uidexists(uid), deletelist)
|
||||||
|
if len(deletelist):
|
||||||
|
self.ui.deletingmessages(deletelist, [dstfolder])
|
||||||
|
if self.repository.account.dryrun:
|
||||||
|
return #don't delete messages in dry-run mode
|
||||||
|
dstfolder.deletemessages(deletelist)
|
||||||
|
|
||||||
def __syncmessagesto_flags(self, dstfolder, statusfolder):
|
def __syncmessagesto_flags(self, dstfolder, statusfolder):
|
||||||
"""Pass 3: Flag synchronization.
|
"""Pass 3: Flag synchronization.
|
||||||
|
@ -836,8 +836,6 @@ class IMAPFolder(BaseFolder):
|
|||||||
self.__deletemessages_noconvert(uidlist)
|
self.__deletemessages_noconvert(uidlist)
|
||||||
|
|
||||||
def __deletemessages_noconvert(self, uidlist):
|
def __deletemessages_noconvert(self, uidlist):
|
||||||
# Weed out ones not in self.messagelist
|
|
||||||
uidlist = [uid for uid in uidlist if self.uidexists(uid)]
|
|
||||||
if not len(uidlist):
|
if not len(uidlist):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -439,9 +439,6 @@ class MaildirFolder(BaseFolder):
|
|||||||
:return: Nothing, or an Exception if UID but no corresponding file
|
:return: Nothing, or an Exception if UID but no corresponding file
|
||||||
found.
|
found.
|
||||||
"""
|
"""
|
||||||
if not self.uidexists(uid):
|
|
||||||
return
|
|
||||||
|
|
||||||
filename = self.messagelist[uid]['filename']
|
filename = self.messagelist[uid]['filename']
|
||||||
filepath = os.path.join(self.getfullname(), filename)
|
filepath = os.path.join(self.getfullname(), filename)
|
||||||
try:
|
try:
|
||||||
|
@ -222,6 +222,8 @@ def Internaldate2epoch(resp):
|
|||||||
|
|
||||||
Returns seconds since the epoch."""
|
Returns seconds since the epoch."""
|
||||||
|
|
||||||
|
from calendar import timegm
|
||||||
|
|
||||||
mo = InternalDate.match(resp)
|
mo = InternalDate.match(resp)
|
||||||
if not mo:
|
if not mo:
|
||||||
return None
|
return None
|
||||||
@ -245,4 +247,4 @@ def Internaldate2epoch(resp):
|
|||||||
|
|
||||||
tt = (year, mon, day, hour, min, sec, -1, -1, -1)
|
tt = (year, mon, day, hour, min, sec, -1, -1, -1)
|
||||||
|
|
||||||
return time.mktime(tt)
|
return timegm(tt) - zone
|
||||||
|
Loading…
Reference in New Issue
Block a user