tools/traceabilitytool/traceability_tool/program.cs (146 lines of code) (raw):

// Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; // Used for StringComparison class using System.Windows.Forms; // Used for Application class using System.IO; // Used for StreamWriter class using System.Runtime.InteropServices; // Used for DllImport using System.Diagnostics; // Used for Process class namespace TraceabilityTool { // This class is responsible for starting the program as a GUI application or as a command-line-based application. // It allows to process command line parameters. static class Program { // Directory to look for Word documents with requirements and source code with implementaiton/tests in. public static string inputDir = ""; // Directory to place reports into. public static string outputDir = ""; // directories to exclude public static string[] exclusionDirs = null; // Exit program with code 0 if correct parameters were supplied. public static int exitCode = 0; [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", SetLastError = true)] static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); [DllImport("kernel32", SetLastError = true)] static extern bool AttachConsole(int dwProcessId); [DllImport("kernel32.dll", SetLastError = true)] static extern bool FreeConsole(); private static bool enableConsole() { IntPtr ptr = GetForegroundWindow(); int cmdProcessID; bool consoleEnabled = false; GetWindowThreadProcessId(ptr, out cmdProcessID); Process process = Process.GetProcessById(cmdProcessID); if (process.ProcessName.ToLower() == "cmd") { // The uppermost window is a cmd process. The console is already running. AttachConsole(process.Id); consoleEnabled = true; } return consoleEnabled; } /// <summary> /// The main entry point for the application. /// </summary> /// [STAThread] public static void Main(string[] args) { bool inputDirValid = false; bool outputDirValid = false; bool exclusionDirsValid = false; bool buildCheck = false; bool optionGUI = false; // Command line interface can be enabled as a command line option bool consoleEnabled = false; if (args.Length > 0) { for (int i = 0; i < args.Length; i++) { // Find the input directory paramter, which should follow the "-i" parameter if (args[i].Equals("-i", StringComparison.OrdinalIgnoreCase) && (i < args.Length - 1)) { inputDirValid = Directory.Exists(args[i + 1]); if (inputDirValid) inputDir = args[i + 1]; } // Find the output directory parameter, which should follow the "-o" parameter if (args[i].Equals("-o", StringComparison.OrdinalIgnoreCase) && (i < args.Length - 1)) { outputDirValid = Directory.Exists(args[i + 1]); if (outputDirValid) { outputDir = args[i + 1]; } } // The "GUI" option enables GUI mode of operation as opposed to command-line mode. if (args[i].Equals("-GUI", StringComparison.OrdinalIgnoreCase)) optionGUI = true; // The "CSV" option forces reports to be generated in the comma-separated values (CSV) format in addition to plain text reports. if (args[i].Equals("-CSV", StringComparison.OrdinalIgnoreCase)) MainForm.outputCSV = true; // The "BUILDCHECK" option forces reports to be generated in the comma-separated values (CSV) format in addition to plain text reports. if (args[i].Equals("-BUILDCHECK", StringComparison.OrdinalIgnoreCase)) { MainForm.buildCheck = true; buildCheck = true; } if (args[i].Equals("-e", StringComparison.OrdinalIgnoreCase) && (i < args.Length - 1)) { string[] dirs = args[i + 1].Split(';'); exclusionDirsValid = true; foreach (string d in dirs) { exclusionDirsValid &= Directory.Exists(d); } if (exclusionDirsValid) { exclusionDirs = dirs; } } } // parse out incompatible options if ((buildCheck && (optionGUI || MainForm.outputCSV || outputDirValid)) || (!buildCheck && (!outputDirValid && !optionGUI))) { Usage(); exitCode = 1; } if (!optionGUI && !inputDirValid) { Usage(); exitCode = 1; } } else { //Default to enable console if Usage is wrong. consoleEnabled = enableConsole(); Usage(); exitCode = 1; } if (exitCode == 0) { if (!optionGUI) { consoleEnabled = enableConsole(); } if (optionGUI) { // GUI enabled Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } else { // The minimum required parameters were correctly specified. Run the reports in CLI mode exitCode = ReportGenerator.GenerateReport(inputDir, outputDir, exclusionDirs, null); Console.WriteLine(); if (outputDirValid) { Console.WriteLine("Reports have been generated in " + outputDir); } } } if (consoleEnabled) FreeConsole(); System.Environment.Exit(exitCode); } public static void Usage() { Console.WriteLine(""); Console.WriteLine("Command line parameters are invalid."); Console.WriteLine("Valid parameters:"); Console.WriteLine("-i <path> to specify the input/root directory path to search for requirements documents and source code in."); Console.WriteLine("-o <path> to specify the output directory path to write reports into."); Console.WriteLine("-e <path[;path...] to specify directories to exclude from reports."); Console.WriteLine("-gui to use the GUI interface."); Console.WriteLine("-csv to generate reports in CSV format in addition to default plain text reports."); Console.WriteLine("-buildcheck to generate reports to the console for build checking."); Console.WriteLine("-buildcheck is incompatible with -o, -gui and -csv"); Console.WriteLine("When not running in buildcheck mode, input and output directories are required."); } } }