From 812ddaa1b0cbab6145fa09c4639dcf9e2ecdad10 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 10 Jun 2026 11:33:43 +0200 Subject: [PATCH 1/5] lib.Result.__repr__() Fix missing f-qualifier __repr__() tries to format a variable in an f-string without "f". Fix that. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/lib/Result.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/jw/pkg/lib/Result.py b/src/python/jw/pkg/lib/Result.py index 5f30ff86..60b7c122 100644 --- a/src/python/jw/pkg/lib/Result.py +++ b/src/python/jw/pkg/lib/Result.py @@ -46,7 +46,7 @@ class Result: else: ret = self.stdout_str[:20] if quote: - ret = '"{ret}"' + ret = f'"{ret}"' return ret def __repr__(self) -> str: -- 2.54.0 From 9732b4878816f1a015a6566074c16b637943402d Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 10 Jun 2026 12:26:01 +0200 Subject: [PATCH 2/5] lib.Result.__repr__(): Fix binary stdout exception __repr__() tries to decode binary stdout as string and fails without a backup. Fix that. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/lib/Result.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/python/jw/pkg/lib/Result.py b/src/python/jw/pkg/lib/Result.py index 60b7c122..d7353739 100644 --- a/src/python/jw/pkg/lib/Result.py +++ b/src/python/jw/pkg/lib/Result.py @@ -44,7 +44,12 @@ class Result: if self.__stdout is None: ret = '' else: - ret = self.stdout_str[:20] + max_len = 40 + try: + ret = self.stdout_str[:max_len] + except UnicodeDecodeError: + chunk = self.__stdout[:max_len] + ret = ''.join(chr(b) if 32 <= b <= 126 else '.' for b in chunk) if quote: ret = f'"{ret}"' return ret -- 2.54.0 From 4a6c8ab1d1ed3c76c0cb5526c721ca9b7c10343e Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 10 Jun 2026 11:54:03 +0200 Subject: [PATCH 3/5] lib.ExecContext|.Distro: Ignore stdout_str newline Ignore newline at the end of Result.stdout_str if only one line of output is wanted from an executed shell command. The output of both uname and mktemp are used wrongly in that regard. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/lib/Distro.py | 2 +- src/python/jw/pkg/lib/ExecContext.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/jw/pkg/lib/Distro.py b/src/python/jw/pkg/lib/Distro.py index 816423c8..76a01571 100644 --- a/src/python/jw/pkg/lib/Distro.py +++ b/src/python/jw/pkg/lib/Distro.py @@ -78,7 +78,7 @@ class Distro(abc.ABC): ), ) raise - uname = result.stdout_str.lower() + uname = result.stdout_str.strip().lower() ret = f'ID={uname}\nVERSION_CODENAME=unknown' return ret diff --git a/src/python/jw/pkg/lib/ExecContext.py b/src/python/jw/pkg/lib/ExecContext.py index c9058a46..fd08ccd5 100644 --- a/src/python/jw/pkg/lib/ExecContext.py +++ b/src/python/jw/pkg/lib/ExecContext.py @@ -588,7 +588,7 @@ class ExecContext(Base): raise Exception( f'Failed to create temporary file on {self.root}: {result.summary}' ) - return result.stdout_str + return result.stdout_str.strip() async def _stat(self, path: str, follow_symlinks: bool) -> StatResult: -- 2.54.0 From cd1716ff6f0e6247ce5699e42092f147112f1411 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 10 Jun 2026 11:50:19 +0200 Subject: [PATCH 4/5] lib.ExecContext._put(): Clean up temporary file _put() can leave temporary files behind if one of its shell commands fails, fix that. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/lib/ExecContext.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/python/jw/pkg/lib/ExecContext.py b/src/python/jw/pkg/lib/ExecContext.py index fd08ccd5..32abdf22 100644 --- a/src/python/jw/pkg/lib/ExecContext.py +++ b/src/python/jw/pkg/lib/ExecContext.py @@ -516,13 +516,14 @@ class ExecContext(Base): cmd: list[str] cmd_input: Input = InputMode.NonInteractive + tmp_file: str | None = None if wd is not None: path = wd + '/' + path cmds: list[RemoteCmd] = [] - stdout = (await __run(['mktemp', path + '.XXXXXX'])).stdout_str - if stdout is None: - raise Exception(f'Failed to create tmp-directory on {self.root}') - out = stdout.strip() if atomic else path + out = path + if atomic: + out = (await __run(['mktemp', path + '.XXXXXX'])).stdout_str.strip() + tmp_file = out cmds.append(RemoteCmd( cmd = ['tee', out], cmd_input = content, @@ -552,8 +553,11 @@ class ExecContext(Base): for cmd in cmds: log(DEBUG, f'{self.log_name}: Running {pretty_cmd(cmd.cmd, wd)}') ret = await __run(cmd.cmd) + tmp_file = None # Has been successfully moved at this point return ret finally: + if tmp_file is not None: + await self.erase(tmp_file) await self.close() except Exception as e: msg = f'Failed to get {path} from {self.root} ({str(e)})' -- 2.54.0 From 422f09a0b4f85030b8e6545682e558db88524cb9 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 10 Jun 2026 12:31:15 +0200 Subject: [PATCH 5/5] lib.ExecContext._put(): Fix forgotten input _put() doesn't put: An empty stdin is passed to tee, a regression introduced with 6db73873e7, fix that. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/lib/ExecContext.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/jw/pkg/lib/ExecContext.py b/src/python/jw/pkg/lib/ExecContext.py index 32abdf22..049407c5 100644 --- a/src/python/jw/pkg/lib/ExecContext.py +++ b/src/python/jw/pkg/lib/ExecContext.py @@ -552,7 +552,7 @@ class ExecContext(Base): try: for cmd in cmds: log(DEBUG, f'{self.log_name}: Running {pretty_cmd(cmd.cmd, wd)}') - ret = await __run(cmd.cmd) + ret = await __run(cmd.cmd, cmd_input = cmd.cmd_input) tmp_file = None # Has been successfully moved at this point return ret finally: -- 2.54.0