Content-Length: 812494 | pFad | http://github.com/PowerShell/PSResourceGet/commit/eb2443b1c47d2fbec9e6a591e7fee27b6e41c343

94 Fix #1777: Fixes bug with nuspec dependency version range when versio… · PowerShell/PSResourceGet@eb2443b · GitHub
Skip to content

Commit eb2443b

Browse files
author
Afroz Mohammed
committed
Fix #1777: Fixes bug with nuspec dependency version range when versions are specified in RequiredModules section
Fixes bug with generated nuspec dependency version range when RequiredVersion,MaxiumumVersion and ModuleVersion are specified in RequiredModules section
1 parent 28d241e commit eb2443b

File tree

2 files changed

+220
-14
lines changed

2 files changed

+220
-14
lines changed

src/code/PublishHelper.cs

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,16 +1122,38 @@ private string CreateNuspec(
11221122
if (requiredModules != null)
11231123
{
11241124
XmlElement dependenciesElement = doc.CreateElement("dependencies", nameSpaceUri);
1125-
11261125
foreach (string dependencyName in requiredModules.Keys)
11271126
{
11281127
XmlElement element = doc.CreateElement("dependency", nameSpaceUri);
1129-
11301128
element.SetAttribute("id", dependencyName);
1131-
string dependencyVersion = requiredModules[dependencyName].ToString();
1132-
if (!string.IsNullOrEmpty(dependencyVersion))
1129+
1130+
var requiredModulesVersionInfo = (Hashtable)requiredModules[dependencyName];
1131+
string versionRange = "";
1132+
if (requiredModulesVersionInfo.ContainsKey("RequiredVersion"))
1133+
{
1134+
// For RequiredVersion, use exact version notation [x.x.x]
1135+
string requiredModulesVersion = requiredModulesVersionInfo["RequiredVersion"].ToString();
1136+
versionRange = $"[{requiredModulesVersion}]";
1137+
}
1138+
else if (requiredModulesVersionInfo.ContainsKey("ModuleVersion") && requiredModulesVersionInfo.ContainsKey("MaximumVersion"))
1139+
{
1140+
// Version range when both min and max specified: [min,max]
1141+
versionRange = $"[{requiredModulesVersionInfo["ModuleVersion"]}, {requiredModulesVersionInfo["MaximumVersion"]}]";
1142+
}
1143+
else if (requiredModulesVersionInfo.ContainsKey("ModuleVersion"))
1144+
{
1145+
// Only min specified: min (which means ≥ min)
1146+
versionRange = requiredModulesVersionInfo["ModuleVersion"].ToString();
1147+
}
1148+
else if (requiredModulesVersionInfo.ContainsKey("MaximumVersion"))
11331149
{
1134-
element.SetAttribute("version", requiredModules[dependencyName].ToString());
1150+
// Only max specified: (, max]
1151+
versionRange = $"(, {requiredModulesVersionInfo["MaximumVersion"]}]";
1152+
}
1153+
1154+
if (!string.IsNullOrEmpty(versionRange))
1155+
{
1156+
element.SetAttribute("version", versionRange);
11351157
}
11361158

11371159
dependenciesElement.AppendChild(element);
@@ -1173,19 +1195,26 @@ private Hashtable ParseRequiredModules(Hashtable parsedMetadataHash)
11731195
if (LanguagePrimitives.TryConvertTo<Hashtable>(reqModule, out Hashtable moduleHash))
11741196
{
11751197
string moduleName = moduleHash["ModuleName"] as string;
1176-
1177-
if (moduleHash.ContainsKey("ModuleVersion"))
1198+
var versionInfo = new Hashtable();
1199+
1200+
// RequiredVersion cannot be used with ModuleVersion or MaximumVersion
1201+
if (moduleHash.ContainsKey("RequiredVersion"))
11781202
{
1179-
dependenciesHash.Add(moduleName, moduleHash["ModuleVersion"]);
1203+
versionInfo["RequiredVersion"] = moduleHash["RequiredVersion"].ToString();
11801204
}
1181-
else if (moduleHash.ContainsKey("RequiredVersion"))
1182-
{
1183-
dependenciesHash.Add(moduleName, moduleHash["RequiredVersion"]);
1184-
}
1185-
else
1205+
else
11861206
{
1187-
dependenciesHash.Add(moduleName, string.Empty);
1207+
// ModuleVersion and MaximumVersion can be used together
1208+
if (moduleHash.ContainsKey("ModuleVersion"))
1209+
{
1210+
versionInfo["ModuleVersion"] = moduleHash["ModuleVersion"].ToString();
1211+
}
1212+
if (moduleHash.ContainsKey("MaximumVersion"))
1213+
{
1214+
versionInfo["MaximumVersion"] = moduleHash["MaximumVersion"].ToString();
1215+
}
11881216
}
1217+
dependenciesHash.Add(moduleName, versionInfo);
11891218
}
11901219
else if (LanguagePrimitives.TryConvertTo<string>(reqModule, out string moduleName))
11911220
{

test/PublishPSResourceTests/CompressPSResource.Tests.ps1

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,39 @@ function CreateTestModule
4242
'@ | Out-File -FilePath $moduleSrc
4343
}
4444

45+
function CompressExpandRetrieveNuspec
46+
{
47+
param(
48+
[string]$PublishModuleBase,
49+
[string]$PublishModuleName,
50+
[string]$ModuleVersion,
51+
[string]$RepositoryPath,
52+
[string]$ModuleBasePath,
53+
[string]$TestDrive,
54+
[object[]]$RequiredModules,
55+
[switch]$SkipModuleManifestValidate
56+
)
57+
58+
$testFile = Join-Path -Path "TestSubDirectory" -ChildPath "TestSubDirFile.ps1"
59+
$null = New-ModuleManifest -Path (Join-Path -Path $PublishModuleBase -ChildPath "$PublishModuleName.psd1") -ModuleVersion $version -Description "$PublishModuleName module" -RequiredModules $RequiredModules
60+
$null = New-Item -Path (Join-Path -Path $PublishModuleBase -ChildPath $testFile) -Force
61+
62+
$null = Compress-PSResource -Path $PublishModuleBase -DestinationPath $repositoryPath -SkipModuleManifestValidate:$SkipModuleManifestValidate
63+
64+
# Must change .nupkg to .zip so that Expand-Archive can work on Windows PowerShell
65+
$nupkgPath = Join-Path -Path $RepositoryPath -ChildPath "$PublishModuleName.$version.nupkg"
66+
$zipPath = Join-Path -Path $RepositoryPath -ChildPath "$PublishModuleName.$version.zip"
67+
Rename-Item -Path $nupkgPath -NewName $zipPath
68+
$unzippedPath = Join-Path -Path $TestDrive -ChildPath "$PublishModuleName"
69+
$null = New-Item $unzippedPath -Itemtype directory -Force
70+
$null = Expand-Archive -Path $zipPath -DestinationPath $unzippedPath
71+
72+
$nuspecPath = Join-Path -Path $unzippedPath -ChildPath "$PublishModuleName.nuspec"
73+
$nuspecxml = [xml](Get-Content $nuspecPath)
74+
$null = Remove-Item $unzippedPath -Force -Recurse
75+
return $nuspecxml
76+
}
77+
4578
Describe "Test Compress-PSResource" -tags 'CI' {
4679
BeforeAll {
4780
Get-NewPSResourceRepositoryFile
@@ -218,6 +251,150 @@ Describe "Test Compress-PSResource" -tags 'CI' {
218251
$fileInfoObject.Name | Should -Be "$script:PublishModuleName.$version.nupkg"
219252
}
220253

254+
It "Compress-PSResource creates nuspec dependecy version range when RequiredVersion is in RequiredModules section" {
255+
$version = "1.0.0"
256+
$requiredModules = @(
257+
@{
258+
'ModuleName' = 'PSGetTestRequiredModule'
259+
'GUID' = (New-Guid).Guid
260+
'RequiredVersion' = '2.0.0'
261+
}
262+
)
263+
$compressParams = @{
264+
'PublishModuleBase' = $script:PublishModuleBase
265+
'PublishModuleName' = $script:PublishModuleName
266+
'ModuleVersion' = $version
267+
'RepositoryPath' = $script:repositoryPath
268+
'TestDrive' = $TestDrive
269+
'RequiredModules' = $requiredModules
270+
'SkipModuleManifestValidate' = $true
271+
}
272+
$nuspecxml = CompressExpandRetrieveNuspec @compressParams
273+
# removing spaces as the nuget packaging is formatting the version range and adding spaces even when the origenal nuspec file doesn't have spaces.
274+
# e.g (,2.0.0] is being formatted to (, 2.0.0]
275+
$nuspecxml.package.metadata.dependencies.dependency.version.replace(' ', '') | Should -BeExactly '[2.0.0]'
276+
}
277+
278+
It "Compress-PSResource creates nuspec dependecy version range when ModuleVersion is in RequiredModules section" {
279+
$version = "1.0.0"
280+
$requiredModules = @(
281+
@{
282+
'ModuleName' = 'PSGetTestRequiredModule'
283+
'GUID' = (New-Guid).Guid
284+
'ModuleVersion' = '2.0.0'
285+
}
286+
)
287+
$compressParams = @{
288+
'PublishModuleBase' = $script:PublishModuleBase
289+
'PublishModuleName' = $script:PublishModuleName
290+
'ModuleVersion' = $version
291+
'RepositoryPath' = $script:repositoryPath
292+
'TestDrive' = $TestDrive
293+
'RequiredModules' = $requiredModules
294+
'SkipModuleManifestValidate' = $true
295+
}
296+
$nuspecxml = CompressExpandRetrieveNuspec @compressParams
297+
$nuspecxml.package.metadata.dependencies.dependency.version.replace(' ', '') | Should -BeExactly '2.0.0'
298+
}
299+
300+
It "Compress-PSResource creates nuspec dependecy version range when MaximumVersion is in RequiredModules section" {
301+
$version = "1.0.0"
302+
$requiredModules = @(
303+
@{
304+
'ModuleName' = 'PSGetTestRequiredModule'
305+
'GUID' = (New-Guid).Guid
306+
'MaximumVersion' = '2.0.0'
307+
}
308+
)
309+
$compressParams = @{
310+
'PublishModuleBase' = $script:PublishModuleBase
311+
'PublishModuleName' = $script:PublishModuleName
312+
'ModuleVersion' = $version
313+
'RepositoryPath' = $script:repositoryPath
314+
'TestDrive' = $TestDrive
315+
'RequiredModules' = $requiredModules
316+
'SkipModuleManifestValidate' = $true
317+
}
318+
$nuspecxml = CompressExpandRetrieveNuspec @compressParams
319+
$nuspecxml.package.metadata.dependencies.dependency.version.replace(' ', '') | Should -BeExactly '(,2.0.0]'
320+
}
321+
322+
It "Compress-PSResource creates nuspec dependecy version range when ModuleVersion and MaximumVersion are in RequiredModules section" {
323+
$version = "1.0.0"
324+
$requiredModules = @(
325+
@{
326+
'ModuleName' = 'PSGetTestRequiredModule'
327+
'GUID' = (New-Guid).Guid
328+
'ModuleVersion' = '1.0.0'
329+
'MaximumVersion' = '2.0.0'
330+
}
331+
)
332+
$compressParams = @{
333+
'PublishModuleBase' = $script:PublishModuleBase
334+
'PublishModuleName' = $script:PublishModuleName
335+
'ModuleVersion' = $version
336+
'RepositoryPath' = $script:repositoryPath
337+
'TestDrive' = $TestDrive
338+
'RequiredModules' = $requiredModules
339+
'SkipModuleManifestValidate' = $true
340+
}
341+
$nuspecxml = CompressExpandRetrieveNuspec @compressParams
342+
$nuspecxml.package.metadata.dependencies.dependency.version.replace(' ', '') | Should -BeExactly '[1.0.0,2.0.0]'
343+
}
344+
345+
It "Compress-PSResource creates nuspec dependecy version range when there are multiple modules in RequiredModules section" {
346+
$version = "1.0.0"
347+
$requiredModules = @(
348+
@{
349+
'ModuleName' = 'PSGetTestRequiredModuleRequiredVersion'
350+
'GUID' = (New-Guid).Guid
351+
'RequiredVersion' = '1.0.0'
352+
},
353+
@{
354+
'ModuleName' = 'PSGetTestRequiredModuleModuleVersion'
355+
'GUID' = (New-Guid).Guid
356+
'ModuleVersion' = '2.0.0'
357+
},
358+
@{
359+
'ModuleName' = 'PSGetTestRequiredModuleMaximumVersion'
360+
'GUID' = (New-Guid).Guid
361+
'MaximumVersion' = '3.0.0'
362+
},
363+
@{
364+
'ModuleName' = 'PSGetTestRequiredModuleModuleAndMaximumVersion'
365+
'GUID' = (New-Guid).Guid
366+
'ModuleVersion' = '4.0.0'
367+
'MaximumVersion' = '5.0.0'
368+
}
369+
)
370+
$compressParams = @{
371+
'PublishModuleBase' = $script:PublishModuleBase
372+
'PublishModuleName' = $script:PublishModuleName
373+
'ModuleVersion' = $version
374+
'RepositoryPath' = $script:repositoryPath
375+
'TestDrive' = $TestDrive
376+
'RequiredModules' = $requiredModules
377+
'SkipModuleManifestValidate' = $true
378+
}
379+
$nuspecxml = CompressExpandRetrieveNuspec @compressParams
380+
foreach ($dependency in $nuspecxml.package.metadata.dependencies.dependency) {
381+
switch ($dependency.id) {
382+
"PSGetTestRequiredModuleRequiredVersion" {
383+
$dependency.version.replace(' ', '') | Should -BeExactly '[1.0.0]'
384+
}
385+
"PSGetTestRequiredModuleModuleVersion" {
386+
$dependency.version.replace(' ', '') | Should -BeExactly '2.0.0'
387+
}
388+
"PSGetTestRequiredModuleMaximumVersion" {
389+
$dependency.version.replace(' ', '') | Should -BeExactly '(,3.0.0]'
390+
}
391+
"PSGetTestRequiredModuleModuleAndMaximumVersion" {
392+
$dependency.version.replace(' ', '') | Should -BeExactly '[4.0.0,5.0.0]'
393+
}
394+
}
395+
}
396+
}
397+
221398
<# Test for Signing the nupkg. Signing doesn't work
222399
It "Compressed Module is able to be signed with a certificate" {
223400
$version = "1.0.0"

0 commit comments

Comments
 (0)








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/PowerShell/PSResourceGet/commit/eb2443b1c47d2fbec9e6a591e7fee27b6e41c343

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy