Hello community, here is the log from the commit of package offlineimap for openSUSE:Factory checked in at 2017-02-15 10:07:47 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/offlineimap (Old) and /work/SRC/openSUSE:Factory/.offlineimap.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "offlineimap" Changes: -------- --- /work/SRC/openSUSE:Factory/offlineimap/offlineimap.changes 2016-12-03 18:27:50.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.offlineimap.new/offlineimap.changes 2017-02-15 10:07:48.784301958 +0100 @@ -1,0 +2,11 @@ +Mon Feb 13 14:23:12 UTC 2017 - mimi...@gmail.com + +- update to 7.0.13 +* init: register SIGABRT and handle as per SIGUSR2 +* learn repository retrycount configuration option +* earn authproxy configuration option +* folder: IMAP: add missing whitespace in error message +* repository: IMAP: correctly check the response while listing remote folders. +* older: IMAP: improve error message when Dovecot returns any data for UID FETCH + +------------------------------------------------------------------- Old: ---- offlineimap-7.0.12.tar.gz New: ---- offlineimap-7.0.13.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ offlineimap.spec ++++++ --- /var/tmp/diff_new_pack.dgEnSp/_old 2017-02-15 10:07:49.440209568 +0100 +++ /var/tmp/diff_new_pack.dgEnSp/_new 2017-02-15 10:07:49.440209568 +0100 @@ -1,7 +1,7 @@ # # spec file for package offlineimap # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %{!?_userunitdir:%define _userunitdir /usr/lib/systemd/user} Name: offlineimap -Version: 7.0.12 +Version: 7.0.13 Release: 0 Summary: Powerful IMAP/Maildir Synchronization Tool License: GPL-2.0+ ++++++ offlineimap-7.0.12.tar.gz -> offlineimap-7.0.13.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/Changelog.md new/offlineimap-7.0.13/Changelog.md --- old/offlineimap-7.0.12/Changelog.md 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/Changelog.md 2017-01-27 19:49:42.000000000 +0100 @@ -15,6 +15,42 @@ * The following excerpt is only usefull when rendered in the website. {:toc} +### OfflineIMAP v7.0.13 (2017-01-27) + +#### Notes + +Here is a small release with some new features. IMAP servers are better supported. + +The release cycle was improved. Now, we include a new freeze time before +important releases. + +#### Authors + +- Nicolas Sebrecht (8) +- lkcl (2) +- Chris Smart (1) + +#### Features + +- init: register SIGABRT and handle as per SIGUSR2. [Chris Smart] +- add documentation about SIGABRT. [Nicolas Sebrecht] +- learn repository retrycount configuration option. [lkcl] +- learn authproxy configuration option. [lkcl] + +#### Fixes + +- folder: IMAP: add missing whitespace in error message. [Nicolas Sebrecht] +- repository: IMAP: correctly check the response while listing remote folders. [Nicolas Sebrecht] +- release.sh: correctly sort releases to compute latest stable and rc. [Nicolas Sebrecht] + +#### Changes + +- manual: KNOWN ISSUES: add documentation about the deletions. [Nicolas Sebrecht] +- folder: IMAP: improve error message when Dovecot returns any data for UID FETCH. [Nicolas Sebrecht] +- MAINTAINERS: add new official testers. [Nicolas Sebrecht] + + + ### OfflineIMAP v7.0.12 (2016-11-30) #### Notes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/MAINTAINERS.rst new/offlineimap-7.0.13/MAINTAINERS.rst --- old/offlineimap-7.0.12/MAINTAINERS.rst 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/MAINTAINERS.rst 2017-01-27 19:49:42.000000000 +0100 @@ -11,6 +11,10 @@ - email: mathstuf at gmail.com - github: mathstuf +- Darshit Shah + - email: darnir at gmail.com + - github: darnir + - Eygene Ryabinkin - email: rea at freebsd.org - github: konvpalto @@ -25,6 +29,10 @@ - github: iliastsi - other: Debian maintainer +- "J" + - email: offlineimap at 927589452.de + - other: FreeBSD user + - Łukasz Żarnowiecki - email: dolohow at outlook.com - github: dolohow @@ -32,6 +40,12 @@ - Nicolas Sebrecht - email: nicolas.s-dev at laposte.net - github: nicolas33 + - system: Linux + +- Rainer M Krug + - email: Rainer at krugs.de + - github: rkrug + - system: OSX - Sebastian Spaeth - email: sebastian at sspaeth.de @@ -44,11 +58,14 @@ - Abdó Roig-Maranges - Ben Boeckel +- Darshit Shah - Eygene Ryabinkin - Igor Almeida - Ilias Tsitsimpis +- "J" - Łukasz Żarnowiecki - Nicolas Sebrecht +- Rainer M Krug Maintainers diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/contrib/release.sh new/offlineimap-7.0.13/contrib/release.sh --- old/offlineimap-7.0.12/contrib/release.sh 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/contrib/release.sh 2017-01-27 19:49:42.000000000 +0100 @@ -289,11 +289,11 @@ function get_last_rc () { - git tag | grep -E '^v([0-9][\.-]){3}rc' | sort -n | tail -n1 + git tag | grep -E '^v([0-9][\.-]){3}rc' | sort -V | tail -n1 } function get_last_stable () { - git tag | grep -E '^v([0-9][\.])+' | grep -v '\-rc' | sort -n | tail -n1 + git tag | grep -E '^v([0-9][\.])+' | grep -v '\-rc' | sort -V | tail -n1 } function update_website_releases_info() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/contrib/systemd/README.md new/offlineimap-7.0.13/contrib/systemd/README.md --- old/offlineimap-7.0.12/contrib/systemd/README.md 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/contrib/systemd/README.md 2017-01-27 19:49:42.000000000 +0100 @@ -12,8 +12,38 @@ ## Systemd units -These unit files are meant to be used in the user session. You may drop them into `/etc/systemd/user` or `${XDG_DATA_HOME}/systemd/user` followed by `systemctl --user daemon-reload` to have systemd aware of the unit files. +These unit files are meant to be used in the user session. You may drop them +into `/etc/systemd/user` or `${XDG_DATA_HOME}/systemd/user` followed by +`systemctl --user daemon-reload` to have systemd aware of the unit files. -These files are meant to be triggered either manually using `systemctl --user start offlineimap.service` or by enabling the timer unit using `systemctl --user enable offlineimap.timer`. Additionally, specific accounts may be triggered by using `offlineimap@myaccount.timer` or `offlineimap@myaccount.service`. +These files are meant to be triggered either manually using `systemctl --user +start offlineimap.service` or by enabling the timer unit using `systemctl --user +enable offlineimap.timer`. Additionally, specific accounts may be triggered by +using `offlineimap@myaccount.timer` or `offlineimap@myaccount.service`. + +These unit files are installed as being enabled via a `mail.target` unit which +is intended to be a catch-all for mail-related unit files. A simple +`mail.target` file is also provided. + +## Signals + +Systemd supports a watchdog (via the WatchdogSec service file option) which +will send the program a SIGABRT when the timer expires. + +Offlineimap handles it in the same manner as SIGUSR2, so that the current +synchronisation is completed before the program exits safely. + +This makes offlineimap more flexible and robust for persistent setups that make +use of holdconnectionopen and autorefresh options. + +For example, it may be useful in assisting with the occasional situation where +offlineimap may not return successfully after a suspend and resume. + +To make use of this, users could add the following to the [Service] section of +their systemd offlineimap service file (restart every 5 minutes): + +``` conf +Restart=on-watchdog +WatchdogSec=300 +``` -These unit files are installed as being enabled via a `mail.target` unit which is intended to be a catch-all for mail-related unit files. A simple `mail.target` file is also provided. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/contrib/systemd/offlineimap.service new/offlineimap-7.0.13/contrib/systemd/offlineimap.service --- old/offlineimap-7.0.12/contrib/systemd/offlineimap.service 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/contrib/systemd/offlineimap.service 2017-01-27 19:49:42.000000000 +0100 @@ -6,6 +6,8 @@ ExecStart=/usr/bin/offlineimap -o -u syslog # Give 12 seconds for offlineimap to gracefully stop before hard killing it. TimeoutStopSec=12 +#Restart=on-watchdog +#WatchdogSec=300 [Install] WantedBy=mail.target diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/contrib/systemd/offlineimap@.service new/offlineimap-7.0.13/contrib/systemd/offlineimap@.service --- old/offlineimap-7.0.12/contrib/systemd/offlineimap@.service 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/contrib/systemd/offlineimap@.service 2017-01-27 19:49:42.000000000 +0100 @@ -4,6 +4,8 @@ [Service] Type=oneshot ExecStart=/usr/bin/offlineimap -o -a %i -u syslog +#Restart=on-watchdog +#WatchdogSec=300 [Install] WantedBy=mail.target diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/docs/offlineimap.known_issues.txt new/offlineimap-7.0.13/docs/offlineimap.known_issues.txt --- old/offlineimap-7.0.12/docs/offlineimap.known_issues.txt 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/docs/offlineimap.known_issues.txt 2017-01-27 19:49:42.000000000 +0100 @@ -1,4 +1,15 @@ +* Deletions. ++ +While in usual run the deletions are propagated. To prevent from data loss, +removing a folder makes offlineimap re-sync the folder. However, propagating the +removal of the whole content of a folder can happen in the two following cases: + + - The whole content of a folder is deleted but the folder directory still + exists. + + - The parent directory of the folder was deleted. + * SSL3 write pending. + Users enabling SSL may hit a bug about "SSL3 write pending". If so, the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/docs/offlineimap.txt new/offlineimap-7.0.13/docs/offlineimap.txt --- old/offlineimap-7.0.12/docs/offlineimap.txt 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/docs/offlineimap.txt 2017-01-27 19:49:42.000000000 +0100 @@ -315,10 +315,10 @@ accounts that are configured to 'autorefresh'. In effect, this will trigger a full sync of all accounts to be performed as soon as possible. -* If sent a SIGUSR2, it will stop 'autorefresh' mode for all accounts. That -is, accounts will abort any current sleep and will exit after a currently -running synchronization has finished. This signal can be used to gracefully -exit out of a running offlineimap "daemon". +* If sent a SIGUSR2 or SIGABRT, it will stop 'autorefresh' mode for all +accounts. That is, accounts will abort any current sleep and will exit after a +currently running synchronization has finished. This signal can be used to +gracefully exit out of a running offlineimap "daemon". * SIGTERM, SIGINT, SIGHUP are all treated to gracefully terminate as soon as possible. This means it will finish syncing the current folder in each diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/offlineimap/__init__.py new/offlineimap-7.0.13/offlineimap/__init__.py --- old/offlineimap-7.0.12/offlineimap/__init__.py 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/offlineimap/__init__.py 2017-01-27 19:49:42.000000000 +0100 @@ -2,7 +2,7 @@ __productname__ = 'OfflineIMAP' # Expecting trailing "-rcN" or "" for stable releases. -__version__ = "7.0.12" +__version__ = "7.0.13" __copyright__ = "Copyright 2002-2016 John Goerzen & contributors" __author__ = "John Goerzen" __author_email__= "offlineimap-proj...@lists.alioth.debian.org" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/offlineimap/folder/Gmail.py new/offlineimap-7.0.13/offlineimap/folder/Gmail.py --- old/offlineimap-7.0.12/offlineimap/folder/Gmail.py 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/offlineimap/folder/Gmail.py 2017-01-27 19:49:42.000000000 +0100 @@ -71,7 +71,7 @@ (probably severity MESSAGE) if e.g. no message with this UID could be found. """ - data = self._fetch_from_imap(str(uid), 2) + data = self._fetch_from_imap(str(uid), self.retrycount) # data looks now e.g. #[('320 (X-GM-LABELS (...) UID 17061 BODY[] {2565}','msgbody....')] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/offlineimap/folder/IMAP.py new/offlineimap-7.0.13/offlineimap/folder/IMAP.py --- old/offlineimap-7.0.12/offlineimap/folder/IMAP.py 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/offlineimap/folder/IMAP.py 2017-01-27 19:49:42.000000000 +0100 @@ -55,6 +55,9 @@ # self.ui is set in BaseFolder. self.imap_query = ['BODY.PEEK[]'] + # number of times to retry fetching messages + self.retrycount = self.repository.getconfint('retrycount', 2) + fh_conf = self.repository.account.getconf('filterheaders', '') self.filterheaders = [h for h in re.split(r'\s*,\s*', fh_conf) if h] @@ -305,7 +308,7 @@ this UID could be found. """ - data = self._fetch_from_imap(str(uid), 2) + data = self._fetch_from_imap(str(uid), self.retrycount) # Data looks now e.g. # [('320 (UID 17061 BODY[] {2565}','msgbody....')] @@ -757,13 +760,15 @@ # exactly one response. if res_type == 'OK': data = [res for res in data if not isinstance(res, str)] - # Could not fetch message. + + # Could not fetch message. Note: it is allowed by rfc3501 to return any + # data for the UID FETCH command. if data == [None] or res_type != 'OK' or len(data) != 1: severity = OfflineImapError.ERROR.MESSAGE reason = "IMAP server '%s' failed to fetch messages UID '%s'."\ - "Server responded: %s %s"% (self.getrepository(), uids, + " Server responded: %s %s"% (self.getrepository(), uids, res_type, data) - if data == [None]: + if data == [None] or len(data) < 1: # IMAP server did not find a message with this UID. reason = "IMAP server '%s' does not have a message "\ "with UID '%s'"% (self.getrepository(), uids) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/offlineimap/imapserver.py new/offlineimap-7.0.13/offlineimap/imapserver.py --- old/offlineimap-7.0.12/offlineimap/imapserver.py 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/offlineimap/imapserver.py 2017-01-27 19:49:42.000000000 +0100 @@ -134,27 +134,43 @@ # In order to support proxy connection, we have to override the # default socket instance with our own socksified socket instance. # We add this option to bypass the GFW in China. - _account_section = 'Account ' + self.repos.account.name - if not self.config.has_option(_account_section, 'proxy'): - self.proxied_socket = socket.socket - else: - proxy = self.config.get(_account_section, 'proxy') - # Powered by PySocks. - try: - import socks - proxy_type, host, port = proxy.split(":") - port = int(port) - socks.setdefaultproxy(getattr(socks, proxy_type), host, port) - self.proxied_socket = socks.socksocket - except ImportError: - self.ui.warn("PySocks not installed, ignoring proxy option.") - self.proxied_socket = socket.socket - except (AttributeError, ValueError) as e: - self.ui.warn("Bad proxy option %s for account %s: %s " - "Ignoring proxy option."% - (proxy, self.repos.account.name, e)) - self.proxied_socket = socket.socket + self.proxied_socket = self._get_proxy('proxy', socket.socket) + # Turns out that the GFW in China is no longer blocking imap.gmail.com + # However accounts.google.com (for oauth2) definitey is. Therefore + # it is not strictly necessary to use a proxy for *both* IMAP *and* + # oauth2, so a new option is added: authproxy. + + # Set proxy for use in authentication (only) if desired. + # If not set, is same as proxy option (compatible with current configs) + # To use a proxied_socket but not an authproxied_socket + # set authproxy = '' in config + self.authproxied_socket = self._get_proxy('authproxy', + self.proxied_socket) + + def _get_proxy(self, proxysection, dfltsocket): + _account_section = 'Account ' + self.repos.account.name + if not self.config.has_option(_account_section, proxysection): + return dfltsocket + proxy = self.config.get(_account_section, proxysection) + if proxy == '': + # explicitly set no proxy (overrides default return of dfltsocket) + return socket.socket + + # Powered by PySocks. + try: + import socks + proxy_type, host, port = proxy.split(":") + port = int(port) + socks.setdefaultproxy(getattr(socks, proxy_type), host, port) + return socks.socksocket + except ImportError: + self.ui.warn("PySocks not installed, ignoring proxy option.") + except (AttributeError, ValueError) as e: + self.ui.warn("Bad proxy option %s for account %s: %s " + "Ignoring %s option."% + (proxy, self.repos.account.name, e, proxysection)) + return dfltsocket def __getpassword(self): """Returns the server password or None""" @@ -227,7 +243,7 @@ self.ui.debug('imap', 'xoauth2handler: params "%s"'% params) original_socket = socket.socket - socket.socket = self.proxied_socket + socket.socket = self.authproxied_socket try: response = urllib.urlopen( self.oauth2_request_url, urllib.urlencode(params)).read() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/offlineimap/init.py new/offlineimap-7.0.13/offlineimap/init.py --- old/offlineimap-7.0.12/offlineimap/init.py 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/offlineimap/init.py 2017-01-27 19:49:42.000000000 +0100 @@ -416,7 +416,7 @@ if sig == signal.SIGUSR1: # tell each account to stop sleeping accounts.Account.set_abort_event(self.config, 1) - elif sig == signal.SIGUSR2: + elif sig in (signal.SIGUSR2, signal.SIGABRT): # tell each account to stop looping getglobalui().warn("Terminating after this sync...") accounts.Account.set_abort_event(self.config, 2) @@ -442,6 +442,7 @@ signal.signal(signal.SIGHUP, sig_handler) signal.signal(signal.SIGUSR1, sig_handler) signal.signal(signal.SIGUSR2, sig_handler) + signal.signal(signal.SIGABRT, sig_handler) signal.signal(signal.SIGTERM, sig_handler) signal.signal(signal.SIGINT, sig_handler) signal.signal(signal.SIGQUIT, sig_handler) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/offlineimap/repository/IMAP.py new/offlineimap-7.0.13/offlineimap/repository/IMAP.py --- old/offlineimap-7.0.12/offlineimap/repository/IMAP.py 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/offlineimap/repository/IMAP.py 2017-01-27 19:49:42.000000000 +0100 @@ -454,17 +454,29 @@ listfunction = imapobj.list if self.getconfboolean('subscribedonly', False): listfunction = imapobj.lsub + try: - listresult = listfunction(directory=self.imapserver.reference)[1] + result, listresult = listfunction(directory=self.imapserver.reference) + if result != 'OK': + raise OfflineImapError("Could not list the folders for" + " repository %s. Server responded: %s"% + (self.name, self, str(listresult)), + OfflineImapError.ERROR.FOLDER) finally: self.imapserver.releaseconnection(imapobj) + for s in listresult: if s == None or \ (isinstance(s, str) and s == ''): # Bug in imaplib: empty strings in results from # literals. TODO: still relevant? continue - flags, delim, name = imaputil.imapsplit(s) + try: + flags, delim, name = imaputil.imapsplit(s) + except ValueError: + self.ui.error( + "could not correctly parse server response; got: %s"% s) + raise flaglist = [x.lower() for x in imaputil.flagsplit(flags)] if '\\noselect' in flaglist: continue diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/offlineimap-7.0.12/offlineimap.conf new/offlineimap-7.0.13/offlineimap.conf --- old/offlineimap-7.0.12/offlineimap.conf 2016-11-30 22:40:59.000000000 +0100 +++ new/offlineimap-7.0.13/offlineimap.conf 2017-01-27 19:49:42.000000000 +0100 @@ -437,6 +437,21 @@ #proxy = SOCKS5:IP:9999 +# TESTING: This option stands in the [Account Test] section. +# +# Use authproxy connection for this account. Useful to bypass the GFW in China. +# Set this if you wish to use a proxy for authentication but not for IMAP. +# If not explicitly set, this option defaults to use the proxy socket +# (so as to be compatible with prior config files). +# If that is specifically NOT desired, use authproxy = '' +# +# To specify a proxy connection, join proxy type, host and port with colons. +# Available proxy types are SOCKS5, SOCKS4, HTTP. +# You also need to install PySocks through pip or your distro package manager. +# +#authproxy = SOCKS5:IP:9999 + + [Repository LocalExample] # Each repository requires a "type" declaration. The types supported for @@ -1255,6 +1270,26 @@ #"cvlc --play-and-stop --play-and-exit /path/to/sound/file.mp3 > /dev/null 2>&1") +# This option stands in the [Repository RemoteExample] section. [TESTING] +# +# Operating under extreme network conditions (China) network connectivity +# especially for SSL can be so bad and so slow that absolutely every possible +# kind of connectivity error that can occur does occur. +# +# Rather than have offlineimap exit on errors it may be preferable to have it +# simply retry fetching of messages dozens of times. The alternative is to +# restart offlineimap in a constant loop, which may involve using significant +# CPU cycles (if the repository is large) to load up the UID database again. +# +# This option is best utilised in combination with socktimeout, which catches +# instances of interference by e.g. the GFW at the TCP layer, as well as China +# ISPs simply not coping. +# +# Default value: retrycount = 2 +# +#retrycount = 2 + + # This option stands in the [Repository RemoteExample] section. # # If offlineiamp is having troubles to download some UIDS, it's possible to get