From cd5a24aa38894f5e38f265a6ea121e3aa7b67d1a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 30 Oct 2019 11:22:49 +1000 Subject: [PATCH] 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 --- test/xkeyboard-config-test.py.in | 151 ++++++++++++++++--------------- 1 file changed, 80 insertions(+), 71 deletions(-) diff --git a/test/xkeyboard-config-test.py.in b/test/xkeyboard-config-test.py.in index d4c2ccf..c271f5a 100755 --- a/test/xkeyboard-config-test.py.in +++ b/test/xkeyboard-config-test.py.in @@ -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')