From cd34808a148804dd03fadae24587f08ae92d5b0d Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Thu, 10 Oct 2019 18:53:10 -0400 Subject: [PATCH] Fixes missing error exit code when a bogus input file is specified Fixes #33849. --- src/compiler/tsbuild.ts | 22 ++++++++-------------- src/testRunner/unittests/tsbuild/demo.ts | 20 ++++++++++++++++++-- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index aa379c0004d..1924be4df89 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -1788,31 +1788,25 @@ namespace ts { let reportQueue = true; let successfulProjects = 0; - let errorProjects = 0; while (true) { const invalidatedProject = getNextInvalidatedProject(state, buildOrder, reportQueue); if (!invalidatedProject) break; reportQueue = false; invalidatedProject.done(cancellationToken); - if (state.diagnostics.has(invalidatedProject.projectPath)) { - errorProjects++; - } - else { - successfulProjects++; - } + if (!state.diagnostics.has(invalidatedProject.projectPath)) successfulProjects++; } disableCache(state); reportErrorSummary(state, buildOrder); startWatching(state, buildOrder); - return isCircularBuildOrder(buildOrder) ? - ExitStatus.ProjectReferenceCycle_OutputsSkipped : - errorProjects ? - successfulProjects ? - ExitStatus.DiagnosticsPresent_OutputsGenerated : - ExitStatus.DiagnosticsPresent_OutputsSkipped : - ExitStatus.Success; + return isCircularBuildOrder(buildOrder) + ? ExitStatus.ProjectReferenceCycle_OutputsSkipped + : !buildOrder.some(p => state.diagnostics.has(toResolvedConfigFilePath(state, p))) + ? ExitStatus.Success + : successfulProjects + ? ExitStatus.DiagnosticsPresent_OutputsGenerated + : ExitStatus.DiagnosticsPresent_OutputsSkipped; } function clean(state: SolutionBuilderState, project?: string, onlyReferences?: boolean) { diff --git a/src/testRunner/unittests/tsbuild/demo.ts b/src/testRunner/unittests/tsbuild/demo.ts index c6055549485..3b1d6d548cf 100644 --- a/src/testRunner/unittests/tsbuild/demo.ts +++ b/src/testRunner/unittests/tsbuild/demo.ts @@ -39,17 +39,19 @@ namespace ts { interface VerifyBuild { modifyDiskLayout: (fs: vfs.FileSystem) => void; + tsconfigs?: readonly string[]; expectedExitStatus: ExitStatus; expectedDiagnostics: (fs: vfs.FileSystem) => fakes.ExpectedDiagnostic[]; expectedOutputs: readonly string[]; notExpectedOutputs: readonly string[]; } - function verifyBuild({ modifyDiskLayout, expectedExitStatus, expectedDiagnostics, expectedOutputs, notExpectedOutputs }: VerifyBuild) { + function verifyBuild({ modifyDiskLayout, tsconfigs = ["/src/tsconfig.json"], + expectedExitStatus, expectedDiagnostics, expectedOutputs, notExpectedOutputs }: VerifyBuild) { const fs = projFs.shadow(); const host = fakes.SolutionBuilderHost.create(fs); modifyDiskLayout(fs); - const builder = createSolutionBuilder(host, ["/src/tsconfig.json"], { verbose: true }); + const builder = createSolutionBuilder(host, tsconfigs, { verbose: true }); const exitStatus = builder.build(); assert.equal(exitStatus, expectedExitStatus); host.assertDiagnosticMessages(...expectedDiagnostics(fs)); @@ -156,5 +158,19 @@ namespace ts { notExpectedOutputs: [...coreOutputs(), ...animalOutputs(), ...zooOutputs()] }); }); + + it("returns an error exit in case of a bogus file", () => { + verifyBuild({ + modifyDiskLayout: noop, + tsconfigs: ["bogus.json"], + expectedExitStatus: ExitStatus.DiagnosticsPresent_OutputsSkipped, + expectedDiagnostics: _ => [ + getExpectedDiagnosticForProjectsInBuild("bogus.json"), + errorDiagnostic([Diagnostics.File_0_not_found, "/bogus.json"]), + ], + expectedOutputs: emptyArray, + notExpectedOutputs: [...coreOutputs(), ...animalOutputs(), ...zooOutputs()] + }); + }); }); }