From fe3508036ebe28625afd019875227087b07d0495 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Fri, 17 Apr 2026 15:05:42 +0200 Subject: [PATCH] lib.FileContext.put(): Change param mode type str -> int Don't pass mode as a string to put(). Given the multitunde of possible string representations for numbers, some understood by int(string, 0) and some not, there's too much room for passing strings which are unparseable, or worse, prone to be parsed wrongly. However, pass mode down to _put() as a string for convenience, because that's what most _put() implementations will need to use. If they don't, converting to int is easy from the one defined string format. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/cmds/posix/CmdCopy.py | 2 +- src/python/jw/pkg/lib/FileContext.py | 5 +++-- src/python/jw/pkg/lib/util.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/python/jw/pkg/cmds/posix/CmdCopy.py b/src/python/jw/pkg/cmds/posix/CmdCopy.py index da819e5c..cf666d05 100644 --- a/src/python/jw/pkg/cmds/posix/CmdCopy.py +++ b/src/python/jw/pkg/cmds/posix/CmdCopy.py @@ -31,4 +31,4 @@ class CmdCopy(Cmd): # export return url return self.app.distro_info(url) await copy(__expand(args.src), __expand(args.dst), - owner=args.owner, group=args.group, mode=args.mode) + owner=args.owner, group=args.group, mode=int(args.mode, 0)) diff --git a/src/python/jw/pkg/lib/FileContext.py b/src/python/jw/pkg/lib/FileContext.py index be8cbc9c..7d967383 100644 --- a/src/python/jw/pkg/lib/FileContext.py +++ b/src/python/jw/pkg/lib/FileContext.py @@ -102,11 +102,12 @@ class FileContext(abc.ABC): title: str = None, owner: str|None = None, group: str|None = None, - mode: str|None = None, + mode: int|None = None, atomic: bool = False ) -> Result: + mode_str = None if mode is None else oct(mode).replace('0o', '0') return await self._put(path, content, wd=wd, throw=throw, verbose=verbose, - title=title, owner=owner, group=group, mode=mode, atomic=atomic) + title=title, owner=owner, group=group, mode=mode_str, atomic=atomic) async def _close(self) -> None: pass diff --git a/src/python/jw/pkg/lib/util.py b/src/python/jw/pkg/lib/util.py index 7798988b..329ff593 100644 --- a/src/python/jw/pkg/lib/util.py +++ b/src/python/jw/pkg/lib/util.py @@ -100,7 +100,7 @@ async def run_sudo(cmd: list[str], *args, interactive: bool=True, ec: ExecContex ec = Local(interactive=interactive) return await ec.sudo(cmd, *args, **kwargs) -async def copy(src_uri: str, dst_uri: str, owner: str|None=None, group: str|None=None, mode: str|None=None, throw=True) -> Exception|str: +async def copy(src_uri: str, dst_uri: str, owner: str|None=None, group: str|None=None, mode: int|None=None, throw=True) -> Exception|str: from .ExecContext import ExecContext src: ExecContext|None = None dst: ExecContext|None = None