From: Sebastian Spaeth Date: Wed, 31 Mar 2010 08:23:29 +0000 (+0200) Subject: notmuch new implementation X-Git-Tag: 0.3~121^2~11 X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=commitdiff_plain;h=dfa9eb8afa66b79800addc2102b4bd153f4495ab notmuch new implementation It can not add and remove messages. However, message moves are not detected and we do not modify or honor the Directory entries yet. --- diff --git a/cnotmuch/globals.py b/cnotmuch/globals.py index d9f8d1b4..ef2686fc 100644 --- a/cnotmuch/globals.py +++ b/cnotmuch/globals.py @@ -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 46f65791..278d6d41 100755 --- 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