mirror of
https://github.com/chatmail/relay.git
synced 2026-05-10 16:04:37 +00:00
fix: use absolute path instead of relative path, and streamline some code parts according to comments at https://github.com/chatmail/relay/pull/785
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user