|
12 | 12 | import re
|
13 | 13 | import shlex
|
14 | 14 | import shutil
|
| 15 | +import signal |
15 | 16 | import subprocess
|
16 | 17 | import sys
|
17 | 18 | import tempfile
|
18 | 19 | import textwrap
|
19 | 20 | from pathlib import Path
|
| 21 | +from types import FrameType |
| 22 | +from typing import Optional |
20 | 23 |
|
21 | 24 | EMERGENCY_EXIT_DROPIN = """\
|
22 | 25 | [Unit]
|
@@ -359,7 +362,23 @@ def statfs(path: Path) -> str:
|
359 | 362 | ).stdout.strip()
|
360 | 363 |
|
361 | 364 |
|
| 365 | +INTERRUPTED = False |
| 366 | + |
| 367 | + |
| 368 | +def onsignal(signal: int, frame: Optional[FrameType]) -> None: |
| 369 | + global INTERRUPTED |
| 370 | + if INTERRUPTED: |
| 371 | + return |
| 372 | + |
| 373 | + INTERRUPTED = True |
| 374 | + raise KeyboardInterrupt() |
| 375 | + |
| 376 | + |
362 | 377 | def main() -> None:
|
| 378 | + signal.signal(signal.SIGINT, onsignal) |
| 379 | + signal.signal(signal.SIGTERM, onsignal) |
| 380 | + signal.signal(signal.SIGHUP, onsignal) |
| 381 | + |
363 | 382 | parser = argparse.ArgumentParser(description=__doc__)
|
364 | 383 | parser.add_argument('--mkosi', default=None)
|
365 | 384 | parser.add_argument('--meson-source-dir', required=True, type=Path)
|
@@ -592,19 +611,22 @@ def main() -> None:
|
592 | 611 | 'vm' if args.vm or os.getuid() != 0 or os.getenv('TEST_PREFER_QEMU', '0') == '1' else 'boot',
|
593 | 612 | ] # fmt: skip
|
594 | 613 |
|
595 |
| - result = subprocess.run(cmd) |
596 |
| - |
597 |
| - # On Debian/Ubuntu we get a lot of random QEMU crashes. Retry once, and then skip if it fails again. |
598 |
| - if args.vm and result.returncode == 247 and args.exit_code != 247: |
599 |
| - if journal_file: |
600 |
| - journal_file.unlink(missing_ok=True) |
| 614 | + try: |
601 | 615 | result = subprocess.run(cmd)
|
| 616 | + |
| 617 | + # On Debian/Ubuntu we get a lot of random QEMU crashes. Retry once, and then skip if it fails again. |
602 | 618 | if args.vm and result.returncode == 247 and args.exit_code != 247:
|
603 |
| - print( |
604 |
| - f'Test {args.name} failed due to QEMU crash (error 247), ignoring', |
605 |
| - file=sys.stderr, |
606 |
| - ) |
607 |
| - exit(77) |
| 619 | + if journal_file: |
| 620 | + journal_file.unlink(missing_ok=True) |
| 621 | + result = subprocess.run(cmd) |
| 622 | + if args.vm and result.returncode == 247 and args.exit_code != 247: |
| 623 | + print( |
| 624 | + f'Test {args.name} failed due to QEMU crash (error 247), ignoring', |
| 625 | + file=sys.stderr, |
| 626 | + ) |
| 627 | + exit(77) |
| 628 | + except KeyboardInterrupt: |
| 629 | + result = subprocess.CompletedProcess(args=cmd, returncode=-signal.SIGINT) |
608 | 630 |
|
609 | 631 | coredumps = process_coredumps(args, journal_file)
|
610 | 632 |
|
|
0 commit comments