Skip to content

Commit dac63c8

Browse files
committed
Run all subcommands in build-script.py using check_call
This guarantees that we fail execution of build-script.py if a subcommand fails.
1 parent 375c7f3 commit dac63c8

File tree

1 file changed

+61
-57
lines changed

1 file changed

+61
-57
lines changed

build-script.py

Lines changed: 61 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@
4444
}
4545

4646

47+
def fail_for_called_process_error(
48+
succinct_description: str,
49+
error: subprocess.CalledProcessError
50+
):
51+
printerr(f"FAIL: {succinct_description}")
52+
printerr(f"Executing: {escapeCmd(error.cmd)}")
53+
printerr(error.output)
54+
raise SystemExit(1)
55+
56+
4757
# -----------------------------------------------------------------------------
4858
# Xcode Projects Generation
4959

@@ -72,7 +82,7 @@ def note(message: str):
7282

7383
def fatal_error(message: str):
7484
printerr(message)
75-
sys.exit(1)
85+
raise SystemExit(1)
7686

7787

7888
def escapeCmdArg(arg: str) -> str:
@@ -82,10 +92,14 @@ def escapeCmdArg(arg: str) -> str:
8292
return arg
8393

8494

95+
def escapeCmd(cmd: List[str]) -> str:
96+
return " ".join([escapeCmdArg(arg) for arg in cmd])
97+
98+
8599
def call(cmd: List[str], env: Dict[str, str] = dict(os.environ), stdout=None,
86100
stderr=subprocess.STDOUT, verbose: bool = False):
87101
if verbose:
88-
print(" ".join([escapeCmdArg(arg) for arg in cmd]))
102+
print(escapeCmd(cmd))
89103
process = subprocess.Popen(cmd, env=env, stdout=stdout, stderr=stderr)
90104
process.wait()
91105

