Fixed bugs where archivemail would refuse to work on python version less than

2.2.
This commit is contained in:
Paul Rodger 2002-04-26 03:04:02 +00:00
parent f1f2b97b1b
commit 9736dff04d
7 changed files with 81 additions and 41 deletions

View File

@ -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'.

View File

@ -1,5 +1,5 @@
VERSION=0.4.2
VERSION=0.4.3
VERSION_TAG=v$(subst .,_,$(VERSION))
TARFILE=archivemail-$(VERSION).tar.gz

61
README
View File

@ -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
View File

@ -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.

View File

@ -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

View File

@ -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",

View File

@ -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():