lib.FileContext: Add file methods

Add the following methods, meant to do the obvious:

unlink(self, path: str) -> None erase(self, path: str) -> None rename(self, src: str, dst: str) -> None mktemp(self, tmpl: str, directory: bool=False) -> None chown(self, path: str, owner: str|None=None, group: str|None=None) -> None chmod(self, path: str, mode: int) -> None stat(self, path: str, follow_symlinks: bool=True) -> StatResult file_exists(self, path: str) -> bool is_dir(self, path: str) -> bool

All methods are async and call their protected counterpart, which is designed to be overridden. If possible, default implementations do something meaningful, if not, they just raise plain NotImplementedError.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-04-17 09:15:06 +02:00
commit 3cf5b2264e
5 changed files with 295 additions and 10 deletions

View file

@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
import os, sys, subprocess, asyncio
import os, sys, subprocess, asyncio, pwd, grp, stat
from ..ExecContext import ExecContext as Base
from ..base import Result
from ..base import Result, StatResult
from ..log import *
from ..util import pretty_cmd
@ -151,3 +151,32 @@ class Local(Base):
cmdline.extend(opts)
cmdline.extend(cmd)
return await self._run(cmdline, *args, **kwargs)
async def _unlink(self, path: str) -> None:
os.unlink(path)
async def _erase(self, path: str) -> None:
if os.isdir(path):
shutil.rmtree(path)
return
os.unlink(path)
async def _rename(self, src: str, dst: str) -> None:
os.rename(src, dst)
async def _stat(self, path: str, follow_symlinks: bool) -> StatResult:
return StatResult.from_os(os.stat(path, follow_symlinks=follow_symlinks))
async def _file_exists(self, path: str) -> bool:
return os.path.exists(path)
async def _chown(self, path: str, owner: str|None, group: str|None) -> None:
uid = pwd.getpwnam(owner).pw_uid if owner else -1
gid = grp.getgrnam(group).gr_gid if group else -1
os.chown(path, uid, gid)
async def _chmod(self, path: str, mode: int) -> None:
os.chmod(path, mode)
async def _is_dir(self, path: str) -> bool:
return os.path.isdir(path)