1*760c253cSXin Li# Copyright 2019 The ChromiumOS Authors 2*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be 3*760c253cSXin Li# found in the LICENSE file. 4*760c253cSXin Li 5*760c253cSXin Li"""Helpers/wrappers for the subprocess module for migration to python3.""" 6*760c253cSXin Li 7*760c253cSXin Liimport subprocess 8*760c253cSXin Li 9*760c253cSXin Li 10*760c253cSXin Lidef CheckCommand(cmd): 11*760c253cSXin Li """Executes the command using Popen().""" 12*760c253cSXin Li with subprocess.Popen( 13*760c253cSXin Li cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding="utf-8" 14*760c253cSXin Li ) as cmd_obj: 15*760c253cSXin Li stdout, _ = cmd_obj.communicate() 16*760c253cSXin Li 17*760c253cSXin Li if cmd_obj.returncode: 18*760c253cSXin Li print(stdout) 19*760c253cSXin Li raise subprocess.CalledProcessError(cmd_obj.returncode, cmd) 20*760c253cSXin Li 21*760c253cSXin Li 22*760c253cSXin Lidef check_output(cmd, cwd=None): 23*760c253cSXin Li """Wrapper for pre-python3 subprocess.check_output().""" 24*760c253cSXin Li 25*760c253cSXin Li return subprocess.check_output(cmd, encoding="utf-8", cwd=cwd) 26*760c253cSXin Li 27*760c253cSXin Li 28*760c253cSXin Lidef check_call(cmd, cwd=None): 29*760c253cSXin Li """Wrapper for pre-python3 subprocess.check_call().""" 30*760c253cSXin Li 31*760c253cSXin Li subprocess.check_call(cmd, encoding="utf-8", cwd=cwd) 32*760c253cSXin Li 33*760c253cSXin Li 34*760c253cSXin Li# FIXME: CTRL+C does not work when executing a command inside the chroot via 35*760c253cSXin Li# `cros_sdk`. 36*760c253cSXin Lidef ChrootRunCommand( 37*760c253cSXin Li chroot_path, 38*760c253cSXin Li cmd, 39*760c253cSXin Li verbose: bool = False, 40*760c253cSXin Li chroot_name: str = "chroot", 41*760c253cSXin Li out_name: str = "out", 42*760c253cSXin Li): 43*760c253cSXin Li """Runs the command inside the chroot.""" 44*760c253cSXin Li 45*760c253cSXin Li exec_chroot_cmd = [ 46*760c253cSXin Li "cros_sdk", 47*760c253cSXin Li f"--chroot={chroot_name}", 48*760c253cSXin Li f"--out-dir={out_name}", 49*760c253cSXin Li "--", 50*760c253cSXin Li ] 51*760c253cSXin Li exec_chroot_cmd.extend(cmd) 52*760c253cSXin Li 53*760c253cSXin Li return ExecCommandAndCaptureOutput( 54*760c253cSXin Li exec_chroot_cmd, cwd=chroot_path, verbose=verbose 55*760c253cSXin Li ) 56*760c253cSXin Li 57*760c253cSXin Li 58*760c253cSXin Lidef ExecCommandAndCaptureOutput(cmd, cwd=None, verbose=False): 59*760c253cSXin Li """Executes the command and prints to stdout if possible.""" 60*760c253cSXin Li 61*760c253cSXin Li out = check_output(cmd, cwd=cwd).rstrip() 62*760c253cSXin Li 63*760c253cSXin Li if verbose and out: 64*760c253cSXin Li print(out) 65*760c253cSXin Li 66*760c253cSXin Li return out 67