test: xkeyboard-config: handle keyboard interrupts correctly

In python multiprocessing, each process needs to handle (and ignore) the
KeyboardInterrupt to avoid exception logging. This is a separate patch for
easier reviewing, the first hunks merely re-indent all of the
xkbcommontool/xkbcomp functions into a try/except KeyboardInterrupt block.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
master
Peter Hutterer 2019-10-30 11:22:49 +10:00 committed by Ran Benita
parent 9fc0cb8777
commit cd5a24aa38
1 changed files with 80 additions and 71 deletions

View File

@ -30,86 +30,92 @@ if os.isatty(sys.stdout.fileno()):
def xkbcommontool(rmlvo):
r = rmlvo.get('r', 'evdev')
m = rmlvo.get('m', 'pc105')
l = rmlvo.get('l', 'us')
v = rmlvo.get('v', None)
o = rmlvo.get('o', None)
args = [
'rmlvo-to-keymap',
'--rules', r,
'--model', m,
'--layout', l,
]
if v is not None:
args += ['--variant', v]
if o is not None:
args += ['--options', o]
success = True
out = io.StringIO()
if verbose:
print(':: {}'.format(' '.join(args)), file=out)
try:
output = subprocess.check_output(args, stderr=subprocess.STDOUT)
if verbose:
print(output.decode('utf-8'), file=out)
except subprocess.CalledProcessError as err:
print('ERROR: Failed to compile: {}'.format(' '.join(args)), file=out)
print(err.output.decode('utf-8'), file=out)
success = False
r = rmlvo.get('r', 'evdev')
m = rmlvo.get('m', 'pc105')
l = rmlvo.get('l', 'us')
v = rmlvo.get('v', None)
o = rmlvo.get('o', None)
args = [
'rmlvo-to-keymap',
'--rules', r,
'--model', m,
'--layout', l,
]
if v is not None:
args += ['--variant', v]
if o is not None:
args += ['--options', o]
return success, out.getvalue()
success = True
out = io.StringIO()
if verbose:
print(':: {}'.format(' '.join(args)), file=out)
try:
output = subprocess.check_output(args, stderr=subprocess.STDOUT)
if verbose:
print(output.decode('utf-8'), file=out)
except subprocess.CalledProcessError as err:
print('ERROR: Failed to compile: {}'.format(' '.join(args)), file=out)
print(err.output.decode('utf-8'), file=out)
success = False
return success, out.getvalue()
except KeyboardInterrupt:
pass
def xkbcomp(rmlvo):
r = rmlvo.get('r', 'evdev')
m = rmlvo.get('m', 'pc105')
l = rmlvo.get('l', 'us')
v = rmlvo.get('v', None)
o = rmlvo.get('o', None)
args = ['setxkbmap', '-print']
if r is not None:
args.append('-rules')
args.append('{}'.format(r))
if m is not None:
args.append('-model')
args.append('{}'.format(m))
if l is not None:
args.append('-layout')
args.append('{}'.format(l))
if o is not None:
args.append('-option')
args.append('{}'.format(o))
success = True
out = io.StringIO()
if verbose:
print(':: {}'.format(' '.join(args)), file=out)
try:
xkbcomp_args = ['xkbcomp', '-xkb', '-', '-']
r = rmlvo.get('r', 'evdev')
m = rmlvo.get('m', 'pc105')
l = rmlvo.get('l', 'us')
v = rmlvo.get('v', None)
o = rmlvo.get('o', None)
args = ['setxkbmap', '-print']
if r is not None:
args.append('-rules')
args.append('{}'.format(r))
if m is not None:
args.append('-model')
args.append('{}'.format(m))
if l is not None:
args.append('-layout')
args.append('{}'.format(l))
if o is not None:
args.append('-option')
args.append('{}'.format(o))
setxkbmap = subprocess.Popen(args, stdout=subprocess.PIPE)
xkbcomp = subprocess.Popen(xkbcomp_args, stdin=setxkbmap.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
setxkbmap.stdout.close()
stdout, stderr = xkbcomp.communicate()
if xkbcomp.returncode != 0:
success = True
out = io.StringIO()
if verbose:
print(':: {}'.format(' '.join(args)), file=out)
try:
xkbcomp_args = ['xkbcomp', '-xkb', '-', '-']
setxkbmap = subprocess.Popen(args, stdout=subprocess.PIPE)
xkbcomp = subprocess.Popen(xkbcomp_args, stdin=setxkbmap.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
setxkbmap.stdout.close()
stdout, stderr = xkbcomp.communicate()
if xkbcomp.returncode != 0:
print('ERROR: Failed to compile: {}'.format(' '.join(args)), file=out)
success = False
if xkbcomp.returncode != 0 or verbose:
print(stdout.decode('utf-8'), file=out)
print(stderr.decode('utf-8'), file=out)
# This catches setxkbmap errors.
except subprocess.CalledProcessError as err:
print('ERROR: Failed to compile: {}'.format(' '.join(args)), file=out)
print(err.output.decode('utf-8'), file=out)
success = False
if xkbcomp.returncode != 0 or verbose:
print(stdout.decode('utf-8'), file=out)
print(stderr.decode('utf-8'), file=out)
# This catches setxkbmap errors.
except subprocess.CalledProcessError as err:
print('ERROR: Failed to compile: {}'.format(' '.join(args)), file=out)
print(err.output.decode('utf-8'), file=out)
success = False
return success, out.getvalue()
return success, out.getvalue()
except KeyboardInterrupt:
pass
def parse(path):
@ -180,4 +186,7 @@ def main(args):
if __name__ == '__main__':
main(sys.argv)
try:
main(sys.argv)
except KeyboardInterrupt:
print('Exiting after Ctrl+C')