aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.ExtensionCache/ExtensionCacheManagerCommand.cs
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2020-06-08 16:26:59 -0700
committerRob Mensching <rob@firegiant.com>2020-06-08 16:37:14 -0700
commit02cdf55197d599d4d1fd611ad749d01f5c47a01f (patch)
tree76fcd573827fdb6b142197baa3237e6310a7bd4d /src/WixToolset.Core.ExtensionCache/ExtensionCacheManagerCommand.cs
parent04b8976ca565ce95cf32a58c8725843618724383 (diff)
downloadwix-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.cs170
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
3namespace 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}