@@ -95,7 +109,7 @@ def call(cmd: List[str], env: Dict[str, str] = dict(os.environ), stdout=None,
95109
def check_call(cmd: List[str], cwd: Optional[str] = None,
96110
env: Dict[str, str] = dict(os.environ), verbose: bool = False):
97111
if verbose:
98-
print(" ".join([escapeCmdArg(arg) for arg in cmd]))
112+
print(escapeCmd(cmd))
99113
subprocess.check_call(cmd, cwd=cwd, env=env, stderr=subprocess.STDOUT)
100114

101115

@@ -317,7 +331,7 @@ def generate_gyb_files(
317331
def run_code_generation(
318332
toolchain: str, build_dir: Optional[str], multiroot_data_file: Optional[str],
319333
release: bool, verbose: bool, swiftsyntaxbuilder_destination: str
320-
) -> bool:
334+
):
321335
print("** Running code generation **")
322336
swiftpm_call = get_swiftpm_invocation(
323337
toolchain=toolchain,
@@ -340,7 +354,7 @@ def run_code_generation(
340354
env["SWIFTCI_USE_LOCAL_DEPS"] = "1"
341355
env["SWIFT_SYNTAX_PARSER_LIB_SEARCH_PATH"] = \
342356
os.path.join(toolchain, "lib", "swift", "macosx")
343-
return check_call(swiftpm_call, env=env, verbose=verbose) == 0
357+
check_call(swiftpm_call, env=env, verbose=verbose)
344358

345359

346360
def make_dir_if_needed(path):
@@ -493,14 +507,20 @@ def verify_code_generated_files(
493507

494508
self_swiftsyntaxbuilder_generated_dir = tempfile.mkdtemp()
495509

496-
run_code_generation(
497-
toolchain=toolchain,
498-
build_dir=realpath(build_dir),
499-
multiroot_data_file=multiroot_data_file,
500-
release=release,
501-
verbose=verbose,
502-
swiftsyntaxbuilder_destination=self_swiftsyntaxbuilder_generated_dir
503-
)
510+
try:
511+
run_code_generation(
512+
toolchain=toolchain,
513+
build_dir=realpath(build_dir),
514+
multiroot_data_file=multiroot_data_file,
515+
release=release,
516+
verbose=verbose,
517+
swiftsyntaxbuilder_destination=self_swiftsyntaxbuilder_generated_dir
518+
)
519+
except subprocess.CalledProcessError as e:
520+
fail_for_called_process_error(
521+
"Source generation using SwiftSyntaxBuilder failed",
522+
e
523+
)
504524

505525
print("** Verifing code generated files **")
506526

@@ -542,34 +562,25 @@ def verify_c_syntax_nodes_match():
542562
def run_tests(
543563
toolchain: str, build_dir: Optional[str], multiroot_data_file: Optional[str],
544564
release: bool, filecheck_exec: Optional[str], skip_lit_tests: bool, verbose: bool
545-
) -> bool:
565+
):
546566
print("** Running SwiftSyntax Tests **")
547567

548-
if skip_lit_tests:
549-
lit_success = True
550-
else:
551-
lit_success = run_lit_tests(
568+
if not skip_lit_tests:
569+
run_lit_tests(
552570
toolchain=toolchain,
553571
build_dir=build_dir,
554572
release=release,
555573
filecheck_exec=filecheck_exec,
556574
verbose=verbose,
557575
)
558-
if not lit_success:
559-
return False
560576

561-
xctest_success = run_xctests(
577+
run_xctests(
562578
toolchain=toolchain,
563579
build_dir=build_dir,
564580
multiroot_data_file=multiroot_data_file,
565581
release=release,
566582
verbose=verbose,
567583
)
568-
if not xctest_success:
569-
return False
570-
571-
return True
572-
573584

574585
# -----------------------------------------------------------------------------
575586
# Lit Tests
@@ -602,7 +613,9 @@ def check_incr_transfer_roundtrip_exec():
602613
)
603614

604615

605-
def find_lit_test_helper_exec(toolchain: str, build_dir: Optional[str], release: bool):
616+
def find_lit_test_helper_exec(
617+
toolchain: str, build_dir: Optional[str], release: bool
618+
) -> str:
606619
swiftpm_call = get_swiftpm_invocation(
607620
toolchain=toolchain,
608621
action="build",
@@ -644,7 +657,7 @@ def run_lit_tests(toolchain: str, build_dir: Optional[str], release: bool,
644657
# Don't show all commands if verbose is not enabled
645658
if not verbose:
646659
lit_call.extend(["--succinct"])
647-
return call(lit_call, verbose=verbose) == 0
660+
check_call(lit_call, verbose=verbose)
648661

649662

650663
# -----------------------------------------------------------------------------
@@ -673,7 +686,7 @@ def run_xctests(toolchain: str, build_dir: Optional[str],
673686
env["SWIFTCI_USE_LOCAL_DEPS"] = "1"
674687
env["SWIFT_SYNTAX_PARSER_LIB_SEARCH_PATH"] = \
675688
os.path.join(toolchain, "lib", "swift", "macosx")
676-
return call(swiftpm_call, env=env, verbose=verbose) == 0
689+
check_call(swiftpm_call, env=env, verbose=verbose)
677690

678691
# -----------------------------------------------------------------------------
679692
# Arugment Parsing functions
@@ -691,21 +704,22 @@ def generate_source_code_command(args):
691704
add_source_locations=args.add_source_locations,
692705
)
693706
except subprocess.CalledProcessError as e:
694-
printerr("FAIL: Generating .gyb files failed")
695-
printerr("Executing: %s" % " ".join(e.cmd))
696-
printerr(e.output)
697-
raise SystemExit(1)
707+
fail_for_called_process_error("Generating .gyb files failed", e)
698708

699-
if not args.gyb_only:
700-
destination = os.path.join(SWIFTSYNTAXBUILDER_DIR, "generated")
701-
run_code_generation(
702-
toolchain=args.toolchain,
703-
build_dir=realpath(args.build_dir),
704-
multiroot_data_file=args.multiroot_data_file,
705-
release=args.release,
706-
verbose=args.verbose,
707-
swiftsyntaxbuilder_destination=destination
708-
)
709+
try:
710+
if not args.gyb_only:
711+
destination = os.path.join(SWIFTSYNTAXBUILDER_DIR, "generated")
712+
run_code_generation(
713+
toolchain=args.toolchain,
714+
build_dir=realpath(args.build_dir),
715+
multiroot_data_file=args.multiroot_data_file,
716+
release=args.release,
717+
verbose=args.verbose,
718+
swiftsyntaxbuilder_destination=destination
719+
)
720+
except subprocess.CalledProcessError as e:
721+
fail_for_called_process_error(
722+
"Source generation using SwiftSyntaxBuilder failed", e)
709723

710724

711725
def verify_source_code_command(args):
@@ -750,9 +764,7 @@ def build_command(args):
750764
builder.build("SwiftSyntaxBuilder")
751765
builder.build("SwiftSyntaxBuilderGeneration")
752766
except subprocess.CalledProcessError as e:
753-
printerr("FAIL: Building SwiftSyntax failed")
754-
printerr("Executing: %s" % " ".join(e.cmd))
755-
printerr(e.output)
767+
fail_for_called_process_error("Building SwiftSyntax failed", e)
756768

757769

758770
def test_command(args):
@@ -768,7 +780,7 @@ def test_command(args):
768780

769781
builder.build("lit-test-helper")
770782

771-
success = run_tests(
783+
run_tests(
772784
toolchain=args.toolchain,
773785
build_dir=realpath(args.build_dir),
774786
multiroot_data_file=args.multiroot_data_file,
@@ -777,17 +789,9 @@ def test_command(args):
777789
skip_lit_tests=args.skip_lit_tests,
778790
verbose=args.verbose,
779791
)
780-
if not success:
781-
# An error message has already been printed by the failing test
782-
# suite
783-
sys.exit(1)
784-
else:
785-
print("** All tests passed **")
792+
print("** All tests passed **")
786793
except subprocess.CalledProcessError as e:
787-
printerr("FAIL: Running tests failed")
788-
printerr("Executing: %s" % " ".join(e.cmd))
789-
printerr(e.output)
790-
sys.exit(1)
794+
fail_for_called_process_error("Running tests failed", e)
791795

792796

793797
# -----------------------------------------------------------------------------

0 commit comments

Comments
 (0)