|
|
|
#!/usr/bin/env python
|
|
|
|
"""
|
|
|
|
List maildirs in your Maildir++ with message counts.
|
|
|
|
"""
|
|
|
|
from __future__ import division, print_function
|
|
|
|
|
|
|
|
import os
|
|
|
|
import os.path
|
|
|
|
import re
|
|
|
|
import yaml
|
|
|
|
|
|
|
|
def maildirs(startdir):
|
|
|
|
for dirpath, dirnames, _ in os.walk(startdir):
|
|
|
|
if set(['cur', 'new', 'tmp']).issubset(set(dirnames)):
|
|
|
|
yield dirpath
|
|
|
|
|
|
|
|
|
|
|
|
def maildir_count(maildir):
|
|
|
|
|
|
|
|
def dir_count(dir_):
|
|
|
|
return len(os.listdir(dir_))
|
|
|
|
|
|
|
|
cur = dir_count(os.path.join(maildir, 'cur'))
|
|
|
|
new = dir_count(os.path.join(maildir, 'new'))
|
|
|
|
count = cur + new
|
|
|
|
|
|
|
|
return (new, count)
|
|
|
|
|
|
|
|
|
|
|
|
def mailbox_name(maildir, root):
|
|
|
|
name = re.sub(root + r'/?\.?', '', maildir)
|
|
|
|
if name == '':
|
|
|
|
return 'INBOX'
|
|
|
|
else:
|
|
|
|
return name
|
|
|
|
|
|
|
|
|
|
|
|
config_filename = '~/.config/maildir-zero.yml'
|
|
|
|
config = {}
|
|
|
|
try:
|
|
|
|
config = yaml.load(open(os.path.expanduser(config_filename)))
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
ignore_zero = config.get('ignore_zero', True)
|
|
|
|
ignore = config.get('ignore', [r'spam'])
|
|
|
|
sort_by_count = config.get('sort_by_count', True)
|
|
|
|
|
|
|
|
|
|
|
|
root = os.path.expanduser('~/Maildir')
|
|
|
|
counts = {}
|
|
|
|
for maildir in maildirs(root):
|
|
|
|
name = mailbox_name(maildir, root)
|
|
|
|
_, count = maildir_count(maildir)
|
|
|
|
|
|
|
|
if count == 0 and ignore_zero:
|
|
|
|
continue
|
|
|
|
|
|
|
|
if any(re.match(i, name) for i in ignore):
|
|
|
|
continue
|
|
|
|
|
|
|
|
counts[name] = count
|
|
|
|
|
|
|
|
if sort_by_count:
|
|
|
|
key = lambda i: i[1]
|
|
|
|
reverse = True
|
|
|
|
else:
|
|
|
|
key = lambda i: i[0]
|
|
|
|
reverse = False
|
|
|
|
|
|
|
|
try:
|
|
|
|
length_name = max(len(name) for name in counts.keys())
|
|
|
|
except:
|
|
|
|
length_name = len('Total')
|
|
|
|
try:
|
|
|
|
length_count = max(len(str(count)) for count in counts.values())
|
|
|
|
except:
|
|
|
|
length_count = 3
|
|
|
|
|
|
|
|
for name, count in sorted(counts.items(), key=key, reverse=reverse):
|
|
|
|
print('{0:{1}}\t{2:{3}d}'.format(name, length_name, count, length_count))
|
|
|
|
|
|
|
|
total = sum(counts.values())
|
|
|
|
print('\n{0:{1}}\t{2:{3}d}'.format('Total', length_name, total, length_count))
|