func processResult(state *core.BuildState, result *core.BuildResult, buildingTargets []buildingTarget, aggregatedResults *core.TestResults, plainOutput bool, keepGoing bool, failedTargets, failedNonTests *[]core.BuildLabel, failedTargetMap map[core.BuildLabel]error, shouldTrace bool) { label := result.Label active := result.Status == core.PackageParsing || result.Status == core.TargetBuilding || result.Status == core.TargetTesting failed := result.Status == core.ParseFailed || result.Status == core.TargetBuildFailed || result.Status == core.TargetTestFailed cached := result.Status == core.TargetCached || result.Tests.Cached stopped := result.Status == core.TargetBuildStopped if shouldTrace { addTrace(result, buildingTargets[result.ThreadId].Label, active) } if failed && result.Tests.NumTests == 0 && result.Tests.Failed == 0 { result.Tests.NumTests = 1 result.Tests.Failed = 1 // Ensure there's one test failure when there're no results to parse. } // Only aggregate test results the first time it finishes. if buildingTargets[result.ThreadId].Active && !active { aggregatedResults.Aggregate(result.Tests) } target := state.Graph.Target(label) updateTarget(state, plainOutput, &buildingTargets[result.ThreadId], label, active, failed, cached, result.Description, result.Err, targetColour(target)) if failed { failedTargetMap[label] = result.Err // Don't stop here after test failure, aggregate them for later. if !keepGoing && result.Status != core.TargetTestFailed { // Reset colour so the entire compiler error output doesn't appear red. log.Errorf("%s failed:${RESET}\n%s", result.Label, result.Err) state.KillAll() } else if !plainOutput { // plain output will have already logged this log.Errorf("%s failed: %s", result.Label, result.Err) } *failedTargets = append(*failedTargets, label) if result.Status != core.TargetTestFailed { *failedNonTests = append(*failedNonTests, label) } } else if stopped { failedTargetMap[result.Label] = nil } else if plainOutput && state.ShowTestOutput && result.Status == core.TargetTested { // If using interactive output we'll print it afterwards. printf("Finished test %s:\n%s\n", label, target.Results.Output) } }