init from github/honza/mutt-notmuch-py
This commit is contained in:
parent
2893635d0c
commit
9b06bd57f4
108
src/python/samples/mutt-recoll.py
Normal file
108
src/python/samples/mutt-recoll.py
Normal file
@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
mutt-notmuch-py
|
||||
|
||||
This is a Gmail-only version of the original mutt-notmuch script.
|
||||
|
||||
It will interactively ask you for a search query and then symlink the matching
|
||||
messages to $HOME/.cache/mutt_results.
|
||||
|
||||
Add this to your muttrc.
|
||||
|
||||
macro index / "<enter-command>unset wait_key<enter><shell-escape>mutt-notmuch-py<enter><change-folder-readonly>~/.cache/mutt_results<enter>" \
|
||||
"search mail (using notmuch)"
|
||||
|
||||
This script overrides the $HOME/.cache/mutt_results each time you run a query.
|
||||
|
||||
Install this by adding this file somewhere on your PATH.
|
||||
|
||||
Tested on OSX Lion and Arch Linux.
|
||||
|
||||
(c) 2012 - Honza Pokorny
|
||||
Licensed under BSD
|
||||
"""
|
||||
|
||||
import os
|
||||
import hashlib
|
||||
|
||||
from commands import getoutput
|
||||
from mailbox import Maildir
|
||||
from optparse import OptionParser
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
def digest(filename):
|
||||
with open(filename) as f:
|
||||
return hashlib.sha1(f.read()).hexdigest()
|
||||
|
||||
|
||||
def pick_all_mail(messages):
|
||||
for m in messages:
|
||||
if 'All Mail' in m:
|
||||
return m
|
||||
|
||||
|
||||
def empty_dir(directory):
|
||||
box = Maildir(directory)
|
||||
box.clear()
|
||||
|
||||
|
||||
def command(cmd):
|
||||
return getoutput(cmd)
|
||||
|
||||
|
||||
def main(dest_box, is_gmail):
|
||||
query = raw_input('Query: ')
|
||||
|
||||
command('mkdir -p %s/cur' % dest_box)
|
||||
command('mkdir -p %s/new' % dest_box)
|
||||
|
||||
empty_dir(dest_box)
|
||||
|
||||
files = command('notmuch search --output=files %s' % query).split('\n')
|
||||
|
||||
data = defaultdict(list)
|
||||
messages = []
|
||||
|
||||
for f in files:
|
||||
if not f:
|
||||
continue
|
||||
|
||||
try:
|
||||
sha = digest(f)
|
||||
data[sha].append(f)
|
||||
except IOError:
|
||||
print('File %s does not exist' % f)
|
||||
|
||||
for sha in data:
|
||||
if is_gmail and len(data[sha]) > 1:
|
||||
messages.append(pick_all_mail(data[sha]))
|
||||
else:
|
||||
messages.append(data[sha][0])
|
||||
|
||||
for m in messages:
|
||||
if not m:
|
||||
continue
|
||||
|
||||
target = os.path.join(dest_box, 'cur', os.path.basename(m))
|
||||
if not os.path.exists(target):
|
||||
os.symlink(m, target)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
p = OptionParser("usage: %prog [OPTIONS] [RESULTDIR]")
|
||||
p.add_option('-g', '--gmail', dest='gmail',
|
||||
action='store_true', default=True,
|
||||
help='gmail-specific behavior')
|
||||
p.add_option('-G', '--not-gmail', dest='gmail',
|
||||
action='store_false',
|
||||
help='gmail-specific behavior')
|
||||
(options, args) = p.parse_args()
|
||||
|
||||
if args:
|
||||
dest = args[0]
|
||||
else:
|
||||
dest = '~/.cache/mutt_results'
|
||||
|
||||
# Use expanduser() so that os.symlink() won't get weirded out by tildes.
|
||||
main(os.path.expanduser(dest).rstrip('/'), options.gmail)
|
||||
Loading…
x
Reference in New Issue
Block a user