]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch
README: update changelog
[notmuch] / notmuch
diff --git a/notmuch b/notmuch
index 5fc98bbef52a1ac5674edc97b225aba36882453e..2a1540a13a9c2d0fa7a088588997a8854c75ae63 100755 (executable)
--- a/notmuch
+++ b/notmuch
@@ -5,6 +5,7 @@ This "binary" honors the NOTMUCH_CONFIG environmen variable for reading a user's
 notmuch configuration (e.g. the database path)
 
 This code is licensed under the GNU GPL v3+."""
 notmuch configuration (e.g. the database path)
 
 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
 from cnotmuch.notmuch import Database, Query
 import sys, os, re, logging
 from subprocess import call
 from cnotmuch.notmuch import Database, Query
@@ -105,13 +106,13 @@ def quote_query_line(argv):
 if __name__ == '__main__':
 
    # Handle command line options
 if __name__ == '__main__':
 
    # Handle command line options
-   # No option 
    #-------------------------------------
    #-------------------------------------
+   # No option given, print USAGE and exit
    if len(sys.argv) == 1:
       print USAGE
    #-------------------------------------
    elif sys.argv[1] == 'setup':
    if len(sys.argv) == 1:
       print USAGE
    #-------------------------------------
    elif sys.argv[1] == 'setup':
-       """ Interactively setup notmuch for first use. """
+       """Interactively setup notmuch for first use."""
        print "Not implemented."
    #-------------------------------------
    elif sys.argv[1] == 'new':
        print "Not implemented."
    #-------------------------------------
    elif sys.argv[1] == 'new':
@@ -123,6 +124,19 @@ if __name__ == '__main__':
        if len(sys.argv) == 2: print HELPTEXT
        else: print "Not implemented"
    #-------------------------------------
        if len(sys.argv) == 2: print HELPTEXT
        else: print "Not implemented"
    #-------------------------------------
+   elif sys.argv[1] == 'search':
+      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:])
+      logging.debug("search "+querystr)
+      t = Query(db,querystr).search_threads()
+      for thread in t:
+         print(str(thread))
+   #-------------------------------------
    elif sys.argv[1] == 'show':
       db = Database()
       if len(sys.argv) == 2:
    elif sys.argv[1] == 'show':
       db = Database()
       if len(sys.argv) == 2:
@@ -136,20 +150,14 @@ if __name__ == '__main__':
       for msg in m:
          print(msg.format_as_text())
    #-------------------------------------
       for msg in m:
          print(msg.format_as_text())
    #-------------------------------------
-   elif sys.argv[1] == 'new':
-       #TODO: handle --verbose
-       print "Not implemented."
-   #-------------------------------------
    elif sys.argv[1] == 'count':
    elif sys.argv[1] == 'count':
-      db = Database()
       if len(sys.argv) == 2:
       if len(sys.argv) == 2:
-         #no further search term
+         #no further search term, count all
          querystr=''
       else:
          #mangle arguments wrapping terms with spaces in quotes
          querystr = quote_query_line(sys.argv[2:])
          querystr=''
       else:
          #mangle arguments wrapping terms with spaces in quotes
          querystr = quote_query_line(sys.argv[2:])
-      logging.debug("count "+querystr)
-      print(Query(db,querystr).count_messages())
+      print(Database().create_query(querystr).count_messages())
       
    #-------------------------------------
    elif sys.argv[1] == 'tag':
       
    #-------------------------------------
    elif sys.argv[1] == 'tag':
@@ -167,7 +175,7 @@ if __name__ == '__main__':
       if sys.argv[2]=='--': sys.argv.pop(2)
       #the rest is search terms
       querystr = quote_query_line(sys.argv[2:])
       if sys.argv[2]=='--': sys.argv.pop(2)
       #the rest is search terms
       querystr = quote_query_line(sys.argv[2:])
-      logging.warning("tag search-term "+querystr)
+      logging.debug("tag search-term "+querystr)
       db = Database(mode=Database.MODE.READ_WRITE)
       m  = Query(db,querystr).search_messages()
       for msg in m:
       db = Database(mode=Database.MODE.READ_WRITE)
       m  = Query(db,querystr).search_messages()
       for msg in m:
@@ -200,6 +208,46 @@ if __name__ == '__main__':
       for msg in m:
          f.write("%s (%s)\n" % (msg.get_message_id(), msg.get_tags()))
    #-------------------------------------
       for msg in m:
          f.write("%s (%s)\n" % (msg.get_message_id(), msg.get_tags()))
    #-------------------------------------
+   elif sys.argv[1] == 'restore':
+      import re
+      if len(sys.argv) == 2:
+         print("No filename given. Reading dump from stdin.")
+         f = sys.stdin
+      else:
+         f = open(sys.argv[2],"r")
+      #split the msg id and the tags
+      MSGID_TAGS = re.compile("(\S+)\s\((.*)\)$")
+      db = Database(mode=Database.MODE.READ_WRITE)
+
+      #read each line of the dump file
+      for line in f:
+         m = MSGID_TAGS.match(line)
+         if not m:
+            sys.stderr.write("Warning: Ignoring invalid input line: %s" % 
+                             line)
+            continue
+         # split line in components and fetch message
+         msg_id = m.group(1)
+         new_tags= set(m.group(2).split())
+         msg    = db.find_message(msg_id)
+
+         if msg == None:
+            sys.stderr.write(
+               "Warning: Cannot apply tags to missing message: %s\n" % id)
+            continue
+
+         #do nothing if the old set of tags is the same as the new one
+         old_tags = set(msg.get_tags())
+         if old_tags == new_tags: continue
+
+         #set the new tags
+         msg.freeze()
+         #only remove tags if the new ones are not a superset anyway
+         if not (new_tags > old_tags): msg.remove_all_tags()
+         for tag in new_tags: msg.add_tag(tag)
+         msg.thaw()
+            
+   #-------------------------------------
    else:
        # unknown command
        print "Error: Unknown command '%s' (see \"notmuch help\")" % sys.argv[1]
    else:
        # unknown command
        print "Error: Unknown command '%s' (see \"notmuch help\")" % sys.argv[1]