ExecContext: Fix output handling #9

Merged
Jan Lindemann merged 5 commits from jan/fix/20260610-lib-execcontext-put-fix-forgotten-input into master 2026-06-10 13:08:29 +02:00 AGit
3 changed files with 18 additions and 9 deletions

View file

@ -78,7 +78,7 @@ class Distro(abc.ABC):
), ),
) )
raise raise
uname = result.stdout_str.lower() uname = result.stdout_str.strip().lower()
ret = f'ID={uname}\nVERSION_CODENAME=unknown' ret = f'ID={uname}\nVERSION_CODENAME=unknown'
return ret return ret

View file

@ -516,13 +516,14 @@ class ExecContext(Base):
cmd: list[str] cmd: list[str]
cmd_input: Input = InputMode.NonInteractive cmd_input: Input = InputMode.NonInteractive
tmp_file: str | None = None
if wd is not None: if wd is not None:
path = wd + '/' + path path = wd + '/' + path
cmds: list[RemoteCmd] = [] cmds: list[RemoteCmd] = []
stdout = (await __run(['mktemp', path + '.XXXXXX'])).stdout_str out = path
if stdout is None: if atomic:
raise Exception(f'Failed to create tmp-directory on {self.root}') out = (await __run(['mktemp', path + '.XXXXXX'])).stdout_str.strip()
out = stdout.strip() if atomic else path tmp_file = out
cmds.append(RemoteCmd( cmds.append(RemoteCmd(
cmd = ['tee', out], cmd = ['tee', out],
cmd_input = content, cmd_input = content,
@ -551,9 +552,12 @@ class ExecContext(Base):
try: try:
for cmd in cmds: for cmd in cmds:
log(DEBUG, f'{self.log_name}: Running {pretty_cmd(cmd.cmd, wd)}') 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 return ret
finally: finally:
if tmp_file is not None:
await self.erase(tmp_file)
await self.close() await self.close()
except Exception as e: except Exception as e:
msg = f'Failed to get {path} from {self.root} ({str(e)})' msg = f'Failed to get {path} from {self.root} ({str(e)})'
@ -588,7 +592,7 @@ class ExecContext(Base):
raise Exception( raise Exception(
f'Failed to create temporary file on {self.root}: {result.summary}' 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: async def _stat(self, path: str, follow_symlinks: bool) -> StatResult:

View file

@ -44,9 +44,14 @@ class Result:
if self.__stdout is None: if self.__stdout is None:
ret = '' ret = ''
else: 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: if quote:
ret = '"{ret}"' ret = f'"{ret}"'
return ret return ret
def __repr__(self) -> str: def __repr__(self) -> str: