1414
1515from chatmaild .config import read_config
1616
17- FileEntry = namedtuple ("FileEntry" , ("relpath " , "mtime" , "size" ))
17+ FileEntry = namedtuple ("FileEntry" , ("path " , "mtime" , "size" ))
1818
1919
2020def iter_mailboxes (basedir , maxnum ):
@@ -51,33 +51,27 @@ class MailboxStat:
5151
5252 def __init__ (self , basedir ):
5353 self .basedir = str (basedir )
54- # all detected messages in cur/new/tmp folders
5554 self .messages = []
56-
57- # all detected files in mailbox top dir
5855 self .extrafiles = []
56+ self .scandir (self .basedir )
5957
60- # scan all relevant files (without recursion)
61- old_cwd = os .getcwd ()
62- try :
63- os .chdir (self .basedir )
64- except FileNotFoundError :
65- return
66- for name in os_listdir_if_exists ("." ):
58+ def scandir (self , folderdir ):
59+ for name in os_listdir_if_exists (folderdir ):
60+ path = f"{ folderdir } /{ name } "
6761 if name in ("cur" , "new" , "tmp" ):
68- for msg_name in os_listdir_if_exists (name ):
69- entry = get_file_entry (f"{ name } /{ msg_name } " )
62+ for msg_name in os_listdir_if_exists (path ):
63+ entry = get_file_entry (f"{ path } /{ msg_name } " )
7064 if entry is not None :
7165 self .messages .append (entry )
72-
66+ elif os .path .isdir (path ):
67+ self .scandir (path )
7368 else :
74- entry = get_file_entry (name )
69+ entry = get_file_entry (path )
7570 if entry is not None :
7671 self .extrafiles .append (entry )
7772 if name == "password" :
7873 self .last_login = entry .mtime
7974 self .extrafiles .sort (key = lambda x : - x .size )
80- os .chdir (old_cwd )
8175
8276
8377def print_info (msg ):
@@ -130,13 +124,6 @@ def process_mailbox_stat(self, mbox):
130124 self .remove_mailbox (mbox .basedir )
131125 return
132126
133- # all to-be-removed files are relative to the mailbox basedir
134- try :
135- os .chdir (mbox .basedir )
136- except FileNotFoundError :
137- print_info (f"mailbox not found/vanished { mbox .basedir } " )
138- return
139-
140127 mboxname = os .path .basename (mbox .basedir )
141128 if self .verbose :
142129 date = datetime .fromtimestamp (mbox .last_login ) if mbox .last_login else None
@@ -147,11 +134,12 @@ def process_mailbox_stat(self, mbox):
147134 self .all_files += len (mbox .messages )
148135 for message in mbox .messages :
149136 if message .mtime < cutoff_mails :
150- self .remove_file (message .relpath , mtime = message .mtime )
137+ self .remove_file (message .path , mtime = message .mtime )
151138 elif message .size > 200000 and message .mtime < cutoff_large_mails :
152139 # we only remove noticed large files (not unnoticed ones in new/)
153- if message .relpath .startswith ("cur/" ):
154- self .remove_file (message .relpath , mtime = message .mtime )
140+ parts = message .path .split ("/" )
141+ if len (parts ) >= 2 and parts [- 2 ] == "cur" :
142+ self .remove_file (message .path , mtime = message .mtime )
155143 else :
156144 continue
157145 changed = True
0 commit comments