Move run_command_interruptible() to utils

Make this function more easily reusable from the RRS code.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
This commit is contained in:
Paul Eggleton 2018-03-23 01:27:16 +13:00
parent 50aab7c03a
commit 59b66d5505
2 changed files with 33 additions and 33 deletions

View File

@ -14,7 +14,6 @@ import optparse
import codecs
import logging
import subprocess
import signal
from datetime import datetime, timedelta
from distutils.version import LooseVersion
import utils
@ -35,36 +34,6 @@ except ImportError:
sys.exit(1)
def reenable_sigint():
signal.signal(signal.SIGINT, signal.SIG_DFL)
def run_command_interruptible(cmd):
"""
Run a command with output displayed on the console, but ensure any Ctrl+C is
processed only by the child process.
"""
signal.signal(signal.SIGINT, signal.SIG_IGN)
try:
process = subprocess.Popen(
cmd, cwd=os.path.dirname(sys.argv[0]), shell=True, preexec_fn=reenable_sigint, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
)
reader = codecs.getreader('utf-8')(process.stdout, errors='surrogateescape')
buf = ''
while True:
out = reader.read(1, 1)
if out:
sys.stdout.write(out)
sys.stdout.flush()
buf += out
elif out == '' and process.poll() != None:
break
finally:
signal.signal(signal.SIGINT, signal.SIG_DFL)
return process.returncode, buf
def prepare_update_layer_command(options, branch, layer, initial=False):
"""Prepare the update_layer.py command line"""
if branch.update_environment:
@ -417,7 +386,7 @@ def main():
cmd = prepare_update_layer_command(options, branchobj, layer, initial=True)
logger.debug('Running layer update command: %s' % cmd)
ret, output = run_command_interruptible(cmd)
ret, output = utils.run_command_interruptible(cmd)
logger.debug('output: %s' % output)
if ret == 254:
# Interrupted by user, break out of loop
@ -491,7 +460,7 @@ def main():
cmd = prepare_update_layer_command(options, branchobj, layer)
logger.debug('Running layer update command: %s' % cmd)
layerupdate.started = datetime.now()
ret, output = run_command_interruptible(cmd)
ret, output = utils.run_command_interruptible(cmd)
layerupdate.finished = datetime.now()
# We need to get layerbranch here because it might not have existed until

View File

@ -12,6 +12,8 @@ import subprocess
import logging
import time
import fcntl
import signal
import codecs
def get_branch(branchname):
from layerindex.models import Branch
@ -353,3 +355,32 @@ def setup_core_layer_sys_path(settings, branchname):
core_repodir = os.path.join(settings.LAYER_FETCH_DIR, core_urldir)
core_layerdir = os.path.join(core_repodir, core_layerbranch.vcs_subdir)
sys.path.insert(0, os.path.join(core_layerdir, 'lib'))
def run_command_interruptible(cmd):
"""
Run a command with output displayed on the console, but ensure any Ctrl+C is
processed only by the child process.
"""
def reenable_sigint():
signal.signal(signal.SIGINT, signal.SIG_DFL)
signal.signal(signal.SIGINT, signal.SIG_IGN)
try:
process = subprocess.Popen(
cmd, cwd=os.path.dirname(sys.argv[0]), shell=True, preexec_fn=reenable_sigint, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
)
reader = codecs.getreader('utf-8')(process.stdout, errors='surrogateescape')
buf = ''
while True:
out = reader.read(1, 1)
if out:
sys.stdout.write(out)
sys.stdout.flush()
buf += out
elif out == '' and process.poll() != None:
break
finally:
signal.signal(signal.SIGINT, signal.SIG_DFL)
return process.returncode, buf