mirror of
https://git.code.sf.net/p/archivemail/code
synced 2024-12-21 23:32:54 +00:00
New option --archive-name, alias -a, to hard-code the archive filename
This commit is contained in:
parent
04bf8eaa23
commit
3a9a5cd4b8
3 changed files with 64 additions and 19 deletions
|
@ -64,6 +64,10 @@ Version 0.8.0 - UNRELEASED
|
|||
strips the dot off the archive name. In particular, this makes working
|
||||
with Maildir++ subfolders more convenient. Closes: feature request
|
||||
#604281.
|
||||
* New option --archive-name, or short -a, to hard-code an archive filename.
|
||||
Like the --suffix and --prefix options, it is expanded with strftime().
|
||||
This option conflicts with archiving multiple mailboxes. Closes: feature
|
||||
request #1306538.
|
||||
|
||||
Version 0.7.2 - 9 November 2007
|
||||
|
||||
|
|
51
archivemail
51
archivemail
|
@ -174,6 +174,7 @@ class Options:
|
|||
archive_prefix = None
|
||||
archive_suffix = None
|
||||
archive_default_suffix = "_archive"
|
||||
archive_name = None
|
||||
days_old_max = 180
|
||||
date_old_max = None
|
||||
delete_old_mail = False
|
||||
|
@ -211,13 +212,14 @@ class Options:
|
|||
|
||||
"""
|
||||
try:
|
||||
opts, args = getopt.getopt(args, '?D:S:Vd:hno:F:P:qs:p:uv',
|
||||
opts, args = getopt.getopt(args, '?D:S:Vd:hno:F:P:qs:p:a:uv',
|
||||
["date=", "days=", "delete", "dry-run", "help",
|
||||
"include-flagged", "no-compress", "output-dir=",
|
||||
"filter-append=", "pwfile=", "dont-mangle",
|
||||
"preserve-unread", "quiet", "size=", "suffix=",
|
||||
"prefix=", "verbose", "debug-imap=", "version",
|
||||
"warn-duplicate", "copy", "all"])
|
||||
"prefix=", "archive-name=", "verbose",
|
||||
"debug-imap=", "version", "warn-duplicate",
|
||||
"copy", "all"])
|
||||
except getopt.error, msg:
|
||||
user_error(msg)
|
||||
|
||||
|
@ -261,6 +263,8 @@ class Options:
|
|||
self.archive_suffix = a
|
||||
if o in ('-p', '--prefix'):
|
||||
self.archive_prefix = a
|
||||
if o in ('-a', '--archive-name'):
|
||||
self.archive_name = os.path.expanduser(a)
|
||||
if o in ('-S', '--size'):
|
||||
self.min_size = string.atoi(a)
|
||||
if o in ('-u', '--preserve-unread'):
|
||||
|
@ -282,7 +286,7 @@ class Options:
|
|||
sys.exit(0)
|
||||
return args
|
||||
|
||||
def sanity_check(self):
|
||||
def sanity_check(self, args):
|
||||
"""Complain bitterly about our options now rather than later"""
|
||||
if self.output_dir:
|
||||
check_sane_destdir(self.output_dir)
|
||||
|
@ -297,6 +301,9 @@ class Options:
|
|||
if self.pwfile:
|
||||
if not os.path.isfile(self.pwfile):
|
||||
user_error("pwfile %s does not exist" % self.pwfile)
|
||||
if self.archive_name and len(args) > 1:
|
||||
user_error("the --archive-name cannot be used with multiple " \
|
||||
"mailboxes")
|
||||
|
||||
def date_argument(self, string):
|
||||
"""Converts a date argument string into seconds since the epoch"""
|
||||
|
@ -648,6 +655,7 @@ Options are as follows:
|
|||
-F, --filter-append=STRING append arbitrary string to the IMAP filter string
|
||||
-p, --prefix=NAME prefix for archive filename (default: none)
|
||||
-s, --suffix=NAME suffix for archive filename (default: '%s')
|
||||
-a, --archive-name=NAME specify complete archive filename
|
||||
-S, --size=NUM only archive messages NUM bytes or larger
|
||||
-n, --dry-run don't write to anything - just show what would be done
|
||||
-u, --preserve-unread never archive unread messages
|
||||
|
@ -683,7 +691,7 @@ Website: http://archivemail.sourceforge.net/ """ % \
|
|||
print usage
|
||||
sys.exit(1)
|
||||
|
||||
options.sanity_check()
|
||||
options.sanity_check(args)
|
||||
|
||||
for mailbox_path in args:
|
||||
archive(mailbox_path)
|
||||
|
@ -1631,27 +1639,32 @@ def commit_archive(archive, final_archive_name):
|
|||
|
||||
def make_archive_name(mailbox_name):
|
||||
"""Derive archive name and (relative) path from the mailbox name."""
|
||||
# allow the user to embed time formats such as '%B' in the prefix or suffix string
|
||||
# allow the user to embed time formats such as '%B' in the archive name
|
||||
if options.date_old_max == None:
|
||||
tm = time.localtime(time.time() - options.days_old_max*24*60*60)
|
||||
else:
|
||||
tm = time.localtime(options.date_old_max)
|
||||
prefix = suffix = ""
|
||||
if options.archive_prefix is None and options.archive_suffix is None:
|
||||
suffix = options.archive_default_suffix
|
||||
else:
|
||||
if options.archive_prefix:
|
||||
prefix = time.strftime(options.archive_prefix, tm)
|
||||
if options.archive_suffix:
|
||||
suffix = time.strftime(options.archive_suffix, tm)
|
||||
if re.match(r'imaps?://', mailbox_name.lower()):
|
||||
if options.archive_name:
|
||||
archive_head = ""
|
||||
archive_tail = mailbox_name.rsplit('/', 1)[-1]
|
||||
archive_tail = time.strftime(options.archive_name, tm)
|
||||
else:
|
||||
archive_head, archive_tail = os.path.split(mailbox_name)
|
||||
if not prefix:
|
||||
# Don't create hidden archives, e.g. when processing Maildir++ subfolders
|
||||
archive_tail = archive_tail.lstrip('.')
|
||||
if options.archive_prefix is None and options.archive_suffix is None:
|
||||
suffix = options.archive_default_suffix
|
||||
else:
|
||||
if options.archive_prefix:
|
||||
prefix = time.strftime(options.archive_prefix, tm)
|
||||
if options.archive_suffix:
|
||||
suffix = time.strftime(options.archive_suffix, tm)
|
||||
if re.match(r'imaps?://', mailbox_name.lower()):
|
||||
archive_head = ""
|
||||
archive_tail = mailbox_name.rsplit('/', 1)[-1]
|
||||
else:
|
||||
archive_head, archive_tail = os.path.split(mailbox_name)
|
||||
if not prefix:
|
||||
# Don't create hidden archives, e.g. when processing Maildir++
|
||||
# subfolders
|
||||
archive_tail = archive_tail.lstrip('.')
|
||||
if options.output_dir:
|
||||
archive_head = options.output_dir
|
||||
archive_name = os.path.join(archive_head, prefix + archive_tail + suffix)
|
||||
|
|
|
@ -434,6 +434,15 @@ class TestOptionParser(unittest.TestCase):
|
|||
archivemail.options.parse_args(["-p", prefix], "")
|
||||
self.assertEqual(archivemail.options.archive_prefix, prefix)
|
||||
|
||||
def testOptionArchivename(self):
|
||||
"""--archive-name and -a options are parsed correctly"""
|
||||
for name in ("custom", ".withdot", "custom_%Y", "%Y/joe"):
|
||||
archivemail.options.parse_args(["--archive-name="+name], "")
|
||||
self.assertEqual(archivemail.options.archive_name, name)
|
||||
archivemail.options.archive_name = None
|
||||
archivemail.options.parse_args(["-a", name], "")
|
||||
self.assertEqual(archivemail.options.archive_name, name)
|
||||
|
||||
def testOptionDryrun(self):
|
||||
"""--dry-run option is parsed correctly"""
|
||||
archivemail.options.parse_args(["--dry-run"], "")
|
||||
|
@ -938,6 +947,25 @@ class TestArchiveMboxPrefix(unittest.TestCase):
|
|||
archivemail.options.quiet = False
|
||||
archivemail.options.archive_prefix = None
|
||||
|
||||
class TestArchiveName(unittest.TestCase):
|
||||
def setUp(self):
|
||||
archivemail.options.quiet = True
|
||||
|
||||
def testArchiveName(self):
|
||||
"""test the --archive-name option"""
|
||||
archive_names = ("custom", ".withdot", "custom_%Y", "%Y/joe")
|
||||
mbox = "foobar"
|
||||
for name in archive_names:
|
||||
archivemail.options.archive_name = name
|
||||
days = archivemail.options.days_old_max
|
||||
tm = time.localtime(time.time() - days*24*60*60)
|
||||
name = time.strftime(name, tm)
|
||||
self.assertEqual(archivemail.make_archive_name(mbox), name)
|
||||
|
||||
def tearDown(self):
|
||||
archivemail.options.quiet = False
|
||||
archivemail.options.archive_name = None
|
||||
|
||||
class TestArchiveAffixes(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.mbox = "harbsch"
|
||||
|
|
Loading…
Reference in a new issue