1
+ # ----------------------------------------------------------------------------------
2
+ #
3
+ # Copyright Microsoft Corporation
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ # ----------------------------------------------------------------------------------
14
+
15
+ # Requires -Modules AzureRM .KeyVault
16
+ [CmdletBinding (
17
+ DefaultParameterSetName = ' Scope' ,
18
+ SupportsShouldProcess = $true
19
+ )]
20
+ param (
21
+ [Parameter (ParameterSetName = ' Scope' , Mandatory = $true , Position = 0 )]
22
+ [ValidateSet (" AzureRMAndDependencies" , " AzureAndDependencies" , " NetCoreModules" , " AzureStackAndDependencies" )]
23
+ [string ] $scope ,
24
+ [Parameter (ParameterSetName = ' ModuleList' , Mandatory = $true )]
25
+ [string []] $listOfModules ,
26
+ [Parameter (ParameterSetName = ' ModulesAndVersionsList' , Mandatory = $true )]
27
+ [hashtable []] $moduleVersionTable ,
28
+ [Parameter (Mandatory = $false )]
29
+ [string ] $repoName ,
30
+ [Parameter (Mandatory = $false )]
31
+ [string ] $nugetExe ,
32
+ [Parameter (Mandatory = $false )]
33
+ [string ] $apiKey ,
34
+ [Parameter (Mandatory = $false )]
35
+ [switch ] $Force
36
+ )
37
+
38
+ function Get-TargetModules
39
+ {
40
+ [CmdletBinding ()]
41
+ param
42
+ (
43
+ [string ]$scope ,
44
+ [string []]$moduleList ,
45
+ [hashtable []]$moduleVersionTable
46
+ )
47
+
48
+ $targets = @ ()
49
+
50
+ if ($listOfModules.Count -ge 1 )
51
+ {
52
+ $moduleList | ForEach-Object {
53
+ $targets += Find-Module - Name $_ - Repository $repoName
54
+ }
55
+ }
56
+
57
+ elseif ($moduleVersionTable.Count -ge 1 )
58
+ {
59
+ $moduleVersionTable | ForEach-Object {
60
+ $targets += Find-Module - Name $_.Module - RequiredVersion $_.Version - Repository $repoName
61
+ }
62
+ }
63
+
64
+ else
65
+ {
66
+ $query = " "
67
+ if ($scope -eq " AzureRMAndDependencies" ) {
68
+ $query = " AzureRM"
69
+ } elseif ($scope -eq " AzureAndDependencies" ) {
70
+ $query = " Azure"
71
+ } elseif ($scope -eq " NetCoreModules" ) {
72
+ $query = " AzureRM.Netcore"
73
+ } elseif ($scope -eq " AzureStackAndDependencies" ) {
74
+ $query = " AzureStack"
75
+ }
76
+
77
+ $azureRmAllVersions = Find-Module - Name $query - Repository PSGallery - AllVersions
78
+ $targets += $azureRmAllVersions [0 ]
79
+ $currentDependencies = $azureRmAllVersions [0 ].Dependencies
80
+ $previousDependencies = $azureRmAllVersions [1 ].Dependencies
81
+ $currentDependencies | ForEach-Object {
82
+ $CDModule = $_
83
+ $versionChanged = $true
84
+ $previousDependencies | ForEach-Object {
85
+ if (($_.Name -eq $CDModule.Name ) -and (($_.RequiredVersion -eq $CDModule.RequiredVersion ) -and ($_.MinimumVersion -eq $CDModule.MinimumVersion )))
86
+ {
87
+ $versionChanged = $false
88
+ }
89
+ }
90
+
91
+ if ($versionChanged )
92
+ {
93
+ $targets += $CDModule
94
+ }
95
+ }
96
+ }
97
+
98
+ return $targets
99
+ }
100
+
101
+ function Get-DependentModules
102
+ {
103
+ param (
104
+ [string ]$repoName ,
105
+ [string ]$moduleName ,
106
+ [string ]$moduleVersion ,
107
+ [object []]$allModules ,
108
+ [object []]$azureModules
109
+ )
110
+
111
+ $dependencies = @ ()
112
+ $azureModules | ForEach-Object {
113
+ $targetName = $_.Name
114
+ $moduleBeingDeleted = $allModules | Where-Object {$_.Name -eq $targetName }
115
+
116
+ $_.Dependencies | ForEach-Object {
117
+ $dependencyName = $_.Name
118
+
119
+ if (($moduleBeingDeleted -eq $null ) -and ($moduleName -eq $dependencyName ))
120
+ {
121
+ $allTargetVersions = Find-Module - Name $targetName - Repository $repoName - AllVersions
122
+ $allTargetVersions | ForEach-Object {
123
+ $targetVersion = $_.Version
124
+ $_.Dependencies | ForEach-Object {
125
+ if (($moduleName -eq $_.Name ) -and (($_.MinimumVersion -eq $moduleVersion ) -or ($_.RequiredVersion -eq $moduleVersion )))
126
+ {
127
+ $dependencies += " `" $targetName $targetVersion `" ,"
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ if ($dependencies.Count -ne 0 )
135
+ {
136
+ return " $moduleName $moduleVersion is a dependency for $dependencies the module(s) will have an orphaned dependency. Are you sure you want to unlist this package?"
137
+ }
138
+ }
139
+
140
+ function Get-ApiKey
141
+ {
142
+ param ([string ]$repoName )
143
+
144
+ if ($repoName -eq " PSGallery" )
145
+ {
146
+ $vaultKey = " PowerShellGalleryApiKey"
147
+ }
148
+
149
+ elseif ($repoName -eq " TestGallery" )
150
+ {
151
+ $vaultKey = " PSTestGalleryApiKey"
152
+ }
153
+
154
+ else
155
+ {
156
+ throw " Must supply ApiKey if not using PSGallery or TestGallery"
157
+ }
158
+
159
+ $context = $null
160
+ try {
161
+ $context = Get-AzureRMContext - ErrorAction Stop
162
+ } catch {}
163
+
164
+ if ($context -eq $null )
165
+ {
166
+ Add-AzureRMAccount
167
+ }
168
+
169
+ $secret = Get-AzureKeyVaultSecret - VaultName kv- azuresdk - Name $vaultKey
170
+
171
+ $secret.SecretValueText
172
+ }
173
+
174
+ if ([string ]::IsNullOrEmpty($nugetExe ))
175
+ {
176
+ $nugetExe = " $PSScriptRoot \nuget.exe"
177
+ }
178
+ Write-Host " Using the following NuGet path: $nugetExe "
179
+
180
+ if ([string ]::IsNullOrEmpty($repoName ))
181
+ {
182
+ $repoName = " PSGallery"
183
+ }
184
+ Write-Host " Deleting modules from the following repository: $repoName "
185
+
186
+ if (($repoName -eq " PSGallery" ) -or ([string ]::IsNullOrEmpty($repoName )))
187
+ {
188
+ $repositoryLocation = " https://www.powershellgallery.com/api/v2/package/"
189
+ }
190
+
191
+ elseif ($repoName -eq " TestGallery" )
192
+ {
193
+ $repositoryLocation = " https://dtlgalleryint.cloudapp.net/api/v2/package/"
194
+ }
195
+
196
+ else
197
+ {
198
+ $repositoryLocation = $repoName
199
+ }
200
+
201
+ if ([string ]::IsNullOrEmpty($apiKey ))
202
+ {
203
+ $apiKey = Get-ApiKey - repoName $repoName
204
+ }
205
+
206
+ $ModulesToDelete = Get-TargetModules - scope $scope - moduleList $listOfModules - moduleVersionTable $moduleVersionTable
207
+ $ModulesToDeleteName = $ModulesToDelete | ForEach-Object {$_.Name }
208
+ $azureModules = Find-Module Azure* - Repository $repoName
209
+ if ($PSCmdlet.ShouldProcess (" Module(s) being deleted: $ModulesToDeleteName " ))
210
+ {
211
+ $ModulesToDelete | ForEach-Object {
212
+ $version = $null
213
+ if (! [string ]::IsNullOrEmpty($_.Version ))
214
+ {
215
+ $version = $_.Version
216
+ }
217
+ elseif (! [string ]::IsNullOrEmpty($_.RequiredVersion ))
218
+ {
219
+ $version = $_.RequiredVersion
220
+ }
221
+ elseif (! [string ]::IsNullOrEmpty($_.MinimumVersion ))
222
+ {
223
+ $version = $_.MinimumVersion
224
+ }
225
+
226
+ $warning = Get-DependentModules - repoName $repoName - moduleName $_.Name - moduleVersion $version - allModules $ModulesToDelete - azureModules $azureModules
227
+ if (($warning -eq $null ) -or ($Force ) -or ($PSCmdlet.ShouldContinue ($warning , " Deleting package with orphaned dependencies" )))
228
+ {
229
+ & $nugetExe delete $_.Name $version - ApiKey $apiKey - Source $repositoryLocation - NonInteractive
230
+ }
231
+ }
232
+ }
0 commit comments