aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivemail.13
-rwxr-xr-xarchivemail.py31
-rw-r--r--archivemail.sgml9
-rwxr-xr-xtest_archivemail.py36
4 files changed, 68 insertions, 11 deletions
diff --git a/archivemail.1 b/archivemail.1
index 936dbb4..0fb01df 100644
--- a/archivemail.1
+++ b/archivemail.1
@@ -214,6 +214,9 @@ originating mailbox, which is left unchanged.
This is a complement to the \fB--delete\fR option, and mainly useful for
testing purposes.
.TP
+\fB --all\fR
+Archive all messages, without distinction.
+.TP
\fB --include-flagged\fR
Normally messages that are flagged important are not archived or deleted. If
you specify this option, these messages can be archived or deleted just like
diff --git a/archivemail.py b/archivemail.py
index aab1394..3402e8f 100755
--- a/archivemail.py
+++ b/archivemail.py
@@ -195,6 +195,7 @@ class Options:
debug_imap = 0
warn_duplicates = 0
copy_old_mail = 0
+ archive_all = 0
def parse_args(self, args, usage):
"""Set our runtime options from the command-line arguments.
@@ -214,7 +215,7 @@ class Options:
"filter-append=", "pwfile=", "dont-mangle",
"preserve-unread", "quiet", "size=", "suffix=",
"verbose", "debug-imap=", "version",
- "warn-duplicate", "copy"])
+ "warn-duplicate", "copy", "all"])
except getopt.error, msg:
user_error(msg)
@@ -270,6 +271,8 @@ class Options:
if self.delete_old_mail:
user_error("found conflicting options --copy and --delete")
self.copy_old_mail = 1
+ if o == '--all':
+ self.archive_all = 1
if o in ('-V', '--version'):
print __version__ + "\n\n" + __copyright__
sys.exit(0)
@@ -674,6 +677,7 @@ Options are as follows:
--delete delete rather than archive old mail (use with caution!)
--copy copy rather than archive old mail
--include-flagged messages flagged important can also be archived
+ --all archive all messages
--no-compress do not compress archives with gzip
--warn-duplicate warn about duplicate Message-IDs in the same mailbox
-v, --verbose report lots of extra debugging information
@@ -996,6 +1000,8 @@ def is_smaller(message, size):
def should_archive(message):
"""Return true if we should archive the message, false otherwise"""
+ if options.archive_all:
+ return 1
old = 0
time_message = guess_delivery_time(message)
if options.date_old_max == None:
@@ -1341,8 +1347,6 @@ def _archive_imap(mailbox_name, final_archive_name):
stats = Stats(mailbox_name, final_archive_name)
cache = IdentityCache(mailbox_name)
imap_str = mailbox_name[mailbox_name.find('://') + 3:]
- imap_filter = build_imap_filter()
- vprint("imap filter: '%s'" % imap_filter)
imap_username, imap_password, imap_server, imap_folder = \
parse_imap_url(imap_str)
if not imap_password:
@@ -1412,14 +1416,19 @@ def _archive_imap(mailbox_name, final_archive_name):
# Worst thing should be that we bail out FETCHing a message that has been
# deleted.
- vprint("searching messages matching criteria")
- result, response = imap_srv.search(None, imap_filter)
- if result != 'OK': unexpected_error("imap search failed; server says '%s'" %
- response[0])
- # response is a list with a single item, listing message sequence numbers
- # like ['1 2 3 1016']
- message_list = response[0].split()
- vprint("%d messages are matching filter" % len(message_list))
+ if options.archive_all:
+ message_list = range(1, total_msg_count+1)
+ else:
+ imap_filter = build_imap_filter()
+ vprint("imap filter: '%s'" % imap_filter)
+ vprint("searching messages matching criteria")
+ result, response = imap_srv.search(None, imap_filter)
+ if result != 'OK': unexpected_error("imap search failed; server says '%s'" %
+ response[0])
+ # response is a list with a single item, listing message sequence numbers
+ # like ['1 2 3 1016']
+ message_list = response[0].split()
+ vprint("%d messages are matching filter" % len(message_list))
# First, gather data for the statistics.
if total_msg_count > 0:
diff --git a/archivemail.sgml b/archivemail.sgml
index b1e365d..5b80e94 100644
--- a/archivemail.sgml
+++ b/archivemail.sgml
@@ -310,6 +310,15 @@ testing purposes.
<VarListEntry>
<Term>
+ <Option>--all</Option>
+</Term>
+<ListItem><Para>
+Archive all messages, without distinction.
+</Para></ListItem>
+</VarListEntry>
+
+<VarListEntry>
+<Term>
<Option>--include-flagged</Option>
</Term>
<ListItem><Para>
diff --git a/test_archivemail.py b/test_archivemail.py
index 86b6e78..9cf1986 100755
--- a/test_archivemail.py
+++ b/test_archivemail.py
@@ -722,6 +722,42 @@ class TestArchiveMboxTimestamp(TestCaseInTempdir):
super(TestArchiveMboxTimestamp, self).tearDown()
+class TestArchiveMboxAll(TestCaseInTempdir):
+ def setUp(self):
+ super(TestArchiveMboxAll, self).setUp()
+ archivemail.options.quiet = 1
+ archivemail.options.archive_all = 1
+
+ def testNew(self):
+ """archiving --all messages in a new mailbox"""
+ for execute in ("package", "system"):
+ self.mbox_name = make_mbox(messages=3, hours_old=(24 * 179))
+ self.mbox_mode = os.stat(self.mbox_name)[stat.ST_MODE]
+ self.copy_name = tempfile.mkstemp()[1]
+ shutil.copyfile(self.mbox_name, self.copy_name)
+ if execute == "package":
+ archivemail.archive(self.mbox_name)
+ elif execute == "system":
+ run = "./archivemail.py --all --quiet %s" % self.mbox_name
+ self.assertEqual(os.system(run), 0)
+ else:
+ sys.exit(1)
+ assert(os.path.exists(self.mbox_name))
+ self.assertEqual(os.path.getsize(self.mbox_name), 0)
+ new_mode = os.stat(self.mbox_name)[stat.ST_MODE]
+ self.assertEqual(self.mbox_mode, new_mode)
+ archive_name = self.mbox_name + "_archive.gz"
+ assert(os.path.exists(archive_name))
+ self.assertEqual(os.system("gzip -d %s" % archive_name), 0)
+ archive_name = self.mbox_name + "_archive"
+ assert(os.path.exists(archive_name))
+ assert(filecmp.cmp(archive_name, self.copy_name, shallow=0))
+
+ def tearDown(self):
+ archivemail.options.quiet = 0
+ archivemail.options.archive_all = 0
+ super(TestArchiveMboxAll, self).tearDown()
+
class TestArchiveMboxPreserveStatus(TestCaseInTempdir):
"""make sure the 'preserve_unread' option works"""
def setUp(self):