ErrorCode writeOutput() { XmlTextWriter?metricFile = null; try { // Create the writer if (outputFile != null) { if (!quiet) { Console.WriteLine($"Writing output to '{outputFile}'..."); } metricFile = new XmlTextWriter(outputFile, Encoding.UTF8); } else { metricFile = new XmlTextWriter(Console.OpenStandardOutput(), Console.OutputEncoding); } MetricsOutputWriter.WriteMetricFile(metricDatas, metricFile); if (outputFile == null) { metricFile.WriteString(Environment.NewLine + Environment.NewLine); } return(ErrorCode.None); } #pragma warning disable CA1031 // Do not catch general exception types - gracefully catch exceptions and log them to the console and output file. catch (Exception ex) { Console.WriteLine(ex.Message); return(ErrorCode.WriteException); } #pragma warning restore CA1031 // Do not catch general exception types finally { if (metricFile != null) { metricFile.Close(); } } }
private static async Task <ErrorCode> RunAsync(string[] args, CancellationToken cancellationToken) { var projectsOrSolutions = new List <string>(); string outputFile = null; bool quiet = false; if (args.Length == 0) { return(usage()); } var errorCode = parseArguments(); if (errorCode != ErrorCode.None) { return(errorCode); } cancellationToken.ThrowIfCancellationRequested(); MSBuildLocator.RegisterDefaults(); cancellationToken.ThrowIfCancellationRequested(); (ImmutableArray <(string, CodeAnalysisMetricData)> metricDatas, ErrorCode exitCode) = await GetMetricDatasAsync(projectsOrSolutions, quiet, cancellationToken).ConfigureAwait(false); if (exitCode != ErrorCode.None) { return(exitCode); } cancellationToken.ThrowIfCancellationRequested(); errorCode = writeOutput(); if (!quiet && errorCode == ErrorCode.None) { Console.WriteLine("Completed Successfully."); } return(errorCode); ErrorCode parseArguments() { // Parse arguments for (int i = 0; i < args.Length; i++) { var arg = args[i]; if (!arg.StartsWith("/", StringComparison.Ordinal) && !arg.StartsWith("-", StringComparison.Ordinal)) { return(usage()); } arg = arg.Substring(1); switch (arg.ToUpperInvariant()) { case "Q": case "QUIET": quiet = true; continue; case "?": case "HELP": return(usage()); default: var index = arg.IndexOf(':'); if (index == -1 || index == arg.Length - 1) { return(usage()); } var key = arg.Substring(0, index).ToUpperInvariant(); var value = arg.Substring(index + 1); switch (key) { case "P": case "PROJECT": if (!File.Exists(value)) { return(fileNotExists(value)); } if (!value.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase) && !value.EndsWith(".vbproj", StringComparison.OrdinalIgnoreCase)) { return(notASupportedProject(value)); } projectsOrSolutions.Add(value); break; case "S": case "SOLUTION": if (!File.Exists(value)) { return(fileNotExists(value)); } if (!value.EndsWith(".sln", StringComparison.OrdinalIgnoreCase)) { return(notASolution(value)); } projectsOrSolutions.Add(value); break; case "O": case "OUT": if (value.Length == 0) { return(invalidOutputFile(value)); } outputFile = value; break; default: return(usage()); } break; } } if (projectsOrSolutions.Count == 0) { return(requiresProjectOrSolution()); } return(ErrorCode.None); } ErrorCode usage() { Console.WriteLine(@" Usage: Metrics.exe <arguments> Help for command-line arguments: /project:<project-file> [Short form: /p:<project-file>] Project(s) to analyze. /solution:<solution-file> [Short form: /s:<solution-file>] Solution(s) to analyze. /out:<file> [Short form: /o:<file>] Metrics results XML output file. /quiet [Short form: /q] Silence all console output other than error reporting. /help [Short form: /?] Display this help message."); return(ErrorCode.Usage); } ErrorCode fileNotExists(string path) { Console.WriteLine($"Error: File '{path}' does not exist."); return(ErrorCode.FileNotExists); } ErrorCode requiresProjectOrSolution() { Console.WriteLine($"Error: No project or solution provided."); return(ErrorCode.RequiresProjectOrSolution); } ErrorCode notASolution(string path) { Console.WriteLine($"Error: File '{path}' is not a solution file."); return(ErrorCode.NotASolution); } ErrorCode notASupportedProject(string path) { Console.WriteLine($"Error: File '{path}' is not a C# or VB project file."); return(ErrorCode.NotASupportedProject); } ErrorCode invalidOutputFile(string path) { Console.WriteLine($"Error: File '{path}' is not a valid output file."); return(ErrorCode.InvalidOutputFile); } ErrorCode writeOutput() { XmlTextWriter metricFile = null; try { // Create the writer if (outputFile != null) { if (!quiet) { Console.WriteLine($"Writing output to '{outputFile}'..."); } metricFile = new XmlTextWriter(outputFile, Encoding.UTF8); } else { metricFile = new XmlTextWriter(Console.OpenStandardOutput(), Console.OutputEncoding); } MetricsOutputWriter.WriteMetricFile(metricDatas, metricFile); if (outputFile == null) { metricFile.WriteString(Environment.NewLine + Environment.NewLine); } return(ErrorCode.None); } #pragma warning disable CA1031 // Do not catch general exception types - gracefully catch exceptions and log them to the console and output file. catch (Exception ex) { Console.WriteLine(ex.Message); return(ErrorCode.WriteException); } #pragma warning restore CA1031 // Do not catch general exception types finally { if (metricFile != null) { metricFile.Close(); } } } }