diff options
author | Rob Mensching <rob@firegiant.com> | 2020-06-08 16:26:59 -0700 |
---|---|---|
committer | Rob Mensching <rob@firegiant.com> | 2020-06-08 16:37:14 -0700 |
commit | 02cdf55197d599d4d1fd611ad749d01f5c47a01f (patch) | |
tree | 76fcd573827fdb6b142197baa3237e6310a7bd4d /src/WixToolset.Core.ExtensionCache/ExtensionCacheManagerCommand.cs | |
parent | 04b8976ca565ce95cf32a58c8725843618724383 (diff) | |
download | wix-02cdf55197d599d4d1fd611ad749d01f5c47a01f.tar.gz wix-02cdf55197d599d4d1fd611ad749d01f5c47a01f.tar.bz2 wix-02cdf55197d599d4d1fd611ad749d01f5c47a01f.zip |
Add "extension" command
Diffstat (limited to 'src/WixToolset.Core.ExtensionCache/ExtensionCacheManagerCommand.cs')
-rw-r--r-- | src/WixToolset.Core.ExtensionCache/ExtensionCacheManagerCommand.cs | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/WixToolset.Core.ExtensionCache/ExtensionCacheManagerCommand.cs b/src/WixToolset.Core.ExtensionCache/ExtensionCacheManagerCommand.cs new file mode 100644 index 00000000..5016f430 --- /dev/null +++ b/src/WixToolset.Core.ExtensionCache/ExtensionCacheManagerCommand.cs | |||
@@ -0,0 +1,170 @@ | |||
1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
2 | |||
3 | namespace WixToolset.Core.ExtensionCache | ||
4 | { | ||
5 | using System; | ||
6 | using System.Collections.Generic; | ||
7 | using System.Linq; | ||
8 | using System.Threading; | ||
9 | using System.Threading.Tasks; | ||
10 | using WixToolset.Extensibility.Data; | ||
11 | using WixToolset.Extensibility.Services; | ||
12 | |||
13 | /// <summary> | ||
14 | /// Extension cache manager command. | ||
15 | /// </summary> | ||
16 | internal class ExtensionCacheManagerCommand : ICommandLineCommand | ||
17 | { | ||
18 | private enum CacheSubcommand | ||
19 | { | ||
20 | Add, | ||
21 | Remove, | ||
22 | List | ||
23 | } | ||
24 | |||
25 | public ExtensionCacheManagerCommand(IWixToolsetServiceProvider serviceProvider) | ||
26 | { | ||
27 | this.Messaging = serviceProvider.GetService<IMessaging>(); | ||
28 | this.ExtensionReferences = new List<string>(); | ||
29 | } | ||
30 | |||
31 | private IMessaging Messaging { get; } | ||
32 | |||
33 | public bool ShowLogo { get; private set; } | ||
34 | |||
35 | public bool StopParsing { get; private set; } | ||
36 | |||
37 | private bool ShowHelp { get; set; } | ||
38 | |||
39 | private bool Global { get; set; } | ||
40 | |||
41 | private CacheSubcommand? Subcommand { get; set; } | ||
42 | |||
43 | private List<string> ExtensionReferences { get; } | ||
44 | |||
45 | public async Task<int> ExecuteAsync(CancellationToken cancellationToken) | ||
46 | { | ||
47 | if (this.ShowHelp || !this.Subcommand.HasValue) | ||
48 | { | ||
49 | DisplayHelp(); | ||
50 | return 1; | ||
51 | } | ||
52 | |||
53 | var success = false; | ||
54 | var cacheManager = new ExtensionCacheManager(); | ||
55 | |||
56 | switch (this.Subcommand) | ||
57 | { | ||
58 | case CacheSubcommand.Add: | ||
59 | success = await this.AddExtensions(cacheManager, cancellationToken); | ||
60 | break; | ||
61 | |||
62 | case CacheSubcommand.Remove: | ||
63 | success = await this.RemoveExtensions(cacheManager, cancellationToken); | ||
64 | break; | ||
65 | |||
66 | case CacheSubcommand.List: | ||
67 | success = await this.ListExtensions(cacheManager, cancellationToken); | ||
68 | break; | ||
69 | } | ||
70 | |||
71 | return success ? 0 : 2; | ||
72 | } | ||
73 | |||
74 | public bool TryParseArgument(ICommandLineParser parser, string argument) | ||
75 | { | ||
76 | if (!parser.IsSwitch(argument)) | ||
77 | { | ||
78 | if (!this.Subcommand.HasValue) | ||
79 | { | ||
80 | if (!Enum.TryParse(argument, true, out CacheSubcommand subcommand)) | ||
81 | { | ||
82 | return false; | ||
83 | } | ||
84 | |||
85 | this.Subcommand = subcommand; | ||
86 | } | ||
87 | else | ||
88 | { | ||
89 | this.ExtensionReferences.Add(argument); | ||
90 | } | ||
91 | |||
92 | return true; | ||
93 | } | ||
94 | |||
95 | var parameter = argument.Substring(1); | ||
96 | switch (parameter.ToLowerInvariant()) | ||
97 | { | ||
98 | case "?": | ||
99 | this.ShowHelp = true; | ||
100 | this.ShowLogo = true; | ||
101 | this.StopParsing = true; | ||
102 | return true; | ||
103 | |||
104 | case "nologo": | ||
105 | this.ShowLogo = false; | ||
106 | return true; | ||
107 | |||
108 | case "g": | ||
109 | case "-global": | ||
110 | this.Global = true; | ||
111 | return true; | ||
112 | } | ||
113 | |||
114 | return false; | ||
115 | } | ||
116 | |||
117 | private async Task<bool> AddExtensions(ExtensionCacheManager cacheManager, CancellationToken cancellationToken) | ||
118 | { | ||
119 | var success = true; | ||
120 | |||
121 | foreach (var extensionRef in this.ExtensionReferences) | ||
122 | { | ||
123 | var added = await cacheManager.AddAsync(this.Global, extensionRef, cancellationToken); | ||
124 | success |= added; | ||
125 | } | ||
126 | |||
127 | return success; | ||
128 | } | ||
129 | |||
130 | private async Task<bool> RemoveExtensions(ExtensionCacheManager cacheManager, CancellationToken cancellationToken) | ||
131 | { | ||
132 | var success = true; | ||
133 | |||
134 | foreach (var extensionRef in this.ExtensionReferences) | ||
135 | { | ||
136 | var removed = await cacheManager.RemoveAsync(this.Global, extensionRef, cancellationToken); | ||
137 | success |= removed; | ||
138 | } | ||
139 | |||
140 | return success; | ||
141 | } | ||
142 | |||
143 | private async Task<bool> ListExtensions(ExtensionCacheManager cacheManager, CancellationToken cancellationToken) | ||
144 | { | ||
145 | var found = false; | ||
146 | var extensionRef = this.ExtensionReferences.FirstOrDefault(); | ||
147 | |||
148 | var extensions = await cacheManager.ListAsync(this.Global, extensionRef, cancellationToken); | ||
149 | |||
150 | foreach (var extension in extensions) | ||
151 | { | ||
152 | this.Messaging.Write($"{extension.Id} {extension.Version}{(extension.Damaged ? " (damaged)" : String.Empty)}"); | ||
153 | found = true; | ||
154 | } | ||
155 | |||
156 | return found; | ||
157 | } | ||
158 | |||
159 | private static void DisplayHelp() | ||
160 | { | ||
161 | Console.WriteLine(" usage: wix.exe extension add|remove|list [extensionRef]"); | ||
162 | Console.WriteLine(); | ||
163 | Console.WriteLine(" -g add/remove the extension for the current user"); | ||
164 | Console.WriteLine(" -nologo suppress displaying the logo information"); | ||
165 | Console.WriteLine(" -? this help information"); | ||
166 | Console.WriteLine(); | ||
167 | Console.WriteLine(" extensionRef format: extensionId/version (the version is optional)"); | ||
168 | } | ||
169 | } | ||
170 | } | ||