internal static int GetExitCode(WorkspaceFormatResult formatResult, bool check) { if (!check) { return(formatResult.ExitCode); } return(formatResult.FilesFormatted == 0 ? 0 : CheckFailedExitCode); }
public static async Task <WorkspaceFormatResult> FormatWorkspaceAsync(ILogger logger, string solutionOrProjectPath, bool isSolution, bool logAllWorkspaceWarnings, bool saveFormattedFiles, string[] filesToFormat, CancellationToken cancellationToken) { logger.LogInformation(string.Format(Resources.Formatting_code_files_in_workspace_0, solutionOrProjectPath)); logger.LogTrace(Resources.Loading_workspace); var loggedWarningCount = 0; var formatResult = new WorkspaceFormatResult() { ExitCode = 1 }; var workspaceStopwatch = Stopwatch.StartNew(); var properties = new Dictionary <string, string>(StringComparer.Ordinal) { // This property ensures that XAML files will be compiled in the current AppDomain // rather than a separate one. Any tasks isolated in AppDomains or tasks that create // AppDomains will likely not work due to https://github.com/Microsoft/MSBuildLocator/issues/16. { "AlwaysCompileMarkupFilesInSeparateDomain", bool.FalseString }, // This flag is used at restore time to avoid imports from packages changing the inputs to restore, // without this it is possible to get different results between the first and second restore. { "ExcludeRestorePackageImports", bool.TrueString }, }; var codingConventionsManager = CodingConventionsManagerFactory.CreateCodingConventionsManager(); using (var workspace = MSBuildWorkspace.Create(properties)) { workspace.WorkspaceFailed += LogWorkspaceWarnings; var projectPath = string.Empty; if (isSolution) { await workspace.OpenSolutionAsync(solutionOrProjectPath, cancellationToken : cancellationToken).ConfigureAwait(false); } else { try { await workspace.OpenProjectAsync(solutionOrProjectPath, cancellationToken : cancellationToken).ConfigureAwait(false); projectPath = solutionOrProjectPath; } catch (InvalidOperationException) { logger.LogError(Resources.Could_not_format_0_Format_currently_supports_only_CSharp_and_Visual_Basic_projects, solutionOrProjectPath); return(formatResult); } } logger.LogTrace(Resources.Workspace_loaded_in_0_ms, workspaceStopwatch.ElapsedMilliseconds); workspaceStopwatch.Restart(); (formatResult.ExitCode, formatResult.FileCount, formatResult.FilesFormatted) = await FormatFilesInWorkspaceAsync(logger, workspace, projectPath, codingConventionsManager, saveFormattedFiles, filesToFormat, cancellationToken).ConfigureAwait(false); logger.LogDebug(Resources.Formatted_0_of_1_files_in_2_ms, formatResult.FilesFormatted, formatResult.FileCount, workspaceStopwatch.ElapsedMilliseconds); } logger.LogInformation(Resources.Format_complete); return(formatResult); void LogWorkspaceWarnings(object sender, WorkspaceDiagnosticEventArgs args) { if (args.Diagnostic.Kind == WorkspaceDiagnosticKind.Failure) { return; } logger.LogWarning(args.Diagnostic.Message); if (!logAllWorkspaceWarnings) { loggedWarningCount++; if (loggedWarningCount == MaxLoggedWorkspaceWarnings) { logger.LogWarning(Resources.Maximum_number_of_workspace_warnings_to_log_has_been_reached_Set_the_verbosity_option_to_the_diagnostic_level_to_see_all_warnings); ((MSBuildWorkspace)sender).WorkspaceFailed -= LogWorkspaceWarnings; } } } }
public static int GetExitCode(WorkspaceFormatResult formatResult, bool check) => !check ? formatResult.ExitCode : (formatResult.FilesFormatted == 0 ? 0 : 1);