#!/usr/bin/env python
-"""This is a notmuch implementation in python. It's goal is to allow running the test suite on the cnotmuch python bindings.
+"""This is a notmuch implementation in python.
+It's goal is to allow running the test suite on the cnotmuch python bindings.
This "binary" honors the NOTMUCH_CONFIG environmen variable for reading a user's
-notmuch configuration (e.g. the database path)
+notmuch configuration (e.g. the database path).
-This code is licensed under the GNU GPL v3+."""
+ (c) 2010 by Sebastian Spaeth <Sebastian@SSpaeth.de>
+ Jesse Rosenthal <jrosenthal@jhu.edu>
+ This code is licensed under the GNU GPL v3+.
+"""
from __future__ import with_statement # This isn't required in Python 2.6
import sys, os, re, logging
from subprocess import call
if len(sys.argv) == 2: print HELPTEXT
else: print "Not implemented"
#-------------------------------------
- elif sys.argv[1] == 'search':
+ elif sys.argv[1] == 'part':
db = Database()
- if len(sys.argv) == 2:
- #no further search term
- querystr=''
+ query_string = ''
+ part_num=0
+ first_search_term = None
+ for (i, arg) in enumerate(sys.argv[1:]):
+ if arg.startswith('--part='):
+ part_num_str=arg.split("=")[1]
+ try:
+ part_num = int(part_num_str)
+ except ValueError:
+ # just emulating behavior
+ sys.exit()
+ elif not arg.startswith('--'):
+ #save the position of the first sys.argv that is a search term
+ first_search_term = i+1
+
+ if first_search_term:
+ #mangle arguments wrapping terms with spaces in quotes
+ querystr = quote_query_line(sys.argv[first_search_term:])
+
+
+ logging.debug("part "+querystr)
+ qry = Query(db,querystr)
+ msgs = qry.search_messages()
+ msg_list = []
+ for m in msgs:
+ msg_list.append(m)
+
+ if len(msg_list) == 0:
+ sys.exit()
+ elif len(msg_list) > 1:
+ raise Exception("search term did not match precisely one message")
else:
- #mangle arguments wrapping terms with spaces in quotes
- querystr = quote_query_line(sys.argv[2:])
+ msg = msg_list[0]
+ print(msg.get_part(part_num))
+ #-------------------------------------
+ elif sys.argv[1] == 'search':
+ db = Database()
+ query_string = ''
+ sort_order="newest-first"
+ first_search_term = None
+ for (i, arg) in enumerate(sys.argv[1:]):
+ if arg.startswith('--sort='):
+ sort_order=arg.split("=")[1]
+ if not sort_order in ("oldest-first", "newest-first"):
+ raise Exception("unknown sort order")
+ elif not arg.startswith('--'):
+ #save the position of the first sys.argv that is a search term
+ first_search_term = i+1
+
+ if first_search_term:
+ #mangle arguments wrapping terms with spaces in quotes
+ querystr = quote_query_line(sys.argv[first_search_term:])
+
+
logging.debug("search "+querystr)
- t = Query(db,querystr).search_threads()
+ qry = Query(db,querystr)
+ if sort_order == "oldest-first":
+ qry.set_sort(Query.SORT.OLDEST_FIRST)
+ else:
+ qry.set_sort(Query.SORT.NEWEST_FIRST)
+ t = qry.search_threads()
+
for thread in t:
- print(str(thread))
+ print(str(thread))
+
#-------------------------------------
elif sys.argv[1] == 'show':
+ entire_thread = False
db = Database()
- if len(sys.argv) == 2:
- #no further search term
- querystr=''
- else:
- #mangle arguments wrapping terms with spaces in quotes
- querystr = quote_query_line(sys.argv[2:])
+ out_format="text"
+ querystr=''
+ first_search_term = None
+
+ #ugly homegrown option parsing
+ #TODO: use OptionParser
+ for (i, arg) in enumerate(sys.argv[1:]):
+ if arg == '--entire-thread':
+ entire_thread = True
+ elif arg.startswith("--format="):
+ out_format = arg.split("=")[1]
+ if out_format == 'json':
+ #for compatibility use --entire-thread for json
+ entire_thread = True
+ if not out_format in ("json", "text"):
+ raise Exception("unknown format")
+ elif not arg.startswith('--'):
+ #save the position of the first sys.argv that is a search term
+ first_search_term = i+1
+
+ if first_search_term:
+ #mangle arguments wrapping terms with spaces in quotes
+ querystr = quote_query_line(sys.argv[first_search_term:])
+
logging.debug("show "+querystr)
- m = Query(db,querystr).search_messages()
- for msg in m:
- print(msg.format_as_text())
+ t = Query(db,querystr).search_threads()
+
+ first_toplevel=True
+ if out_format.lower()=="json":
+ sys.stdout.write("[")
+
+ for thrd in t:
+ msgs = thrd.get_toplevel_messages()
+
+ if not first_toplevel:
+ if out_format.lower()=="json":
+ sys.stdout.write(", ")
+
+ first_toplevel = False
+
+ msgs.print_messages(out_format, 0, entire_thread)
+
+ if out_format.lower() == "json":
+ sys.stdout.write("]")
+ sys.stdout.write("\n")
#-------------------------------------
elif sys.argv[1] == 'reply':