diff options
author | Simon Glass <sjg@chromium.org> | 2019-10-31 07:42:50 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2019-11-04 18:15:32 -0700 |
commit | 3b3e3c0f6c261a8c9f989d437dc261ba84467d4f (patch) | |
tree | fef28e49d1b53f29979a5a2c5ed88065bcc5fbe9 /tools/patman/command.py | |
parent | f0921f5098d8d98ac38121837aaf7c4b4cb13bb4 (diff) |
patman: Adjust 'command' to return strings instead of bytes
At present all the 'command' methods return bytes. Most of the time we
actually want strings, so change this. We still need to keep the internal
representation as bytes since otherwise unicode strings might break over
a read() boundary (e.g. 4KB), causing errors. But we can convert the end
result to strings.
Add a 'binary' parameter to cover the few cases where bytes are needed.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools/patman/command.py')
-rw-r--r-- | tools/patman/command.py | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/tools/patman/command.py b/tools/patman/command.py index 16299f3f5be..5fbd2c4a3e9 100644 --- a/tools/patman/command.py +++ b/tools/patman/command.py @@ -4,6 +4,7 @@ import os import cros_subprocess +import tools """Shell command ease-ups for Python.""" @@ -31,6 +32,13 @@ class CommandResult: self.return_code = return_code self.exception = exception + def ToOutput(self, binary): + if not binary: + self.stdout = tools.ToString(self.stdout) + self.stderr = tools.ToString(self.stderr) + self.combined = tools.ToString(self.combined) + return self + # This permits interception of RunPipe for test purposes. If it is set to # a function, then that function is called with the pipe list being @@ -41,7 +49,7 @@ test_result = None def RunPipe(pipe_list, infile=None, outfile=None, capture=False, capture_stderr=False, oneline=False, - raise_on_error=True, cwd=None, **kwargs): + raise_on_error=True, cwd=None, binary=False, **kwargs): """ Perform a command pipeline, with optional input/output filenames. @@ -67,7 +75,7 @@ def RunPipe(pipe_list, infile=None, outfile=None, else: return test_result # No result: fall through to normal processing - result = CommandResult() + result = CommandResult(b'', b'', b'') last_pipe = None pipeline = list(pipe_list) user_pipestr = '|'.join([' '.join(pipe) for pipe in pipe_list]) @@ -93,29 +101,36 @@ def RunPipe(pipe_list, infile=None, outfile=None, if raise_on_error: raise Exception("Error running '%s': %s" % (user_pipestr, str)) result.return_code = 255 - return result + return result.ToOutput(binary) if capture: result.stdout, result.stderr, result.combined = ( last_pipe.CommunicateFilter(None)) if result.stdout and oneline: - result.output = result.stdout.rstrip('\r\n') + result.output = result.stdout.rstrip(b'\r\n') result.return_code = last_pipe.wait() else: result.return_code = os.waitpid(last_pipe.pid, 0)[1] if raise_on_error and result.return_code: raise Exception("Error running '%s'" % user_pipestr) - return result + return result.ToOutput(binary) def Output(*cmd, **kwargs): kwargs['raise_on_error'] = kwargs.get('raise_on_error', True) return RunPipe([cmd], capture=True, **kwargs).stdout def OutputOneLine(*cmd, **kwargs): + """Run a command and output it as a single-line string + + The command us expected to produce a single line of output + + Returns: + String containing output of command + """ raise_on_error = kwargs.pop('raise_on_error', True) - return (RunPipe([cmd], capture=True, oneline=True, - raise_on_error=raise_on_error, - **kwargs).stdout.strip()) + result = RunPipe([cmd], capture=True, oneline=True, + raise_on_error=raise_on_error, **kwargs).stdout.strip() + return result def Run(*cmd, **kwargs): return RunPipe([cmd], **kwargs).stdout |