diff options
| author | Rob Mensching <rob@firegiant.com> | 2017-10-17 02:47:44 -0700 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2017-10-18 13:31:55 -0700 |
| commit | c08fd0aefeea1628fe93c818ca4dde63fd6ac2e1 (patch) | |
| tree | ac63402f6bad7f3a5bc20b088914145d9bf8635b /src/WixToolset.Core/CommandLine/CommandLine.cs | |
| parent | 6dd045318f7ee405e92e76d311ad1424c20157c1 (diff) | |
| download | wix-c08fd0aefeea1628fe93c818ca4dde63fd6ac2e1.tar.gz wix-c08fd0aefeea1628fe93c818ca4dde63fd6ac2e1.tar.bz2 wix-c08fd0aefeea1628fe93c818ca4dde63fd6ac2e1.zip | |
Introduce WixToolsetServiceProvider
Using a service provider allows all of WixToolset.Core's internal
functionality to be abstracted behind interfaces in WixToolset.Extensibility.
The service provide can also control what interfaces are singletons.
Diffstat (limited to 'src/WixToolset.Core/CommandLine/CommandLine.cs')
| -rw-r--r-- | src/WixToolset.Core/CommandLine/CommandLine.cs | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/src/WixToolset.Core/CommandLine/CommandLine.cs b/src/WixToolset.Core/CommandLine/CommandLine.cs index 2f203ecb..b0594348 100644 --- a/src/WixToolset.Core/CommandLine/CommandLine.cs +++ b/src/WixToolset.Core/CommandLine/CommandLine.cs | |||
| @@ -6,11 +6,11 @@ namespace WixToolset.Core | |||
| 6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| 7 | using System.IO; | 7 | using System.IO; |
| 8 | using System.Linq; | 8 | using System.Linq; |
| 9 | using System.Reflection; | ||
| 10 | using System.Text; | 9 | using System.Text; |
| 11 | using System.Text.RegularExpressions; | 10 | using System.Text.RegularExpressions; |
| 12 | using WixToolset.Data; | 11 | using WixToolset.Data; |
| 13 | using WixToolset.Extensibility; | 12 | using WixToolset.Extensibility; |
| 13 | using WixToolset.Extensibility.Services; | ||
| 14 | 14 | ||
| 15 | internal enum Commands | 15 | internal enum Commands |
| 16 | { | 16 | { |
| @@ -22,12 +22,14 @@ namespace WixToolset.Core | |||
| 22 | Bind, | 22 | Bind, |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | public class CommandLine | 25 | internal class CommandLine : ICommandLine |
| 26 | { | 26 | { |
| 27 | private CommandLine() | 27 | public CommandLine() |
| 28 | { | 28 | { |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | private IServiceProvider ServiceProvider { get; set; } | ||
| 32 | |||
| 31 | public static string ExpectedArgument { get; } = "expected argument"; | 33 | public static string ExpectedArgument { get; } = "expected argument"; |
| 32 | 34 | ||
| 33 | public string ActiveCommand { get; private set; } | 35 | public string ActiveCommand { get; private set; } |
| @@ -36,20 +38,29 @@ namespace WixToolset.Core | |||
| 36 | 38 | ||
| 37 | public Queue<string> RemainingArguments { get; } = new Queue<string>(); | 39 | public Queue<string> RemainingArguments { get; } = new Queue<string>(); |
| 38 | 40 | ||
| 39 | public ExtensionManager ExtensionManager { get; } = new ExtensionManager(); | 41 | public IExtensionManager ExtensionManager { get; private set; } |
| 40 | 42 | ||
| 41 | public string ErrorArgument { get; set; } | 43 | public string ErrorArgument { get; set; } |
| 42 | 44 | ||
| 43 | public bool ShowHelp { get; set; } | 45 | public bool ShowHelp { get; set; } |
| 44 | 46 | ||
| 45 | public static ICommandLineCommand ParseStandardCommandLine(string commandLineString) | 47 | public ICommandLineCommand ParseStandardCommandLine(ICommandLineContext context) |
| 46 | { | 48 | { |
| 47 | var args = CommandLine.ParseArgumentsToArray(commandLineString).ToArray(); | 49 | this.ServiceProvider = context.ServiceProvider; |
| 50 | |||
| 51 | this.ExtensionManager = context.ExtensionManager ?? this.ServiceProvider.GetService<IExtensionManager>(); | ||
| 52 | |||
| 53 | var args = context.ParsedArguments ?? Array.Empty<string>(); | ||
| 54 | |||
| 55 | if (!String.IsNullOrEmpty(context.Arguments)) | ||
| 56 | { | ||
| 57 | args = CommandLine.ParseArgumentsToArray(context.Arguments).Union(args).ToArray(); | ||
| 58 | } | ||
| 48 | 59 | ||
| 49 | return ParseStandardCommandLine(args); | 60 | return this.ParseStandardCommandLine(args); |
| 50 | } | 61 | } |
| 51 | 62 | ||
| 52 | public static ICommandLineCommand ParseStandardCommandLine(string[] args) | 63 | private ICommandLineCommand ParseStandardCommandLine(string[] args) |
| 53 | { | 64 | { |
| 54 | var next = String.Empty; | 65 | var next = String.Empty; |
| 55 | 66 | ||
| @@ -79,7 +90,7 @@ namespace WixToolset.Core | |||
| 79 | var builtOutputsFile = String.Empty; | 90 | var builtOutputsFile = String.Empty; |
| 80 | var wixProjectFile = String.Empty; | 91 | var wixProjectFile = String.Empty; |
| 81 | 92 | ||
| 82 | var cli = CommandLine.Parse(args, (cmdline, arg) => Enum.TryParse(arg, true, out command), (cmdline, arg) => | 93 | this.Parse(args, (cmdline, arg) => Enum.TryParse(arg, true, out command), (cmdline, arg) => |
| 83 | { | 94 | { |
| 84 | if (cmdline.IsSwitch(arg)) | 95 | if (cmdline.IsSwitch(arg)) |
| 85 | { | 96 | { |
| @@ -103,7 +114,7 @@ namespace WixToolset.Core | |||
| 103 | case "cc": | 114 | case "cc": |
| 104 | cmdline.GetNextArgumentOrError(ref cabCachePath); | 115 | cmdline.GetNextArgumentOrError(ref cabCachePath); |
| 105 | return true; | 116 | return true; |
| 106 | 117 | ||
| 107 | case "cultures": | 118 | case "cultures": |
| 108 | cmdline.GetNextArgumentOrError(cultures); | 119 | cmdline.GetNextArgumentOrError(cultures); |
| 109 | return true; | 120 | return true; |
| @@ -187,7 +198,7 @@ namespace WixToolset.Core | |||
| 187 | AppCommon.DisplayToolHeader(); | 198 | AppCommon.DisplayToolHeader(); |
| 188 | } | 199 | } |
| 189 | 200 | ||
| 190 | if (cli.ShowHelp) | 201 | if (this.ShowHelp) |
| 191 | { | 202 | { |
| 192 | return new HelpCommand(command); | 203 | return new HelpCommand(command); |
| 193 | } | 204 | } |
| @@ -196,14 +207,11 @@ namespace WixToolset.Core | |||
| 196 | { | 207 | { |
| 197 | case Commands.Build: | 208 | case Commands.Build: |
| 198 | { | 209 | { |
| 199 | LoadStandardBackends(cli.ExtensionManager); | ||
| 200 | |||
| 201 | var sourceFiles = GatherSourceFiles(files, outputFolder); | 210 | var sourceFiles = GatherSourceFiles(files, outputFolder); |
| 202 | var variables = GatherPreprocessorVariables(defines); | 211 | var variables = GatherPreprocessorVariables(defines); |
| 203 | var bindPathList = GatherBindPaths(bindPaths); | 212 | var bindPathList = GatherBindPaths(bindPaths); |
| 204 | var extensions = cli.ExtensionManager; | ||
| 205 | var type = CalculateOutputType(outputType, outputFile); | 213 | var type = CalculateOutputType(outputType, outputFile); |
| 206 | return new BuildCommand(extensions, sourceFiles, variables, locFiles, libraryFiles, outputFile, type, cabCachePath, cultures, bindFiles, bindPathList, intermediateFolder, contentsFile, outputsFile, builtOutputsFile, wixProjectFile); | 214 | return new BuildCommand(this.ServiceProvider, this.ExtensionManager, sourceFiles, variables, locFiles, libraryFiles, outputFile, type, cabCachePath, cultures, bindFiles, bindPathList, intermediateFolder, contentsFile, outputsFile, builtOutputsFile, wixProjectFile); |
| 207 | } | 215 | } |
| 208 | 216 | ||
| 209 | case Commands.Compile: | 217 | case Commands.Compile: |
| @@ -217,18 +225,6 @@ namespace WixToolset.Core | |||
| 217 | return null; | 225 | return null; |
| 218 | } | 226 | } |
| 219 | 227 | ||
| 220 | private static void LoadStandardBackends(ExtensionManager extensionManager) | ||
| 221 | { | ||
| 222 | var folder = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath); | ||
| 223 | |||
| 224 | foreach (var backendAssemblyName in new[] { "WixToolset.Core.Burn.dll", "WixToolset.Core.WindowsInstaller.dll" }) | ||
| 225 | { | ||
| 226 | var path = Path.Combine(folder, backendAssemblyName); | ||
| 227 | |||
| 228 | extensionManager.Load(path); | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 232 | private static OutputType CalculateOutputType(string outputType, string outputFile) | 228 | private static OutputType CalculateOutputType(string outputType, string outputFile) |
| 233 | { | 229 | { |
| 234 | if (String.IsNullOrEmpty(outputType)) | 230 | if (String.IsNullOrEmpty(outputType)) |
| @@ -269,6 +265,7 @@ namespace WixToolset.Core | |||
| 269 | return OutputType.Unknown; | 265 | return OutputType.Unknown; |
| 270 | } | 266 | } |
| 271 | 267 | ||
| 268 | #if UNUSED | ||
| 272 | private static CommandLine Parse(string commandLineString, Func<CommandLine, string, bool> parseArgument) | 269 | private static CommandLine Parse(string commandLineString, Func<CommandLine, string, bool> parseArgument) |
| 273 | { | 270 | { |
| 274 | var arguments = CommandLine.ParseArgumentsToArray(commandLineString).ToArray(); | 271 | var arguments = CommandLine.ParseArgumentsToArray(commandLineString).ToArray(); |
| @@ -280,18 +277,17 @@ namespace WixToolset.Core | |||
| 280 | { | 277 | { |
| 281 | return CommandLine.Parse(commandLineArguments, null, parseArgument); | 278 | return CommandLine.Parse(commandLineArguments, null, parseArgument); |
| 282 | } | 279 | } |
| 280 | #endif | ||
| 283 | 281 | ||
| 284 | private static CommandLine Parse(string[] commandLineArguments, Func<CommandLine, string, bool> parseCommand, Func<CommandLine, string, bool> parseArgument) | 282 | private ICommandLine Parse(string[] commandLineArguments, Func<CommandLine, string, bool> parseCommand, Func<CommandLine, string, bool> parseArgument) |
| 285 | { | 283 | { |
| 286 | var cmdline = new CommandLine(); | 284 | this.FlattenArgumentsWithResponseFilesIntoOriginalArguments(commandLineArguments); |
| 287 | |||
| 288 | cmdline.FlattenArgumentsWithResponseFilesIntoOriginalArguments(commandLineArguments); | ||
| 289 | 285 | ||
| 290 | cmdline.QueueArgumentsAndLoadExtensions(cmdline.OriginalArguments); | 286 | this.QueueArgumentsAndLoadExtensions(this.OriginalArguments); |
| 291 | 287 | ||
| 292 | cmdline.ProcessRemainingArguments(parseArgument, parseCommand); | 288 | this.ProcessRemainingArguments(parseArgument, parseCommand); |
| 293 | 289 | ||
| 294 | return cmdline; | 290 | return this; |
| 295 | } | 291 | } |
| 296 | 292 | ||
| 297 | private static IEnumerable<SourceFile> GatherSourceFiles(IEnumerable<string> sourceFiles, string intermediateDirectory) | 293 | private static IEnumerable<SourceFile> GatherSourceFiles(IEnumerable<string> sourceFiles, string intermediateDirectory) |
