xref: /openbmc/u-boot/tools/patman/command.py (revision e139cb31)
1# Copyright (c) 2011 The Chromium OS Authors.
2#
3# See file CREDITS for list of people who contributed to this
4# project.
5#
6# This program is free software; you can redistribute it and/or
7# modify it under the terms of the GNU General Public License as
8# published by the Free Software Foundation; either version 2 of
9# the License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19# MA 02111-1307 USA
20#
21
22import os
23import subprocess
24
25"""Shell command ease-ups for Python."""
26
27def RunPipe(pipeline, infile=None, outfile=None,
28            capture=False, oneline=False, hide_stderr=False):
29    """
30    Perform a command pipeline, with optional input/output filenames.
31
32    hide_stderr     Don't allow output of stderr (default False)
33    """
34    last_pipe = None
35    while pipeline:
36        cmd = pipeline.pop(0)
37        kwargs = {}
38        if last_pipe is not None:
39            kwargs['stdin'] = last_pipe.stdout
40        elif infile:
41            kwargs['stdin'] = open(infile, 'rb')
42        if pipeline or capture:
43            kwargs['stdout'] = subprocess.PIPE
44        elif outfile:
45            kwargs['stdout'] = open(outfile, 'wb')
46        if hide_stderr:
47            kwargs['stderr'] = open('/dev/null', 'wb')
48
49        last_pipe = subprocess.Popen(cmd, **kwargs)
50
51    if capture:
52        ret = last_pipe.communicate()[0]
53        if not ret:
54            return None
55        elif oneline:
56            return ret.rstrip('\r\n')
57        else:
58            return ret
59    else:
60        return os.waitpid(last_pipe.pid, 0)[1] == 0
61
62def Output(*cmd):
63    return RunPipe([cmd], capture=True)
64
65def OutputOneLine(*cmd):
66    return RunPipe([cmd], capture=True, oneline=True)
67
68def Run(*cmd, **kwargs):
69    return RunPipe([cmd], **kwargs)
70
71def RunList(cmd):
72    return RunPipe([cmd], capture=True)
73