Compare commits
60 Commits
Author | SHA1 | Date |
---|---|---|
Chris Coleman | ffbace51a2 | |
Chris Coleman | 7eacce1f58 | |
Chris Coleman | 87b04f0f54 | |
Chris Coleman | 8bd94ee8bc | |
Nicolas Sebrecht | e70d3992a0 | |
Nicolas Sebrecht | 99a7f74805 | |
Nicolas Sebrecht | 6e837c614d | |
Nicolas Sebrecht | 1953001196 | |
Nicolas Sebrecht | a4ee6675ce | |
Nicolas Sebrecht | a2a92e7433 | |
Nicolas Sebrecht | feec770809 | |
Cathal Garvey | 069c05a0c2 | |
Nicolas Sebrecht | 2d0d07cd6a | |
Rodolfo García Peñas (kix) | 595b814074 | |
Rodolfo García Peñas (kix) | 2722234d16 | |
Rodolfo García Peñas (kix) | 3d925b006a | |
Rodolfo García Peñas (kix) | c7cb68ad7f | |
Reto Schnyder | f6935342c2 | |
Nicolas Sebrecht | 21332efb08 | |
Nicolas Sebrecht | fdb9974ab7 | |
Martin Di Paola | c13e0135a7 | |
Martin Di Paola | 8599cab2ab | |
Nicolas Sebrecht | 7531ac4640 | |
Herton R. Krzesinski | 6a25f1930c | |
Frank LENORMAND | da69fd81ed | |
martin f. krafft | 4562b1c5d1 | |
Chris Coleman | 84efb45270 | |
Nicolas Sebrecht | 564930725e | |
Nicolas Sebrecht | 1e4990524e | |
Chris Coleman | 50cfab5ba2 | |
Jaroslav Lichtblau | 3c80607907 | |
Nicolas Sebrecht | f6e08b8609 | |
Chris Coleman | 85c7692284 | |
Chris Coleman | c35e9257fd | |
Jess | c391141b56 | |
Nicolas Sebrecht | c53664544e | |
Chris Coutinho | 403ddf9c1c | |
Nicolas Sebrecht | 4208fd4a15 | |
Nicolas Sebrecht | 0b18cb5e73 | |
Nicolas Sebrecht | 3d918ff7fe | |
Nicolas Sebrecht | 4464195326 | |
Nicolas Sebrecht | ba4ecea9e4 | |
Dario Maiocchi | 805a1c156c | |
Nicolas Sebrecht | 9c6a1760b4 | |
Ilias Tsitsimpis | beaaf77a1a | |
Julien Cristau | 0a831b3cab | |
Nicolas Sebrecht | 741b33b455 | |
Ben Cotterell | 8d5b22bd09 | |
Nicolas Sebrecht | 8406ba3bb4 | |
Nicolas Sebrecht | c97fe498e6 | |
Olivier Mehani | 0d5496ba0a | |
Nicolas Sebrecht | 06ed00a211 | |
Nicolas Sebrecht | 801893cc73 | |
kimim | 93bc8d11ac | |
kimim | 2806f40071 | |
Jelmer Vernooij | 8a7946e338 | |
Nicolas Sebrecht | 64c763c7f5 | |
Nicolas Sebrecht | 0d865c2e36 | |
Kyle Altendorf | 57a43f5bba | |
Nicolas Sebrecht | f9aefed704 |
|
@ -0,0 +1,3 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
open_collective: offlineimap-organization
|
|
@ -4,11 +4,11 @@
|
|||
|
||||
> Add character x `[x]`.
|
||||
|
||||
- [] I've read the [DCO](http://www.offlineimap.org/doc/dco.html).
|
||||
- [] I've read the [Coding Guidelines](http://www.offlineimap.org/doc/CodingGuidelines.html)
|
||||
- [] The relevant informations about the changes stands in the commit message, not here in the message of the pull request.
|
||||
- [] Code changes follow the style of the files they change.
|
||||
- [] Code is tested (provide details).
|
||||
- [ ] I've read the [DCO](http://www.offlineimap.org/doc/dco.html).
|
||||
- [ ] I've read the [Coding Guidelines](http://www.offlineimap.org/doc/CodingGuidelines.html)
|
||||
- [ ] The relevant informations about the changes stands in the commit message, not here in the message of the pull request.
|
||||
- [ ] Code changes follow the style of the files they change.
|
||||
- [ ] Code is tested (provide details).
|
||||
|
||||
### References
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
language: python
|
||||
python:
|
||||
- '2.7'
|
||||
- '3.6'
|
||||
notifications:
|
||||
webhooks:
|
||||
urls:
|
||||
|
@ -30,12 +29,6 @@ matrix:
|
|||
- os: osx
|
||||
language: generic
|
||||
env: PYTHON=2.7.14 OUTLOOK_AUTH=LOGIN GMAIL_AUTH=XOAUTH2
|
||||
- os: osx
|
||||
language: generic
|
||||
env: PYTHON=3.6.4 OUTLOOK_AUTH=PLAIN GMAIL_AUTH=XOAUTH2
|
||||
- os: osx
|
||||
language: generic
|
||||
env: PYTHON=3.6.4 OUTLOOK_AUTH=LOGIN GMAIL_AUTH=XOAUTH2
|
||||
allow_failures:
|
||||
- os: osx
|
||||
cache: pip
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
### Many thanks to our wonderful Sponsors! Your generous support helps us maintain OfflineIMAP.
|
||||
|
||||
|
||||
<!-- PLATINUM sponsors: in the README.md and on the front page of website -->
|
||||
<!-- https://shields.io/opencollective/tier/offlineimap-organization/12940 -->
|
||||
|
||||
<!-- GOLD sponsors: in the README.md and on the front page of website -->
|
||||
<!-- https://shields.io/opencollective/tier/offlineimap-organization/12941 -->
|
||||
|
||||
# SILVER sponsors <!-- here and on sponsors page of website -->
|
||||
<!-- https://shields.io/opencollective/tier/offlineimap-organization/12942 -->
|
||||
[![silver-zeronet-logo]][silver-zeronet-link]
|
||||
|
||||
![Silver Sponsors][silver]
|
||||
|
||||
# BRONZE sponsors <!-- here only -->
|
||||
<!-- https://shields.io/opencollective/tier/offlineimap-organization/12873 -->
|
||||
![Bronze Sponsors][bronze]
|
||||
|
||||
<!-- links / references -->
|
||||
[silver]: https://opencollective.com/offlineimap-organization/tiers/silver-sponsor.svg "Our Silver Sponsors"
|
||||
[silver-zeronet-logo]: https://github.com/OfflineIMAP/offlineimap.github.io/raw/master/assets/img/sponsors/zeronet.svg
|
||||
[silver-zeronet-link]: https://zeronet.co.nz/ "Zeronet - naturally fast internet"
|
||||
[bronze]: https://opencollective.com/offlineimap-organization/tiers/bronze-sponsor.svg "Our Bronze Sponsors"
|
249
Changelog.md
249
Changelog.md
|
@ -15,6 +15,255 @@ Note to mainainers:
|
|||
* The following excerpt is only usefull when rendered in the website.
|
||||
{:toc}
|
||||
|
||||
### OfflineIMAP v7.3.4 (2021-08-03)
|
||||
|
||||
#### Notes
|
||||
|
||||
The release is likely the last minor release. This project will be maintained
|
||||
for minor bug fixes only.
|
||||
|
||||
In this version we've backported patches from the offlineimap3 project. There's
|
||||
no new features. Users should try this fork. The official project is there and
|
||||
is maintained by Rodolfo:
|
||||
|
||||
https://github.com/OfflineIMAP/offlineimap3
|
||||
|
||||
This release was tested by:
|
||||
|
||||
- Nicolas Sebrecht
|
||||
|
||||
|
||||
#### Authors
|
||||
|
||||
- Nicolas Sebrecht (5)
|
||||
- Rodolfo García Peñas (kix) (4)
|
||||
- Martin Di Paola (2)
|
||||
- Reto Schnyder (1)
|
||||
|
||||
|
||||
#### Fixes
|
||||
|
||||
- folder: IMAP: fix issue when the response of searchforheaders is the same UID multiple times. [Nicolas Sebrecht]
|
||||
- Fix hooks for IDLE sync. [Reto Schnyder]
|
||||
- Changed wrong comparison equal. [Rodolfo García Peñas (kix)]
|
||||
- Comparison error. [Rodolfo García Peñas (kix)]
|
||||
- remove outdated links to travis. [Nicolas Sebrecht]
|
||||
- ui init is lintian clean. [Rodolfo García Peñas (kix)]
|
||||
- Require the minimal dependencies in python package. [Martin Di Paola]
|
||||
|
||||
#### Changes
|
||||
|
||||
- README: update regarding the offlineimap3 fork. [Nicolas Sebrecht]
|
||||
- redirect the users to offlineimap3. [Nicolas Sebrecht]
|
||||
- threadutil imports not used. [Rodolfo García Peñas (kix)]
|
||||
- Move out pkg attributes from __init__.py. [Martin Di Paola]
|
||||
|
||||
|
||||
### OfflineIMAP v7.3.3 (2020-04-11)
|
||||
|
||||
#### Notes
|
||||
|
||||
Here is a small release after nearly 4 months of slow moves. Still, the patches
|
||||
are very usefull for some use cases. Thanks to the contributors!
|
||||
|
||||
This release was tested by:
|
||||
|
||||
- Nicolas Sebrecht
|
||||
|
||||
|
||||
#### Authors
|
||||
|
||||
- Chris Coleman (1)
|
||||
- Frank LENORMAND (1)
|
||||
- Herton R. Krzesinski (1)
|
||||
- martin f. krafft (1)
|
||||
|
||||
|
||||
#### Features
|
||||
|
||||
- export env. variables when running account hooks. [Frank LENORMAND]
|
||||
|
||||
#### Fixes
|
||||
|
||||
- Fix stale gss api authentication security context. [Herton R. Krzesinski]
|
||||
- Handle [ALREADYEXISTS] and Mailbox already exists!. [Chris Coleman]
|
||||
|
||||
#### Changes
|
||||
|
||||
- exec() the tunnel command. [martin f. krafft]
|
||||
|
||||
|
||||
|
||||
|
||||
### OfflineIMAP v7.3.2 (2019-12-17)
|
||||
|
||||
#### Notes
|
||||
|
||||
This is a very small bug fix release.
|
||||
|
||||
|
||||
This release was tested by:
|
||||
|
||||
- Nicolas Sebrecht
|
||||
|
||||
|
||||
#### Authors
|
||||
|
||||
- Jaroslav Lichtblau (1)
|
||||
- Nicolas Sebrecht (1)
|
||||
|
||||
|
||||
#### Fixes
|
||||
|
||||
- Revert "fix check for unsupported sep character". [Nicolas Sebrecht]
|
||||
- Fixing the Arch Linux name. [Jaroslav Lichtblau]
|
||||
|
||||
|
||||
### OfflineIMAP v7.3.1 (2019-12-15)
|
||||
|
||||
#### Notes
|
||||
|
||||
|
||||
This release was tested by:
|
||||
|
||||
- Nicolas Sebrecht
|
||||
|
||||
|
||||
#### Authors
|
||||
|
||||
- Nicolas Sebrecht (5)
|
||||
- Chris Coleman (1)
|
||||
- Chris Coutinho (1)
|
||||
- Jess (1)
|
||||
|
||||
|
||||
#### Features
|
||||
|
||||
- Additional address for sysloghandler to handle mac. [Chris Coutinho]
|
||||
- Added financial contributors to the README. [Jess]
|
||||
- Introduce FUNDING.yml for opencollective. [Nicolas Sebrecht]
|
||||
|
||||
|
||||
#### Fixes
|
||||
|
||||
- Fix check for unsupported sep character. [Nicolas Sebrecht]
|
||||
- Contrib: use yaml.safe_load() instead of load(). [Nicolas Sebrecht]
|
||||
- Ensure python2 in the release workflow. [Nicolas Sebrecht]
|
||||
- Make docs: ensure py2 when running sphinx. [Nicolas Sebrecht]
|
||||
|
||||
|
||||
#### Changes
|
||||
|
||||
- Update README.md. [Chris Coleman]
|
||||
|
||||
|
||||
### OfflineIMAP v7.3.0 (2019-08-19)
|
||||
|
||||
#### Notes
|
||||
|
||||
Here comes a new release.
|
||||
|
||||
The upstream imaplib2 project is discontinued. That's why I've decided to take
|
||||
over the maintenance of imaplib2 for offlineimap.
|
||||
|
||||
For the use of offlineimap I've applied the pending PRs from imaplib2. I have
|
||||
applied another change sent to offlineimap (see OfflineIMAP/offlineimap#623).
|
||||
|
||||
However, there are 3 important limitations:
|
||||
|
||||
- I intend to maintain imaplib2 for offlineimap only. Everything will take place
|
||||
in the offlineimap project. I'll neither package imaplib2 nor maintain any
|
||||
"official" repository dedicated to imaplib2. If you want imaplib2 but not
|
||||
offlineimap, you should extract the file `offlineimap/bundled_imaplib2.py` from
|
||||
the offlineimap repository. Please, send your patches for imaplib2.py to the
|
||||
offlineimap project directly.
|
||||
|
||||
- Starting from imaplib2 v2.100 (tagged: imaplib2-v2.100) I'm taking the patches
|
||||
in the lazy mode. This means that I won't make deep checks/tests of the
|
||||
changes. Hence, the quality and the stability might become a bit more
|
||||
fluctuating. For more stability, you might like to only consider the imaplib2
|
||||
versions released with the stable versions of offlineimap. Don't expect
|
||||
changelogs dedicated to imaplib2. They will be part of the offlineimap
|
||||
changelogs.
|
||||
|
||||
- All of this only applies to the py2 version of imaplib2. Sadly, offlineimap
|
||||
has few chances to be ported on py3 so I don't aim to maintain the py3 version
|
||||
of imaplib2.
|
||||
|
||||
|
||||
In this release, offlineimap is learning Happy Eyeballs.
|
||||
|
||||
|
||||
This release was tested by:
|
||||
|
||||
- Nicolas Sebrecht
|
||||
|
||||
|
||||
#### Authors
|
||||
|
||||
- Nicolas Sebrecht (4)
|
||||
- Ben Cotterell (1)
|
||||
- Dario Maiocchi (1)
|
||||
- Ilias Tsitsimpis (1)
|
||||
- Julien Cristau (1)
|
||||
- Olivier Mehani (1)
|
||||
|
||||
|
||||
#### Features
|
||||
|
||||
- Implement Happy Eyeballs. [Olivier Mehani]
|
||||
- imaplib2 v2.101. [Nicolas Sebrecht]
|
||||
- imaplib2 v2.100. [Nicolas Sebrecht]
|
||||
|
||||
#### Changes
|
||||
|
||||
- Update readme to give an hint about Linux distros. [Dario Maiocchi]
|
||||
- travis: remove python3.6. [Nicolas Sebrecht]
|
||||
- README: add required dependency to rfc6555. [Nicolas Sebrecht]
|
||||
|
||||
#### imaplib2
|
||||
|
||||
- Do not use TIMEOUT_MAX for Condition.wait(). [Ilias Tsitsimpis]
|
||||
- Use SSLContext if available so we send SNI. [Julien Cristau]
|
||||
- Don't expect trailing space on command completion. [Ben Cotterell]
|
||||
|
||||
|
||||
### OfflineIMAP v7.2.4 (2019-06-08)
|
||||
|
||||
#### Notes
|
||||
|
||||
This release introduces mkdir -p alike folder creation and fixes cygwin support
|
||||
in Windows.
|
||||
|
||||
This release was tested by:
|
||||
|
||||
- Nicolas Sebrecht
|
||||
|
||||
|
||||
#### Authors
|
||||
|
||||
- Nicolas Sebrecht (4)
|
||||
- kimim (2)
|
||||
- Jelmer Vernooij (1)
|
||||
- Kyle Altendorf (1)
|
||||
|
||||
|
||||
#### Features
|
||||
|
||||
- mkdir -p alike folder creation. [Kyle Altendorf]
|
||||
|
||||
#### Fixes
|
||||
|
||||
- Use portable locker to support cygwin in Windows. [kimim]
|
||||
- contrib/release.py: don't break if sphinx-build is missing. [Nicolas Sebrecht]
|
||||
|
||||
#### Changes
|
||||
|
||||
- Update FSF postal address. [Jelmer Vernooij]
|
||||
- repository/IMAP: update copyright header date. [Nicolas Sebrecht]
|
||||
- PULL_REQUEST_TEMPLATE: add space between brackets to enable the edition in the gui. [Nicolas Sebrecht]
|
||||
|
||||
|
||||
### OfflineIMAP v7.2.3 (2019-02-17)
|
||||
|
||||
#### Notes
|
||||
|
|
8
Makefile
8
Makefile
|
@ -24,13 +24,13 @@ RST2HTML=`type rst2html >/dev/null 2>&1 && echo rst2html || echo rst2html.py`
|
|||
all: build
|
||||
|
||||
build:
|
||||
python setup.py build
|
||||
python2 setup.py build
|
||||
@echo
|
||||
@echo "Build process finished, run 'python setup.py install' to install" \
|
||||
"or 'python setup.py --help' for more information".
|
||||
@echo "Build process finished, run 'python2 setup.py install' to install" \
|
||||
"or 'python2 setup.py --help' for more information".
|
||||
|
||||
clean:
|
||||
-python setup.py clean --all
|
||||
-python2 setup.py clean --all
|
||||
-rm -f bin/offlineimapc 2>/dev/null
|
||||
-find . -name '*.pyc' -exec rm -f {} \;
|
||||
-find . -name '*.pygc' -exec rm -f {} \;
|
||||
|
|
78
README.md
78
README.md
|
@ -1,12 +1,8 @@
|
|||
Upstream status (`master` branch):
|
||||
[![OfflineIMAP build status on Travis-CI.org](https://travis-ci.org/OfflineIMAP/offlineimap.svg?branch=master)](https://travis-ci.org/OfflineIMAP/offlineimap)
|
||||
[![OfflineIMAP code coverage on Codecov.io](https://codecov.io/gh/OfflineIMAP/offlineimap/branch/master/graph/badge.svg)](https://codecov.io/gh/OfflineIMAP/offlineimap)
|
||||
[![Gitter chat](https://badges.gitter.im/OfflineIMAP/offlineimap.png)](https://gitter.im/OfflineIMAP/offlineimap)
|
||||
|
||||
Upstream status (`next` branch):
|
||||
[![OfflineIMAP build status on Travis-CI.org](https://travis-ci.org/OfflineIMAP/offlineimap.svg?branch=next)](https://travis-ci.org/OfflineIMAP/offlineimap)
|
||||
Financial contributors: [![Financial Contributors on Open Collective](https://opencollective.com/offlineimap-organization/all/badge.svg?label=financial+contributors)](https://opencollective.com/offlineimap-organization)
|
||||
|
||||
[offlineimap]: http://github.com/OfflineIMAP/offlineimap
|
||||
[offlineimap3]: http://github.com/OfflineIMAP/offlineimap3
|
||||
[website]: http://www.offlineimap.org
|
||||
[wiki]: http://github.com/OfflineIMAP/offlineimap/wiki
|
||||
[blog]: http://www.offlineimap.org/posts.html
|
||||
|
@ -21,7 +17,14 @@ Links:
|
|||
|
||||
***"Get the emails where you need them."***
|
||||
|
||||
[Official offlineimap][offlineimap].
|
||||
> IMPORTANT NOTE: This repository is for python2 only. The support for offlineimap3
|
||||
> is happening in [Official offlineimap for python3][offlineimap3].
|
||||
>
|
||||
> I'll still lazily maintain this legacy offlineimap but users should definitely go with
|
||||
> offlineimap3.
|
||||
|
||||
- [Official offlineimap for python3][offlineimap3].
|
||||
- [Official offlineimap for python2][offlineimap].
|
||||
|
||||
|
||||
## Description
|
||||
|
@ -43,24 +46,41 @@ message without internet connection? No problem, the message is still there.
|
|||
|
||||
## Project status and future
|
||||
|
||||
> As one of the maintainer of OfflineIMAP, I'd like to put my efforts into
|
||||
> [imapfw](http://github.com/OfflineIMAP/imapfw). **imapfw** is software in
|
||||
> development that I intend to replace OfflineIMAP with in the long term.
|
||||
>
|
||||
> That's why I'm not going to continue OfflineIMAP development. I'll continue
|
||||
> to maintain OfflineIMAP (fixing small bugs, reviewing patches and merging,
|
||||
> and rolling out new releases), but that's all.
|
||||
>
|
||||
> While I keep tracking issues for OfflineIMAP, you should not expect future support.
|
||||
>
|
||||
> You won't be left at the side. OfflineIMAP's community is large enough so that
|
||||
> you'll find people for most of your issues.
|
||||
>
|
||||
> Get news from the [blog][blog].
|
||||
>
|
||||
> Nicolas Sebrecht. ,-)
|
||||
The [offlineimap][offlineimap] project was forked to
|
||||
[offlineimap3][offlineimap3] to support python3. Contributions are welcome to
|
||||
this project.
|
||||
|
||||
|
||||
## Contributors
|
||||
|
||||
### Code Contributors
|
||||
|
||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||
<a href="https://github.com/OfflineIMAP/offlineimap/graphs/contributors"><img src="https://opencollective.com/offlineimap-organization/contributors.svg?width=890&button=false" /></a>
|
||||
|
||||
### Financial Contributors
|
||||
|
||||
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/offlineimap-organization/contribute)]
|
||||
|
||||
#### Individuals
|
||||
|
||||
<a href="https://opencollective.com/offlineimap-organization"><img src="https://opencollective.com/offlineimap-organization/individuals.svg?width=890"></a>
|
||||
|
||||
#### Organizations
|
||||
|
||||
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/offlineimap-organization/contribute)]
|
||||
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/0/website"><img src="https://opencollective.com/offlineimap-organization/organization/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/1/website"><img src="https://opencollective.com/offlineimap-organization/organization/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/2/website"><img src="https://opencollective.com/offlineimap-organization/organization/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/3/website"><img src="https://opencollective.com/offlineimap-organization/organization/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/4/website"><img src="https://opencollective.com/offlineimap-organization/organization/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/5/website"><img src="https://opencollective.com/offlineimap-organization/organization/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/6/website"><img src="https://opencollective.com/offlineimap-organization/organization/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/7/website"><img src="https://opencollective.com/offlineimap-organization/organization/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/8/website"><img src="https://opencollective.com/offlineimap-organization/organization/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/offlineimap-organization/organization/9/website"><img src="https://opencollective.com/offlineimap-organization/organization/9/avatar.svg"></a>
|
||||
|
||||
## License
|
||||
|
||||
GNU General Public License v2.
|
||||
|
@ -71,6 +91,11 @@ GNU General Public License v2.
|
|||
You should first check if your distribution already packages OfflineIMAP for you.
|
||||
Downloads releases as [tarball or zipball](https://github.com/OfflineIMAP/offlineimap/tags).
|
||||
|
||||
If you are running Linux Os, you can install offlineimap with:
|
||||
|
||||
- openSUSE `zypper in offlineimap`
|
||||
- Arch Linux `pacman -S offlineimap`
|
||||
- fedora `dnf install offlineimap`
|
||||
|
||||
## Feedbacks and contributions
|
||||
|
||||
|
@ -100,12 +125,15 @@ Bugs, issues and contributions can be requested to both the mailing list or the
|
|||
|
||||
## Requirements & dependencies
|
||||
|
||||
* Python v2.7+
|
||||
* Python v3.4+ ***[STALLED] (experimental: [see known issues](https://github.com/OfflineIMAP/offlineimap/issues?q=is%3Aissue+is%3Aopen+label%3APy3))***
|
||||
* Python v2.7.x
|
||||
* six (required)
|
||||
* rfc6555 (required)
|
||||
* imaplib2 >= 2.57 (optional)
|
||||
* gssapi (optional), for Kerberos authentication
|
||||
* portalocker (optional), if you need to run offlineimap in Cygwin for Windows
|
||||
|
||||
* Python v3: See the [offlineimap3][offlineimap3] fork of
|
||||
[offlineimap][offlineimap].
|
||||
|
||||
## Documentation
|
||||
|
||||
|
|
|
@ -204,9 +204,8 @@ class OfflineimapInfo(object):
|
|||
cmd = shlex.split("./offlineimap.py --version")
|
||||
return run(cmd).rstrip().decode(FS_ENCODING)
|
||||
|
||||
def editInit(self):
|
||||
return system("{} ./offlineimap/__init__.py".format(EDITOR))
|
||||
|
||||
def editVersion(self):
|
||||
return system("{} ./offlineimap/version.py".format(EDITOR))
|
||||
|
||||
|
||||
class User(object):
|
||||
|
@ -272,7 +271,7 @@ class Testers(object):
|
|||
def _read(self):
|
||||
self.testers = []
|
||||
with open(TESTERS_FILE, 'r') as fd:
|
||||
testers = yaml.load(fd)
|
||||
testers = yaml.safe_load(fd)
|
||||
for tester in testers:
|
||||
name = tester['name']
|
||||
email = tester['email']
|
||||
|
|
|
@ -77,7 +77,7 @@ Announce template stands in '{announce}'.
|
|||
Command samples to do manually:
|
||||
|
||||
- git push <remote> master next {new_version}
|
||||
- python setup.py sdist && twine upload dist/* && rm -rf dist MANIFEST
|
||||
- python2 setup.py sdist && twine upload dist/* && rm -rf dist MANIFEST
|
||||
- cd website
|
||||
- git checkout master
|
||||
- git merge {website_branch}
|
||||
|
@ -274,7 +274,10 @@ class Website(object):
|
|||
if User.yesNo(req, defaultToYes=True) is False:
|
||||
return False
|
||||
|
||||
if check_call(shlex.split("{} --version".format(SPHINXBUILD))) != 0:
|
||||
try:
|
||||
if check_call(shlex.split("{} --version".format(SPHINXBUILD))) != 0:
|
||||
raise RuntimeError("{} not found".format(SPHINXBUILD))
|
||||
except:
|
||||
print("""
|
||||
Oops! you don't have {} installed?"
|
||||
Cannot update the webite documentation..."
|
||||
|
@ -354,7 +357,7 @@ class Release(object):
|
|||
User.request("going to make a new release after {}".format(currentVersion))
|
||||
|
||||
def updateVersion(self):
|
||||
self.offlineimapInfo.editInit()
|
||||
self.offlineimapInfo.editVersion()
|
||||
|
||||
def checkVersions(self, current, new):
|
||||
if new == current:
|
||||
|
@ -402,7 +405,7 @@ class Release(object):
|
|||
announce.close()
|
||||
|
||||
def make(self):
|
||||
Git.add('offlineimap/__init__.py')
|
||||
Git.add('offlineimap/version.py')
|
||||
Git.add('Changelog.md')
|
||||
commitMsg = "v{}\n".format(newVersion)
|
||||
for tester in self.testers.getListOk():
|
||||
|
|
|
@ -7,7 +7,7 @@ HTML_TARGETS = $(patsubst %.rst,%.html,$(SOURCES))
|
|||
RM = rm
|
||||
RST2HTML=`type rst2html >/dev/null 2>&1 && echo rst2html || echo rst2html.py`
|
||||
RST2MAN=`type rst2man >/dev/null 2>&1 && echo rst2man || echo rst2man.py`
|
||||
SPHINXBUILD = sphinx-build
|
||||
SPHINXBUILD = python2 -msphinx
|
||||
|
||||
docs: man api
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
|
|
@ -1,18 +1,17 @@
|
|||
__all__ = ['OfflineImap']
|
||||
|
||||
__productname__ = 'OfflineIMAP'
|
||||
# Expecting trailing "-rcN" or "" for stable releases.
|
||||
__version__ = "7.2.3"
|
||||
__copyright__ = "Copyright 2002-2019 John Goerzen & contributors"
|
||||
__author__ = "John Goerzen"
|
||||
__author_email__= "offlineimap-project@lists.alioth.debian.org"
|
||||
__description__ = "Disconnected Universal IMAP Mail Synchronization/Reader Support"
|
||||
__license__ = "Licensed under the GNU GPL v2 or any later version (with an OpenSSL exception)"
|
||||
__bigcopyright__ = """%(__productname__)s %(__version__)s
|
||||
%(__license__)s""" % locals()
|
||||
__homepage__ = "http://www.offlineimap.org"
|
||||
|
||||
banner = __bigcopyright__
|
||||
from offlineimap.version import (
|
||||
__productname__,
|
||||
__version__,
|
||||
__copyright__,
|
||||
__author__,
|
||||
__author_email__,
|
||||
__description__,
|
||||
__license__,
|
||||
__bigcopyright__,
|
||||
__homepage__,
|
||||
banner
|
||||
)
|
||||
|
||||
from offlineimap.error import OfflineImapError
|
||||
# put this last, so we don't run into circular dependencies using
|
||||
|
|
|
@ -34,9 +34,12 @@ SYNC_MUTEXES = {}
|
|||
SYNC_MUTEXES_LOCK = Lock()
|
||||
|
||||
try:
|
||||
import fcntl
|
||||
import portalocker
|
||||
except:
|
||||
pass # Ok if this fails, we can do without.
|
||||
try:
|
||||
import fcntl
|
||||
except:
|
||||
pass # Ok if this fails, we can do without.
|
||||
|
||||
# FIXME: spaghetti code alert!
|
||||
def getaccountlist(customconfig):
|
||||
|
@ -232,10 +235,13 @@ class SyncableAccount(Account):
|
|||
|
||||
self._lockfd = open(self._lockfilepath, 'w')
|
||||
try:
|
||||
fcntl.lockf(self._lockfd, fcntl.LOCK_EX|fcntl.LOCK_NB)
|
||||
portalocker.lock(self._lockfd, portalocker.LOCK_EX)
|
||||
except NameError:
|
||||
#fcntl not available (Windows), disable file locking... :(
|
||||
pass
|
||||
# portalocker not available for Windows.
|
||||
try:
|
||||
fcntl.lockf(self._lockfd, fcntl.LOCK_EX|fcntl.LOCK_NB)
|
||||
except NameError:
|
||||
pass # fnctl not available, disable file locking... :(
|
||||
except IOError:
|
||||
self._lockfd.close()
|
||||
six.reraise(OfflineImapError,
|
||||
|
@ -250,6 +256,10 @@ class SyncableAccount(Account):
|
|||
|
||||
#If we own the lock file, delete it
|
||||
if self._lockfd and not self._lockfd.closed:
|
||||
try:
|
||||
portalocker.unlock(self._lockfd)
|
||||
except NameError:
|
||||
pass
|
||||
self._lockfd.close()
|
||||
try:
|
||||
os.unlink(self._lockfilepath)
|
||||
|
@ -323,8 +333,11 @@ class SyncableAccount(Account):
|
|||
|
||||
folderthreads = []
|
||||
|
||||
hook = self.getconf('presynchook', '')
|
||||
self.callhook(hook)
|
||||
hook_env = {
|
||||
'OIMAP_ACCOUNT_NAME': self.getname(),
|
||||
}
|
||||
|
||||
self.callhook('presynchook', hook_env)
|
||||
|
||||
if self.utf_8_support and self.remoterepos.getdecodefoldernames():
|
||||
raise OfflineImapError("Configuration mismatch in account " +
|
||||
|
@ -428,20 +441,23 @@ class SyncableAccount(Account):
|
|||
localrepos.holdordropconnections()
|
||||
remoterepos.holdordropconnections()
|
||||
|
||||
hook = self.getconf('postsynchook', '')
|
||||
self.callhook(hook)
|
||||
self.callhook('postsynchook', hook_env)
|
||||
|
||||
def callhook(self, cmd):
|
||||
def callhook(self, name, env={}):
|
||||
# Check for CTRL-C or SIGTERM and run postsynchook.
|
||||
if Account.abort_NOW_signal.is_set():
|
||||
return
|
||||
cmd = self.getconf(name, '')
|
||||
if not cmd:
|
||||
return
|
||||
try:
|
||||
self.ui.callhook("Calling hook: " + cmd)
|
||||
if self.dryrun:
|
||||
return
|
||||
p = Popen(cmd, shell=True,
|
||||
env = env.copy()
|
||||
env.update(os.environ)
|
||||
env['OIMAP_HOOK_NAME'] = name
|
||||
p = Popen(cmd, shell=True, env=env,
|
||||
stdin=PIPE, stdout=PIPE, stderr=PIPE,
|
||||
close_fds=True)
|
||||
r = p.communicate()
|
||||
|
|
|
@ -18,9 +18,9 @@ __all__ = ("IMAP4", "IMAP4_SSL", "IMAP4_stream",
|
|||
"Internaldate2Time", "ParseFlags", "Time2Internaldate",
|
||||
"Mon2num", "MonthNames", "InternalDate")
|
||||
|
||||
__version__ = "2.57"
|
||||
__version__ = "2.101"
|
||||
__release__ = "2"
|
||||
__revision__ = "57"
|
||||
__revision__ = "101"
|
||||
__credits__ = """
|
||||
Authentication code contributed by Donn Cave <donn@u.washington.edu> June 1998.
|
||||
String method conversion by ESR, February 2001.
|
||||
|
@ -53,7 +53,7 @@ Fix for correct Python 3 exception handling by Tobias Brink <tobias.brink@gmail.
|
|||
Fix to allow interruptible IDLE command by Tim Peoples <dromedary512@users.sf.net> September 2015.
|
||||
Add support for TLS levels by Ben Boeckel <mathstuf@gmail.com> September 2015.
|
||||
Fix for shutown exception by Sebastien Gross <seb@chezwam.org> November 2015."""
|
||||
__author__ = "Piers Lauder <piers@janeelix.com>"
|
||||
__author__ = "Piers Lauder <piers@janeelix.com> & offlineimap team"
|
||||
__URL__ = "http://imaplib2.sourceforge.net"
|
||||
__license__ = "Python License"
|
||||
|
||||
|
@ -67,7 +67,6 @@ if bytes != str:
|
|||
else:
|
||||
import Queue as queue
|
||||
string_types = basestring
|
||||
threading.TIMEOUT_MAX = 9223372036854.0
|
||||
|
||||
select_module = select
|
||||
|
||||
|
@ -192,7 +191,7 @@ class Request(object):
|
|||
def get_response(self, exc_fmt=None):
|
||||
self.callback = None
|
||||
if __debug__: self.parent._log(3, '%s:%s.ready.wait' % (self.name, self.tag))
|
||||
self.ready.wait(threading.TIMEOUT_MAX)
|
||||
self.ready.wait()
|
||||
|
||||
if self.aborted is not None:
|
||||
typ, val = self.aborted
|
||||
|
@ -342,7 +341,7 @@ class IMAP4(object):
|
|||
self.tagpre = Int2AP(random.randint(4096, 65535))
|
||||
self.tagre = re.compile(r'(?P<tag>'
|
||||
+ self.tagpre
|
||||
+ r'\d+) (?P<type>[A-Z]+) (?P<data>.*)')
|
||||
+ r'\d+) (?P<type>[A-Z]+) ?(?P<data>.*)')
|
||||
|
||||
self._mode_ascii() # Only option in py2
|
||||
|
||||
|
@ -545,7 +544,16 @@ class IMAP4(object):
|
|||
|
||||
ssl_version = TLS_MAP[self.tls_level][self.ssl_version]
|
||||
|
||||
self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile, ca_certs=self.ca_certs, cert_reqs=cert_reqs, ssl_version=ssl_version)
|
||||
if getattr(ssl, 'HAS_SNI', False):
|
||||
ctx = ssl.SSLContext(ssl_version)
|
||||
ctx.verify_mode = cert_reqs
|
||||
if self.ca_certs is not None:
|
||||
ctx.load_verify_locations(self.ca_certs)
|
||||
if self.certfile or self.keyfile:
|
||||
ctx.load_cert_chain(self.certfile, self.keyfile)
|
||||
self.sock = ctx.wrap_socket(self.sock, server_hostname=self.host)
|
||||
else:
|
||||
self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile, ca_certs=self.ca_certs, cert_reqs=cert_reqs, ssl_version=ssl_version)
|
||||
ssl_exc = ssl.SSLError
|
||||
self.read_fd = self.sock.fileno()
|
||||
except ImportError:
|
||||
|
@ -1391,7 +1399,7 @@ class IMAP4(object):
|
|||
self.commands_lock.release()
|
||||
if need_event:
|
||||
if __debug__: self._log(3, 'sync command %s waiting for empty commands Q' % name)
|
||||
self.state_change_free.wait(threading.TIMEOUT_MAX)
|
||||
self.state_change_free.wait()
|
||||
if __debug__: self._log(3, 'sync command %s proceeding' % name)
|
||||
|
||||
if self.state not in Commands[name][CMD_VAL_STATES]:
|
||||
|
|
|
@ -402,6 +402,7 @@ class IMAPFolder(BaseFolder):
|
|||
return 0
|
||||
|
||||
matchinguids = matchinguids.split(' ')
|
||||
matchinguids = list(set(matchinguids)) # Remove duplicates.
|
||||
self.ui.debug('imap', '__savemessage_searchforheader: matchinguids now '
|
||||
+ repr(matchinguids))
|
||||
if len(matchinguids) != 1 or matchinguids[0] is None:
|
||||
|
|
|
@ -19,6 +19,7 @@ import fcntl
|
|||
import time
|
||||
import subprocess
|
||||
import threading
|
||||
import rfc6555
|
||||
import socket
|
||||
import errno
|
||||
import zlib
|
||||
|
@ -78,8 +79,15 @@ class UsefulIMAPMixIn(object):
|
|||
def open_socket(self):
|
||||
"""open_socket()
|
||||
Open socket choosing first address family available."""
|
||||
if self.af == socket.AF_UNSPEC:
|
||||
# happy-eyeballs!
|
||||
return rfc6555.create_connection((self.host, self.port))
|
||||
else:
|
||||
return self._open_socket_for_af(self.af)
|
||||
|
||||
def _open_socket_for_af(self, af):
|
||||
msg = (-1, 'could not open socket')
|
||||
for res in socket.getaddrinfo(self.host, self.port, self.af, socket.SOCK_STREAM):
|
||||
for res in socket.getaddrinfo(self.host, self.port, af, socket.SOCK_STREAM):
|
||||
af, socktype, proto, canonname, sa = res
|
||||
try:
|
||||
# use socket of our own, possiblly socksified socket.
|
||||
|
@ -124,7 +132,7 @@ class IMAP4_Tunnel(UsefulIMAPMixIn, IMAP4):
|
|||
"""The tunnelcmd comes in on host!"""
|
||||
|
||||
self.host = host
|
||||
self.process = subprocess.Popen(host, shell=True, close_fds=True,
|
||||
self.process = subprocess.Popen('exec %s'%host, shell=True, close_fds=True,
|
||||
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
(self.outfd, self.infd) = (self.process.stdin, self.process.stdout)
|
||||
# imaplib2 polls on this fd
|
||||
|
|
|
@ -102,7 +102,7 @@ class IMAPServer(object):
|
|||
self.starttls = repos.getstarttls()
|
||||
|
||||
if self.usessl \
|
||||
and self.tlslevel is not "tls_compat" \
|
||||
and self.tlslevel != "tls_compat" \
|
||||
and self.sslversion is None:
|
||||
raise Exception("When 'tls_level' is not 'tls_compat' "
|
||||
"the 'ssl_version' must be set explicitly.")
|
||||
|
@ -356,16 +356,13 @@ class IMAPServer(object):
|
|||
return False
|
||||
|
||||
self.connectionlock.acquire()
|
||||
self.gssapi = False
|
||||
try:
|
||||
imapobj.authenticate('GSSAPI', self.__gsshandler)
|
||||
return True
|
||||
except imapobj.error as e:
|
||||
self.gssapi = False
|
||||
raise
|
||||
else:
|
||||
self.gssapi = True
|
||||
self.gss_vc = None
|
||||
return True
|
||||
finally:
|
||||
self.gss_vc = None
|
||||
self.connectionlock.release()
|
||||
|
||||
def __authn_cram_md5(self, imapobj):
|
||||
|
@ -826,11 +823,12 @@ class IdleThread(object):
|
|||
statusrepos = account.statusrepos
|
||||
remotefolder = remoterepos.getfolder(self.folder, decode=False)
|
||||
|
||||
hook = account.getconf('presynchook', '')
|
||||
account.callhook(hook)
|
||||
hook_env = {
|
||||
'OIMAP_ACCOUNT_NAME': account.getname(),
|
||||
}
|
||||
account.callhook('presynchook', hook_env)
|
||||
offlineimap.accounts.syncfolder(account, remotefolder, quick=False)
|
||||
hook = account.getconf('postsynchook', '')
|
||||
account.callhook(hook)
|
||||
account.callhook('postsynchook', hook_env)
|
||||
|
||||
ui = getglobalui()
|
||||
ui.unregisterthread(currentThread()) #syncfolder registered the thread
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
""" IMAP repository support """
|
||||
|
||||
# Copyright (C) 2002-2017 John Goerzen & contributors
|
||||
# Copyright (C) 2002-2019 John Goerzen & contributors
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -545,13 +545,27 @@ class IMAPRepository(BaseRepository):
|
|||
|
||||
:param foldername: Full path of the folder to be created."""
|
||||
|
||||
if foldername is '':
|
||||
if foldername == '':
|
||||
return
|
||||
|
||||
if self.getreference():
|
||||
foldername = self.getreference() + self.getsep() + foldername
|
||||
if not foldername: # Create top level folder as folder separator.
|
||||
foldername = self.getsep()
|
||||
self.makefolder_single(foldername)
|
||||
return
|
||||
|
||||
parts = foldername.split(self.getsep())
|
||||
folder_paths = [self.getsep().join(parts[:n + 1]) for n in range(len(parts))]
|
||||
for folder_path in folder_paths:
|
||||
try:
|
||||
self.makefolder_single(folder_path)
|
||||
except OfflineImapError as e:
|
||||
reasonLower = e.reason.lower() # Handle reasons '[ALREADYEXISTS]' and 'Mailbox already exists!' @chris001
|
||||
if not ('already' in reasonLower and 'exists' in reasonLower):
|
||||
raise
|
||||
|
||||
def makefolder_single(self, foldername):
|
||||
self.ui.makefolder(self, foldername)
|
||||
if self.account.dryrun:
|
||||
return
|
||||
|
|
|
@ -15,13 +15,12 @@
|
|||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
from threading import Lock, Thread, BoundedSemaphore, currentThread
|
||||
from threading import Lock, Thread, BoundedSemaphore
|
||||
try:
|
||||
from Queue import Queue, Empty
|
||||
except ImportError: # python3
|
||||
from queue import Queue, Empty
|
||||
import traceback
|
||||
import os.path
|
||||
from offlineimap.ui import getglobalui
|
||||
|
||||
|
||||
|
|
|
@ -96,8 +96,13 @@ class UIBase(object):
|
|||
def setup_sysloghandler(self):
|
||||
"""Backend specific syslog handler."""
|
||||
|
||||
if sys.platform == 'darwin':
|
||||
address = '/var/run/syslog'
|
||||
else:
|
||||
address = '/dev/log'
|
||||
|
||||
# create syslog handler
|
||||
ch = logging.handlers.SysLogHandler('/dev/log')
|
||||
ch = logging.handlers.SysLogHandler(address)
|
||||
# create formatter and add it to the handlers
|
||||
self.formatter = logging.Formatter("%(message)s")
|
||||
ch.setFormatter(self.formatter)
|
||||
|
|
|
@ -24,7 +24,7 @@ UI_LIST = {'ttyui': TTY.TTYUI,
|
|||
'syslog': Noninteractive.Syslog,
|
||||
'machineui': Machine.MachineUI}
|
||||
|
||||
#add Blinkenlights UI if it imports correctly (curses installed)
|
||||
# add Blinkenlights UI if it imports correctly (curses installed)
|
||||
try:
|
||||
from offlineimap.ui import Curses
|
||||
UI_LIST['blinkenlights'] = Curses.Blinkenlights
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
__productname__ = 'OfflineIMAP'
|
||||
# Expecting trailing "-rcN" or "" for stable releases.
|
||||
__version__ = "7.3.4"
|
||||
__copyright__ = "Copyright 2002-2021 John Goerzen & contributors"
|
||||
__author__ = "John Goerzen"
|
||||
__author_email__= "offlineimap-project@lists.alioth.debian.org"
|
||||
__description__ = "Disconnected Universal IMAP Mail Synchronization/Reader Support"
|
||||
__license__ = "Licensed under the GNU GPL v2 or any later version (with an OpenSSL exception)"
|
||||
__bigcopyright__ = """%(__productname__)s %(__version__)s
|
||||
%(__license__)s""" % locals()
|
||||
__homepage__ = "http://www.offlineimap.org"
|
||||
|
||||
banner = __bigcopyright__
|
|
@ -1,3 +1,5 @@
|
|||
# Requirements
|
||||
six
|
||||
# Minimal requirements defined in setup.py
|
||||
-e .
|
||||
# Extra "optional" requirements
|
||||
gssapi[kerberos]
|
||||
portalocker[cygwin]
|
||||
|
|
38
setup.py
38
setup.py
|
@ -5,7 +5,7 @@
|
|||
# IMAP synchronization
|
||||
# Module: installer
|
||||
# COPYRIGHT #
|
||||
# Copyright (C) 2002 - 2018 John Goerzen & contributors
|
||||
# Copyright (C) 2002 - 2020 John Goerzen & contributors
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -19,13 +19,17 @@
|
|||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
import os
|
||||
from distutils.core import setup, Command
|
||||
import offlineimap
|
||||
import logging
|
||||
from test.OLItest import TextTestRunner, TestLoader, OLITestLib
|
||||
|
||||
from os import path
|
||||
here = path.abspath(path.dirname(__file__))
|
||||
|
||||
# load __version__, __doc__, __author_, ...
|
||||
exec(open(path.join(here, 'offlineimap', 'version.py')).read())
|
||||
|
||||
class TestCommand(Command):
|
||||
"""runs the OLI testsuite"""
|
||||
|
@ -42,6 +46,11 @@ class TestCommand(Command):
|
|||
pass
|
||||
|
||||
def run(self):
|
||||
# Import the test classes here instead of at the begin of the module
|
||||
# to avoid an implicit dependency of the 'offlineimap' module
|
||||
# in the setup.py (which may run *before* offlineimap is installed)
|
||||
from test.OLItest import TextTestRunner, TestLoader, OLITestLib
|
||||
|
||||
logging.basicConfig(format='%(message)s')
|
||||
# set credentials and OfflineImap command to be executed:
|
||||
OLITestLib(cred_file='./test/credentials.conf', cmd='./offlineimap.py')
|
||||
|
@ -49,20 +58,25 @@ class TestCommand(Command):
|
|||
#TODO: failfast does not seem to exist in python2.6?
|
||||
TextTestRunner(verbosity=2,failfast=True).run(suite)
|
||||
|
||||
reqs = [
|
||||
'six',
|
||||
'rfc6555'
|
||||
]
|
||||
|
||||
setup(name = "offlineimap",
|
||||
version = offlineimap.__version__,
|
||||
description = offlineimap.__description__,
|
||||
long_description = offlineimap.__description__,
|
||||
author = offlineimap.__author__,
|
||||
author_email = offlineimap.__author_email__,
|
||||
url = offlineimap.__homepage__,
|
||||
version = __version__,
|
||||
description = __description__,
|
||||
long_description = __description__,
|
||||
author = __author__,
|
||||
author_email = __author_email__,
|
||||
url = __homepage__,
|
||||
packages = ['offlineimap', 'offlineimap.folder',
|
||||
'offlineimap.repository', 'offlineimap.ui',
|
||||
'offlineimap.utils'],
|
||||
scripts = ['bin/offlineimap'],
|
||||
license = offlineimap.__copyright__ + \
|
||||
license = __copyright__ + \
|
||||
", Licensed under the GPL version 2",
|
||||
cmdclass = { 'test': TestCommand}
|
||||
cmdclass = { 'test': TestCommand},
|
||||
install_requires = reqs
|
||||
)
|
||||
|
||||
|
|
Loading…
Reference in New Issue