diff --git a/src/python/jw/pkg/lib/ExecContext.py b/src/python/jw/pkg/lib/ExecContext.py index f1312dd1..cdf01a53 100644 --- a/src/python/jw/pkg/lib/ExecContext.py +++ b/src/python/jw/pkg/lib/ExecContext.py @@ -292,6 +292,7 @@ class ExecContext(Base): owner: str|None, group: str|None, mode: str|None, + atomic: bool, ) -> Result: from .util import pretty_cmd @@ -303,18 +304,19 @@ class ExecContext(Base): try: if wd is not None: path = wd + '/' + path - tmp = (await __run(['mktemp', path + '.XXXXXX'])).stdout.decode().strip() cmds: list[dict[str, str|list[str]|bool]] = [] - cmds.append({'cmd': ['tee', tmp], 'cmd_input': content}) + out = (await __run(['mktemp', path + '.XXXXXX'])).stdout.decode().strip() if atomic else path + cmds.append({'cmd': ['tee', out], 'cmd_input': content}) if owner is not None and group is not None: - cmds.append({'cmd': ['chown', f'{owner}:{group}', tmp]}) + cmds.append({'cmd': ['chown', f'{owner}:{group}', out]}) elif owner is not None: - cmds.append({'cmd': ['chown', owner, tmp]}) + cmds.append({'cmd': ['chown', owner, out]}) elif group is not None: - cmds.append({'cmd': ['chgrp', group, tmp]}) + cmds.append({'cmd': ['chgrp', group, out]}) if mode is not None: - cmds.append({'cmd': ['chmod', mode, tmp]}) - cmds.append({'cmd': ['mv', tmp, path]}) + cmds.append({'cmd': ['chmod', mode, out]}) + if atomic: + cmds.append({'cmd': ['mv', out, path]}) for cmd in cmds: log(DEBUG, f'{self.log_name}: Running {pretty_cmd(cmd['cmd'], wd)}') ret = await __run(**cmd) diff --git a/src/python/jw/pkg/lib/FileContext.py b/src/python/jw/pkg/lib/FileContext.py index 33d85469..394a45dd 100644 --- a/src/python/jw/pkg/lib/FileContext.py +++ b/src/python/jw/pkg/lib/FileContext.py @@ -88,6 +88,7 @@ class FileContext(abc.ABC): owner: str|None, group: str|None, mode: str|None, + atomic: bool, ) -> Result: raise NotImplementedError() @@ -98,13 +99,14 @@ class FileContext(abc.ABC): wd: str|None = None, throw: bool = True, verbose: bool|None = None, - title: str=None, - owner: str|None=None, - group: str|None=None, - mode: str|None=None, + title: str = None, + owner: str|None = None, + group: str|None = None, + mode: str|None = None, + atomic: bool = False ) -> Result: return await self._put(content, path, wd=wd, throw=throw, verbose=verbose, - title=title, owner=owner, group=group, mode=mode) + title=title, owner=owner, group=group, mode=mode, atomic=atomic) async def _close(self) -> None: pass diff --git a/src/python/jw/pkg/lib/ec/Curl.py b/src/python/jw/pkg/lib/ec/Curl.py index 0909bf68..5d85c6b4 100644 --- a/src/python/jw/pkg/lib/ec/Curl.py +++ b/src/python/jw/pkg/lib/ec/Curl.py @@ -44,17 +44,3 @@ class Curl(Base): path = '/' + path cmd.append(self.__base_url + path) return await self.__ec.run(cmd, throw=throw, verbose=verbose) - - async def _put( - self, - content: bytes, - path: str, - wd: str|None, - throw: bool, - verbose: bool|None, - title: str, - owner: str|None, - group: str|None, - mode: str|None, - ) -> Result: - raise NotImplementedError()