diff options
author | Simon Glass <sjg@chromium.org> | 2012-12-15 14:42:04 +0400 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2013-04-05 01:04:33 +0400 |
commit | a10fd93cbc2ddf1da1f8b6d915f4bc3276ff7731 (patch) | |
tree | 738c8809d2a150bd507a8c0b0b27474e854042ee /tools | |
parent | 71162e3cae29832192497d4a1b966336b638df01 (diff) | |
download | u-boot-a10fd93cbc2ddf1da1f8b6d915f4bc3276ff7731.tar.xz |
patman: Make command methods return a CommandResult
Rather than returning a list of things, return an object. That makes it
easier to access the returned items, and easier to extend the return
value later.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/patman/command.py | 84 | ||||
-rw-r--r-- | tools/patman/gitutil.py | 2 | ||||
-rw-r--r-- | tools/patman/patchstream.py | 2 |
3 files changed, 64 insertions, 24 deletions
diff --git a/tools/patman/command.py b/tools/patman/command.py index 4b00250c02..fc085f256d 100644 --- a/tools/patman/command.py +++ b/tools/patman/command.py @@ -20,53 +20,93 @@ # import os -import subprocess +import cros_subprocess """Shell command ease-ups for Python.""" -def RunPipe(pipeline, infile=None, outfile=None, - capture=False, oneline=False, hide_stderr=False): +class CommandResult: + """A class which captures the result of executing a command. + + Members: + stdout: stdout obtained from command, as a string + stderr: stderr obtained from command, as a string + return_code: Return code from command + exception: Exception received, or None if all ok + """ + def __init__(self): + self.stdout = None + self.stderr = None + self.return_code = None + self.exception = None + + +def RunPipe(pipe_list, infile=None, outfile=None, + capture=False, capture_stderr=False, oneline=False, + cwd=None, **kwargs): """ Perform a command pipeline, with optional input/output filenames. - hide_stderr Don't allow output of stderr (default False) + Args: + pipe_list: List of command lines to execute. Each command line is + piped into the next, and is itself a list of strings. For + example [ ['ls', '.git'] ['wc'] ] will pipe the output of + 'ls .git' into 'wc'. + infile: File to provide stdin to the pipeline + outfile: File to store stdout + capture: True to capture output + capture_stderr: True to capture stderr + oneline: True to strip newline chars from output + kwargs: Additional keyword arguments to cros_subprocess.Popen() + Returns: + CommandResult object """ + result = CommandResult() last_pipe = None + pipeline = list(pipe_list) while pipeline: cmd = pipeline.pop(0) - kwargs = {} if last_pipe is not None: kwargs['stdin'] = last_pipe.stdout elif infile: kwargs['stdin'] = open(infile, 'rb') if pipeline or capture: - kwargs['stdout'] = subprocess.PIPE + kwargs['stdout'] = cros_subprocess.PIPE elif outfile: kwargs['stdout'] = open(outfile, 'wb') - if hide_stderr: - kwargs['stderr'] = open('/dev/null', 'wb') + if capture_stderr: + kwargs['stderr'] = cros_subprocess.PIPE - last_pipe = subprocess.Popen(cmd, **kwargs) + try: + last_pipe = cros_subprocess.Popen(cmd, cwd=cwd, **kwargs) + except Exception, err: + result.exception = err + print 'exception', pipe_list, err + raise Exception("Error running '%s': %s" % (pipe_list, str)) if capture: - ret = last_pipe.communicate()[0] - if not ret: - return None - elif oneline: - return ret.rstrip('\r\n') - else: - return ret + result.stdout, result.stderr, result.combined = ( + last_pipe.CommunicateFilter(None)) + if result.stdout and oneline: + result.output = result.stdout.rstrip('\r\n') + result.return_code = last_pipe.wait() else: - return os.waitpid(last_pipe.pid, 0)[1] == 0 + result.return_code = os.waitpid(last_pipe.pid, 0)[1] + if result.return_code: + raise Exception("Error running '%s'" % pipe_list) + return result def Output(*cmd): - return RunPipe([cmd], capture=True) + return RunPipe([cmd], capture=True).stdout -def OutputOneLine(*cmd): - return RunPipe([cmd], capture=True, oneline=True) +def OutputOneLine(*cmd, **kwargs): + return (RunPipe([cmd], capture=True, oneline=True, + **kwargs).stdout.strip()) def Run(*cmd, **kwargs): - return RunPipe([cmd], **kwargs) + return RunPipe([cmd], **kwargs).stdout def RunList(cmd): - return RunPipe([cmd], capture=True) + return RunPipe([cmd], capture=True).stdout + +def StopAll(): + cros_subprocess.stay_alive = False diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py index ca3ba4a03e..77907c15c8 100644 --- a/tools/patman/gitutil.py +++ b/tools/patman/gitutil.py @@ -40,7 +40,7 @@ def CountCommitsToBranch(): """ pipe = [['git', 'log', '--no-color', '--oneline', '@{upstream}..'], ['wc', '-l']] - stdout = command.RunPipe(pipe, capture=True, oneline=True) + stdout = command.RunPipe(pipe, capture=True, oneline=True).stdout patch_count = int(stdout) return patch_count diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index f7ee75a25f..1e4a36f1dd 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -346,7 +346,7 @@ def GetMetaData(start, count): """ pipe = [['git', 'log', '--no-color', '--reverse', 'HEAD~%d' % start, '-n%d' % count]] - stdout = command.RunPipe(pipe, capture=True) + stdout = command.RunPipe(pipe, capture=True).stdout series = Series() ps = PatchStream(series, is_log=True) for line in stdout.splitlines(): |