mirror of
https://git.code.sf.net/p/archivemail/code
synced 2025-01-02 21:24:40 +00:00
Fixed bugs where archivemail would refuse to work on python version less than
2.2.
This commit is contained in:
parent
f1f2b97b1b
commit
9736dff04d
7 changed files with 81 additions and 41 deletions
|
@ -1,4 +1,11 @@
|
|||
|
||||
Version 0.4.3 - 26 April 2002
|
||||
* Fixed a couple of bugs where I was using python version 2.2 syntax that
|
||||
was giving errors in python v2.0 and v2.1.
|
||||
* Changed the python requirements for the test script from python version
|
||||
2.0 to version 2.1. This is because the unittest module is only available
|
||||
in version 2.1 and above.
|
||||
|
||||
Version 0.4.2 - 24 April 2002
|
||||
* Added the ability to archive messages older than a given absolute date
|
||||
with the new option '--date'.
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,5 +1,5 @@
|
|||
|
||||
VERSION=0.4.2
|
||||
VERSION=0.4.3
|
||||
VERSION_TAG=v$(subst .,_,$(VERSION))
|
||||
TARFILE=archivemail-$(VERSION).tar.gz
|
||||
|
||||
|
|
61
README
61
README
|
@ -3,13 +3,7 @@
|
|||
archivemail - archive and compress old mail in your mailbox
|
||||
-----------------------------------------------------------
|
||||
|
||||
INSTALLATION:
|
||||
|
||||
To install archivemail, run:
|
||||
python setup.py install
|
||||
|
||||
|
||||
USE:
|
||||
OVERVIEW:
|
||||
|
||||
archivemail is a tool written in python(1) for archiving and compressing old
|
||||
email in mailboxes.
|
||||
|
@ -25,19 +19,54 @@ just the most recent messages.
|
|||
|
||||
'archivemail' can save a lot of disk space and will significantly reduce
|
||||
overhead on your mail reader. The number of days before mail is considered
|
||||
'old' is up to you, but the default is 180 days.
|
||||
'old' is up to you, but the default is 180 days. You can also archive messages
|
||||
by an absolute date or only archive unread messages.
|
||||
|
||||
|
||||
REQUIREMENTS:
|
||||
|
||||
archivemail requires python version 2.0 or later, with the optional 'zlib'
|
||||
module, although the zlib module comes with most python installations. If you
|
||||
are compiling your own version of python < version 2.2, make sure you
|
||||
uncomment the 'zlib' moduile in Modules/Setup in the python source directory.
|
||||
|
||||
You can check to see if you version of python has the 'zlib' module by
|
||||
trying this:
|
||||
|
||||
flare:~$ python
|
||||
Python 2.1 (#1, Apr 26 2002, 11:22:45)
|
||||
[GCC 2.95.2 20000220 (Debian GNU/Linux)] on linux2
|
||||
Type "copyright", "credits" or "license" for more information.
|
||||
>>> import zlib
|
||||
>>>
|
||||
|
||||
If you get an ImportError, then the zlib python module has not been installed.
|
||||
Try upgrading your python distribution.
|
||||
|
||||
Python is available from http://www.python.org/
|
||||
|
||||
If you want to run the bundled test script, you will need python version 2.1
|
||||
or later, because we use the PyUnit 'unittest' module. Sorry.
|
||||
|
||||
|
||||
INSTALLATION:
|
||||
|
||||
To install archivemail, run:
|
||||
python setup.py install
|
||||
|
||||
|
||||
USE:
|
||||
|
||||
For more detailed information, look at the archivemail man page.
|
||||
|
||||
'archivemail' currently works on mbox, maildir and MH format mailboxes
|
||||
and requires python v2.0 or greater. It also supports deleting old mail
|
||||
instead of archiving it with the '--delete' option.
|
||||
|
||||
The best way to run archivemail is from cron. Giving the '-q' option to
|
||||
archivemail will make it quiet, only printing messages if something went
|
||||
wrong. Check out the 'examples' directory for an example shell script to
|
||||
be run from cron.
|
||||
The best way to run archivemail is from cron, giving the '-q' option to
|
||||
archivemail to make it quiet, only printing messages if something went wrong.
|
||||
Check out the 'examples' directory for an example shell script to be run from
|
||||
cron.
|
||||
|
||||
The archivemail website is at: http://archivemail.sourceforge.net/
|
||||
|
||||
If you have any feedback or bug reports about archivemail, you are very
|
||||
welcome to email me.
|
||||
|
||||
-- Paul Rodger <paul@paulrodger.com>
|
||||
|
|
2
TODO
2
TODO
|
@ -1,5 +1,5 @@
|
|||
|
||||
Goals for next minor release (0.4.3):
|
||||
Goals for next minor release (0.4.4):
|
||||
-------------------------------------
|
||||
* Think about the best way to specify the names of archives created with
|
||||
possibly an --archive-name option.
|
||||
|
|
|
@ -22,18 +22,18 @@ Website: http://archivemail.sourceforge.net/
|
|||
"""
|
||||
|
||||
# global administrivia
|
||||
__version__ = "archivemail v0.4.2"
|
||||
__version__ = "archivemail v0.4.3"
|
||||
__cvs_id__ = "$Id$"
|
||||
__copyright__ = """Copyright (C) 2002 Paul Rodger <paul@paulrodger.com>
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."""
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
def check_python_version():
|
||||
"""Abort if we are running on python < v2.0"""
|
||||
too_old_error = "This program requires python v2.0 or greater."
|
||||
too_old_error = """This program requires python v2.0 or greater.
|
||||
Your version of python is: %s""" % sys.version
|
||||
try:
|
||||
version = sys.version_info # we might not even have this function! :)
|
||||
if (version[0] < 2):
|
||||
|
@ -344,12 +344,12 @@ class Mbox(mailbox.UnixMailbox):
|
|||
def exclusive_lock(self):
|
||||
"""Set an advisory lock on the 'mbox' mailbox"""
|
||||
vprint("obtaining exclusive lock on file '%s'" % self.mbox_file_name)
|
||||
fcntl.flock(self.mbox_file, fcntl.LOCK_EX)
|
||||
fcntl.flock(self.mbox_file.fileno(), fcntl.LOCK_EX)
|
||||
|
||||
def exclusive_unlock(self):
|
||||
"""Unset any advisory lock on the 'mbox' mailbox"""
|
||||
vprint("dropping exclusive lock on file '%s'" % self.mbox_file_name)
|
||||
fcntl.flock(self.mbox_file, fcntl.LOCK_UN)
|
||||
fcntl.flock(self.mbox_file.fileno(), fcntl.LOCK_UN)
|
||||
|
||||
def procmail_lock(self):
|
||||
"""Create a procmail lockfile on the 'mbox' mailbox"""
|
||||
|
@ -537,7 +537,7 @@ class IdentityCache:
|
|||
assert(msg)
|
||||
message_id = msg.get('Message-ID')
|
||||
assert(message_id)
|
||||
if message_id in self.seen_ids:
|
||||
if self.seen_ids.has_key(message_id):
|
||||
user_warning("duplicate message id: '%s' in mailbox '%s'" %
|
||||
(message_id, self.mailbox_name))
|
||||
self.seen_ids[message_id] = 1
|
||||
|
|
8
setup.py
8
setup.py
|
@ -1,10 +1,11 @@
|
|||
#!/usr/bin/env python
|
||||
#! /usr/bin/env python
|
||||
|
||||
import sys
|
||||
|
||||
def check_python_version():
|
||||
"""Abort if we are running on python < v2.0"""
|
||||
too_old_error = "This program requires python v2.0 or greater."
|
||||
too_old_error = """This program requires python v2.0 or greater.
|
||||
Your version of python is: %s""" % sys.version
|
||||
try:
|
||||
version = sys.version_info # we might not even have this function! :)
|
||||
if (version[0] < 2):
|
||||
|
@ -18,9 +19,8 @@ check_python_version() # define & run this early - 'distutils.core' is new
|
|||
from distutils.core import setup
|
||||
|
||||
setup(name="archivemail",
|
||||
version="0.4.2",
|
||||
version="0.4.3",
|
||||
description="archive and compress old email",
|
||||
platforms="POSIX",
|
||||
license="GNU GPL",
|
||||
url="http://archivemail.sourceforge.net/",
|
||||
author="Paul Rodger",
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env python
|
||||
#! /usr/bin/env python
|
||||
############################################################################
|
||||
# Copyright (C) 2002 Paul Rodger <paul@paulrodger.com>
|
||||
#
|
||||
|
@ -34,11 +34,15 @@ TODO: add tests for:
|
|||
import sys
|
||||
|
||||
def check_python_version():
|
||||
"""Abort if we are running on python < v2.0"""
|
||||
too_old_error = "This program requires python v2.0 or greater."
|
||||
"""Abort if we are running on python < v2.1"""
|
||||
too_old_error = """This test script requires python version 2.1 or later.
|
||||
This is because it requires the pyUnit 'unittest' module, which only got
|
||||
released in python version 2.1. You should still be able to run archivemail on
|
||||
python versions 2.0 and above, however -- just not test it.
|
||||
Your version of python is: %s""" % sys.version
|
||||
try:
|
||||
version = sys.version_info # we might not even have this function! :)
|
||||
if (version[0] < 2):
|
||||
if (version[0] < 2) or ((version[0] == 2) and (version[1] < 1)):
|
||||
print too_old_error
|
||||
sys.exit(1)
|
||||
except AttributeError:
|
||||
|
@ -157,11 +161,11 @@ class TestMboxExclusiveLock(unittest.TestCase):
|
|||
self.mbox.exclusive_lock()
|
||||
file = open(self.mbox_name, "r+")
|
||||
lock_nb = fcntl.LOCK_EX | fcntl.LOCK_NB
|
||||
self.assertRaises(IOError, fcntl.flock, file, lock_nb)
|
||||
self.assertRaises(IOError, fcntl.flock, file.fileno(), lock_nb)
|
||||
|
||||
self.mbox.exclusive_unlock()
|
||||
fcntl.flock(file, lock_nb)
|
||||
fcntl.flock(file, fcntl.LOCK_UN)
|
||||
fcntl.flock(file.fileno(), lock_nb)
|
||||
fcntl.flock(file.fileno(), fcntl.LOCK_UN)
|
||||
|
||||
def tearDown(self):
|
||||
if os.path.exists(self.mbox_name):
|
||||
|
@ -916,22 +920,22 @@ def make_message(body=None, default_headers={}, hours_old=None):
|
|||
headers = copy.copy(default_headers)
|
||||
if not headers:
|
||||
headers = {}
|
||||
if 'Date' not in headers:
|
||||
if not headers.has_key('Date'):
|
||||
time_message = time.time() - (60 * 60 * hours_old)
|
||||
headers['Date'] = time.asctime(time.localtime(time_message))
|
||||
if 'From' not in headers:
|
||||
if not headers.has_key('From'):
|
||||
headers['From'] = "sender@dummy.domain"
|
||||
if 'To' not in headers:
|
||||
if not headers.has_key('To'):
|
||||
headers['To'] = "receipient@dummy.domain"
|
||||
if 'Subject' not in headers:
|
||||
if not headers.has_key('Subject'):
|
||||
headers['Subject'] = "This is the subject"
|
||||
if 'From_' not in headers:
|
||||
if not headers.has_key('From_'):
|
||||
headers['From_'] = "%s %s" % (headers['From'], headers['Date'])
|
||||
if not body:
|
||||
body = "This is the message body"
|
||||
|
||||
msg = ""
|
||||
if 'From_' in headers:
|
||||
if headers.has_key('From_'):
|
||||
msg = msg + ("From %s\n" % headers['From_'])
|
||||
del headers['From_']
|
||||
for key in headers.keys():
|
||||
|
|
Loading…
Reference in a new issue