From patchwork Sat Dec 15 20:42:04 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 206639 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id EF5272C008E for ; Sun, 16 Dec 2012 07:43:09 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 290D94A114; Sat, 15 Dec 2012 21:43:08 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id RLQr6yWf16ZE; Sat, 15 Dec 2012 21:43:07 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 6C6C34A115; Sat, 15 Dec 2012 21:42:49 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id D80544A0FC for ; Sat, 15 Dec 2012 21:42:45 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id m62Dq2S3r+ak for ; Sat, 15 Dec 2012 21:42:43 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-qc0-f202.google.com (mail-qc0-f202.google.com [209.85.216.202]) by theia.denx.de (Postfix) with ESMTPS id 15C8C4A101 for ; Sat, 15 Dec 2012 21:42:37 +0100 (CET) Received: by mail-qc0-f202.google.com with SMTP id s25so476318qcq.3 for ; Sat, 15 Dec 2012 12:42:37 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=cbaOtNFVnw9qRgNdmdM0jbeP/XwVt2I6vN+1ITaosTM=; b=iyuOxcB5toMYi/Gt9NwuN2rrnYq6p56g77aZIjAPngYf2twOc+tb6iQ1jgw98OGEOR hpTVEgrDXx/c89adpL16XZkxGmlFBaAs8Iu9H3pa+hdC/ISwED8uwcccBSn+ntrFspys DxgyIjVIm7Vc+vDC00D4VRU0eO27yFzYcwi2O9W1CX6XrpSQc/lkrItfbD055igGBIrT +EX5K+q4E0Mqq/6VMD9UCklA/KYkKlcBFhkISk/j50f2gJMUaRINjLyQuhwwR7bdqizC A/NFep8hm2hUj5SNic2aVc6D4HxJtG8vjIpP8pLl5DEkt3k30A1BHVLE7laVoYH3xtep +41g== Received: by 10.236.102.231 with SMTP id d67mr4520366yhg.6.1355604156903; Sat, 15 Dec 2012 12:42:36 -0800 (PST) Received: from wpzn3.hot.corp.google.com (216-239-44-65.google.com [216.239.44.65]) by gmr-mx.google.com with ESMTPS id i27si758910yhe.4.2012.12.15.12.42.36 (version=TLSv1/SSLv3 cipher=AES128-SHA); Sat, 15 Dec 2012 12:42:36 -0800 (PST) Received: from kaka.mtv.corp.google.com (kaka.mtv.corp.google.com [172.22.73.79]) by wpzn3.hot.corp.google.com (Postfix) with ESMTP id 7B76C100047; Sat, 15 Dec 2012 12:42:36 -0800 (PST) Received: by kaka.mtv.corp.google.com (Postfix, from userid 121222) id 2A292160A3F; Sat, 15 Dec 2012 12:42:36 -0800 (PST) From: Simon Glass To: U-Boot Mailing List Date: Sat, 15 Dec 2012 12:42:04 -0800 Message-Id: <1355604128-12938-4-git-send-email-sjg@chromium.org> X-Mailer: git-send-email 1.7.7.3 In-Reply-To: <1355604128-12938-1-git-send-email-sjg@chromium.org> References: <1355604128-12938-1-git-send-email-sjg@chromium.org> X-Gm-Message-State: ALoCoQnssEsg10pw6eek/oZgPWcKT9NMtpWxERrCsKAUXQq7pS0eRUbM7R0q3CmnwlStsWmxoE65PLBD9A71ueY3X5FcLFUeAl9979OClcqQZLjpTsDCF1qDq7iBG1vPJkOCkTqF3QP21daEfj9qItYP+fagVIppBFD8DPICtJXmjXdMVnF/Kb2vYWLQh0oK6KbY4eTb/it3 Cc: Tom Rini Subject: [U-Boot] [PATCH v2 4/8] patman: Make command methods return a CommandResult X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de 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 --- Changes in v2: None tools/patman/command.py | 84 +++++++++++++++++++++++++++++++----------- tools/patman/gitutil.py | 2 +- 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 4b00250..fc085f2 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 72d37a0..e682e86 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 f7ee75a..1e4a36f 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():