notmuch new implementation
authorSebastian Spaeth <sebastian@sspaeth.de>
Wed, 31 Mar 2010 08:23:29 +0000 (10:23 +0200)
committerSebastian Spaeth <sebastian@sspaeth.de>
Wed, 31 Mar 2010 08:23:29 +0000 (10:23 +0200)
It can not add and remove messages. However, message moves are not detected and we do not modify or honor the Directory entries yet.

cnotmuch/globals.py
notmuch

index d9f8d1b465b74b4eff2b3b214fac30e5ba557e8a..ef2686fc5520ee7a88083b021fcdc072ce825f3f 100644 (file)
@@ -29,6 +29,7 @@ class Status(Enum):
         """
         super(Status, self).__init__(statuslist)
 
+    @classmethod
     def status2str(self, status):
         """Get a string representation of a notmuch_status_t value."""   
         # define strings for custom error messages
diff --git a/notmuch b/notmuch
index 46f65791cc1618f316446e651294e24115eb239c..278d6d411860aa8e426a60c9ba27b875f7c05051 100755 (executable)
--- a/notmuch
+++ b/notmuch
@@ -85,13 +85,7 @@ class Notmuch:
 
 
         #for folder in subdirs:
-        #   (new_added, new_moved, new_removed) = \
-        #           self._add_new_files_recursively(
-        #                  os.path.join(db_dir.path, folder), db)
-        #   added += new_added
-        #   moved += new_moved
-        #   removed += new_removed
-
+        
         #TODO, retrieve dir mtime here and store it later
         #as long as Filenames() does not allow multiple iteration, we need to
         #use this kludgy way to get a sorted list of filenames
@@ -99,68 +93,86 @@ class Notmuch:
         db_files = set()
         db_folders = set()
         for subdir in db_dir.get_child_directories():
-           db_folders.add(os.path.normpath(subdir))
+           db_folders.add(subdir)
         for file in db_dir.get_child_files():
            db_files.add(file)
 
         fs_files = set(os.listdir(db_dir.path))
 
-        #list of folders in both db and fs. Just descend into dirs
-        for fs_file in (fs_files | db_folders):
-           absfile = os.path.normpath(os.path.join(db_dir.path, fs_file))
-           if os.path.isdir(absfile):
-              #This is a directory
-              if fs_file in ['.notmuch','tmp','.']:
-                 continue
-              self._add_new_files_recursively(absfile, db)
-           # we are not interested in anything but directories here
-
-        #list of files and folders in the fs, but not the db
-        for fs_file in (fs_files - db_files):
+        #list of files (and folders) on the fs, but not the db
+        for fs_file in ((fs_files - db_files) - db_folders):
            absfile = os.path.normpath(os.path.join(db_dir.path, fs_file))
            statinfo = os.stat(absfile)
 
            if stat.S_ISDIR(statinfo.st_mode):
               #This is a directory
-              if fs_file in ['.notmuch','.']:
+              if fs_file in ['.notmuch','tmp','.']:
                  continue
-              print "descending into %s" % absfile
-              #self._add_new_files_recursively(absfile, db)
+              print "%s %s" % (fs_file, db_folders)
+              print "Directory not in db yet. Descending into %s" % absfile
+              (new_added, new_moved, new_removed) = \
+                  self._add_new_files_recursively(absfile, db)
+              added += new_added
+              moved += new_moved
+              removed += new_removed
+
            elif stat.S_ISLNK(statinfo.st_mode):
-              print ("%s is a symbolic link (%d)" % (absfile, statinfo.st_mode))
+              print ("%s is a symbolic link (%d). FIXME!!!" % (absfile, statinfo.st_mode))
+              sys.exit()
            else:
+              #This is a regular file, not in the db yet. Add it.
               print "This file needs to be added %s" % (absfile)
-              #TODO
-              #(msg, status) = db.add_message(os.path.join(db_dir.path, db_file))
-              #if status == STATUS.DUPLICATE_MESSAGE_ID:
-           #   #This message was already in the database, continue with next one
-           #   continue
+              (msg, status) = db.add_message(absfile)
+              # We increases 'added', even on dupe messages. If it is a moved
+              # message, we will deduct it later and increase 'moved' instead
+              added += 1
+
+              if status == STATUS.DUPLICATE_MESSAGE_ID:
+                 #This message was already in the database
+                 print "Added msg was in the db"
+              else:
+                 print "New message."
 
-        #list of files and folders in the database, but not the filesystem
+        # Finally a list of files (not folders) in the database,
+        # but not the filesystem
         for db_file in (db_files - fs_files):
            absfile = os.path.normpath(os.path.join(db_dir.path, db_file))
-           statinfo = os.stat(absfile)
 
-           if stat.S_ISDIR(statinfo.st_mode):
-              #This is a directory
-              if db_file in ['.notmuch', '.']:
+           #remove a mail message from the db
+           print ("%s is not on the fs anymore. Delete" % absfile)
+           status = db.remove_message(absfile)
+           if status == STATUS.SUCCESS:
+              # we just deleted the last reference, so this was a remove
+              removed += 1
+              sys.stderr.write("SUCCESS %d %s %s.\n" % (status, STATUS.status2str(status), absfile))
+           elif status == STATUS.DUPLICATE_MESSAGE_ID:
+              # The filename exists already somewhere else, so this is a move
+              moved += 1
+              added -= 1
+              sys.stderr.write("DUPE %d %s %s.\n" % (status, STATUS.status2str(status), absfile))
+           else: 
+              #This should not occur
+              sys.stderr.write("This should not occur %d %s %s.\n" % (status, STATUS.status2str(status), absfile))
+
+        #list of folders in the filesystem. Just descend into dirs
+        for fs_file in fs_files:
+           absfile = os.path.normpath(os.path.join(db_dir.path, fs_file))
+           if os.path.isdir(absfile):
+              #This is a directory.
+              # Remove it from the db_folder list. All remaining db_folders
+              # at the end will be not present on the file system.
+              db_folders.remove(fs_file)
+              if fs_file in ['.notmuch','tmp','.']:
                  continue
-              print "descending into %s" % absfile
-              self._add_new_files_recursively(absfile, db)
-              #TODO, is there no way to REMOVE a directory entry from the db?
-           else:
-              #remove a mail message from the db
-              print ("%s is not on the fs anymore. Delete" % absfile)
-              status = db.remove_message(absfile)
-              if status == STATUS.SUCCESS:
-                 # we just deleted the last reference, so this was a remove
-                 removed += 1
-              elif status == STATUS.DUPLICATE_MESSAGE_ID:
-                 # The filename exists already somewhere else, so this is a move
-                 moved += 1
-              else: 
-                 print "This must not happen. %s " % (absfile)
-                 sys.exit(1)
+              (new_added, new_moved, new_removed) = \
+                  self._add_new_files_recursively(absfile, db)
+              added += new_added
+              moved += new_moved
+              removed += new_removed
+
+           # we are not interested in anything but directories here
+           #TODO: All remaining elements of db_folders are not in the filesystem
+           #delete those
 
         return (added, moved, removed)
         #Read the mtime of a directory from the filesystem