From 244b46cf7f3252d6dc3884ce184be901d1d173e5 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 2 Sep 2018 16:12:29 -0500 Subject: Migrate WixCop into Tools from wix4. --- src/wixcop/CommandLine/WixCopCommandLineParser.cs | 132 ++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/wixcop/CommandLine/WixCopCommandLineParser.cs (limited to 'src/wixcop/CommandLine/WixCopCommandLineParser.cs') diff --git a/src/wixcop/CommandLine/WixCopCommandLineParser.cs b/src/wixcop/CommandLine/WixCopCommandLineParser.cs new file mode 100644 index 00000000..53012cfd --- /dev/null +++ b/src/wixcop/CommandLine/WixCopCommandLineParser.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using WixCop.Interfaces; +using WixToolset.Core; +using WixToolset.Extensibility.Data; +using WixToolset.Extensibility.Services; + +namespace WixCop.CommandLine +{ + public sealed class WixCopCommandLineParser : IWixCopCommandLineParser + { + private bool fixErrors; + private int indentationAmount; + private readonly List searchPatterns; + private readonly IServiceProvider serviceProvider; + private string settingsFile1; + private string settingsFile2; + private bool showHelp; + private bool showLogo; + private bool subDirectories; + + public WixCopCommandLineParser(IServiceProvider serviceProvider) + { + this.serviceProvider = serviceProvider; + + this.indentationAmount = 4; + this.searchPatterns = new List(); + this.showLogo = true; + } + + public ICommandLineArguments Arguments { get; set; } + + public ICommandLineCommand ParseWixCopCommandLine() + { + this.Parse(); + + if (this.showLogo) + { + AppCommon.DisplayToolHeader(); + Console.WriteLine(); + } + + if (this.showHelp) + { + return new HelpCommand(); + } + + return new ConvertCommand( + this.serviceProvider, + this.fixErrors, + this.indentationAmount, + this.searchPatterns, + this.subDirectories, + this.settingsFile1, + this.settingsFile2); + } + + private void Parse() + { + this.showHelp = 0 == this.Arguments.Arguments.Length; + var parser = this.Arguments.Parse(); + + while (!this.showHelp && + String.IsNullOrEmpty(parser.ErrorArgument) && + parser.TryGetNextSwitchOrArgument(out var arg)) + { + if (String.IsNullOrWhiteSpace(arg)) // skip blank arguments. + { + continue; + } + + if (parser.IsSwitch(arg)) + { + if (!this.ParseArgument(parser, arg)) + { + parser.ErrorArgument = arg; + } + } + else + { + this.searchPatterns.Add(arg); + } + } + } + + private bool ParseArgument(IParseCommandLine parser, string arg) + { + var parameter = arg.Substring(1); + + switch (parameter.ToLowerInvariant()) + { + case "?": + this.showHelp = true; + return true; + case "f": + this.fixErrors = true; + return true; + case "nologo": + this.showLogo = false; + return true; + case "s": + this.subDirectories = true; + return true; + default: // other parameters + if (parameter.StartsWith("set1", StringComparison.Ordinal)) + { + this.settingsFile1 = parameter.Substring(4); + } + else if (parameter.StartsWith("set2", StringComparison.Ordinal)) + { + this.settingsFile2 = parameter.Substring(4); + } + else if (parameter.StartsWith("indent:", StringComparison.Ordinal)) + { + try + { + this.indentationAmount = Convert.ToInt32(parameter.Substring(7)); + } + catch + { + throw new ArgumentException("Invalid numeric argument.", parameter); + } + } + else + { + throw new ArgumentException("Invalid argument.", parameter); + } + return true; + } + } + } +} -- cgit v1.2.3-55-g6feb