diff --git a/chatmaild/src/chatmaild/expire.py b/chatmaild/src/chatmaild/expire.py index e811b4af..e940500d 100644 --- a/chatmaild/src/chatmaild/expire.py +++ b/chatmaild/src/chatmaild/expire.py @@ -14,7 +14,7 @@ from stat import S_ISREG from chatmaild.config import read_config -FileEntry = namedtuple("FileEntry", ("relpath", "mtime", "size")) +FileEntry = namedtuple("FileEntry", ("path", "mtime", "size")) def iter_mailboxes(basedir, maxnum): @@ -51,35 +51,22 @@ class MailboxStat: def __init__(self, basedir): self.basedir = str(basedir) - # all detected messages in cur/new/tmp folders self.messages = [] - - # all detected files in mailbox top dir self.extrafiles = [] + self.scandir(self.basedir) - # scan all relevant files (without recursion) - old_cwd = os.getcwd() - try: - os.chdir(self.basedir) - except FileNotFoundError: - return - try: - self.scandir(".") - finally: - os.chdir(old_cwd) - - def scandir(self, dirname): - for name in os_listdir_if_exists(dirname): - relpath = f"{dirname}/{name}" + def scandir(self, folderdir): + for name in os_listdir_if_exists(folderdir): + path = f"{folderdir}/{name}" if name in ("cur", "new", "tmp"): - for msg_name in os_listdir_if_exists(relpath): - entry = get_file_entry(f"{relpath}/{msg_name}") + for msg_name in os_listdir_if_exists(path): + entry = get_file_entry(f"{path}/{msg_name}") if entry is not None: self.messages.append(entry) - elif relpath == "./.DeltaChat": - self.scandir(name) + elif os.path.isdir(path): + self.scandir(path) else: - entry = get_file_entry(relpath) + entry = get_file_entry(path) if entry is not None: self.extrafiles.append(entry) if name == "password": @@ -137,13 +124,6 @@ class Expiry: self.remove_mailbox(mbox.basedir) return - # all to-be-removed files are relative to the mailbox basedir - try: - os.chdir(mbox.basedir) - except FileNotFoundError: - print_info(f"mailbox not found/vanished {mbox.basedir}") - return - mboxname = os.path.basename(mbox.basedir) if self.verbose: date = datetime.fromtimestamp(mbox.last_login) if mbox.last_login else None @@ -154,11 +134,12 @@ class Expiry: self.all_files += len(mbox.messages) for message in mbox.messages: if message.mtime < cutoff_mails: - self.remove_file(message.relpath, mtime=message.mtime) + self.remove_file(message.path, mtime=message.mtime) elif message.size > 200000 and message.mtime < cutoff_large_mails: # we only remove noticed large files (not unnoticed ones in new/) - if "cur" in message.relpath.split("/"): - self.remove_file(message.relpath, mtime=message.mtime) + parts = message.path.split("/") + if len(parts) >= 2 and parts[-2] == "cur": + self.remove_file(message.path, mtime=message.mtime) else: continue changed = True diff --git a/chatmaild/src/chatmaild/tests/test_expire.py b/chatmaild/src/chatmaild/tests/test_expire.py index 89d3a69b..fcdb4506 100644 --- a/chatmaild/src/chatmaild/tests/test_expire.py +++ b/chatmaild/src/chatmaild/tests/test_expire.py @@ -17,16 +17,17 @@ from chatmaild.expire import main as expiry_main from chatmaild.fsreport import main as report_main -def fill_mbox(basedir1): - password = basedir1.joinpath("password") +def fill_mbox(folderdir): + password = folderdir.joinpath("password") password.write_text("xxx") - basedir1.joinpath("maildirsize").write_text("xxx") + folderdir.joinpath("maildirsize").write_text("xxx") - garbagedir = basedir1.joinpath("garbagedir") + garbagedir = folderdir.joinpath("garbagedir") garbagedir.mkdir() + garbagedir.joinpath("bimbum").write_text("hello") - create_new_messages(basedir1, ["cur/msg1"], size=500) - create_new_messages(basedir1, ["new/msg2"], size=600) + create_new_messages(folderdir, ["cur/msg1"], size=500) + create_new_messages(folderdir, ["new/msg2"], size=600) def create_new_messages(basedir, relpaths, size=1000, days=0): @@ -86,7 +87,7 @@ def test_stats_mailbox(mbox1): create_new_messages(mbox1.basedir, ["large-extra"], size=1000) create_new_messages(mbox1.basedir, ["index-something"], size=3) mbox2 = MailboxStat(mbox1.basedir) - assert len(mbox2.extrafiles) == 4 + assert len(mbox2.extrafiles) == 5 assert mbox2.extrafiles[0].size == 1000 # cope well with mailbox dirs that have no password (for whatever reason)