Skip to content

Commit 18a568a

Browse files
committed
Changes to allow reading of existing psd1 files properly and in their entirety.
1 parent 7c7bd5f commit 18a568a

File tree

3 files changed

+110
-10
lines changed

3 files changed

+110
-10
lines changed

tools/NetCorePsd1Sync/NetCorePsd1Sync/NetCoreDefinitionGenerator.cs

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using System.IO;
2020
using System.Linq;
2121
using System.Management.Automation;
22+
using System.Reflection;
2223
using NetCorePsd1Sync.Model;
2324
using NetCorePsd1Sync.Utility;
2425
using static NetCorePsd1Sync.Model.PsDefinitionConstants;
@@ -98,7 +99,7 @@ public static IEnumerable<Hashtable> GetHashtables(IEnumerable<string> filePaths
9899
}
99100
}
100101

101-
public static PsDefinition CreateNetCoreDefinition(Hashtable desktopData)
102+
public static PsDefinition CreateNewNetCoreDefinition(Hashtable desktopData)
102103
{
103104
var psData = new PsData();
104105
var desktopPsData = desktopData.GetValueAsHashtable("PrivateData").GetValueAsHashtable("PSData");
@@ -138,5 +139,80 @@ public static PsDefinition CreateNetCoreDefinition(Hashtable desktopData)
138139
PrivateData = new PrivateData { PsData = psData }
139140
};
140141
}
142+
143+
private static ModuleReference CreateModuleReferenceFromHashtable(Hashtable data)
144+
{
145+
var guid = data.GetValueAsStringOrDefault("GUID");
146+
return new ModuleReference
147+
{
148+
ModuleName = data.GetValueAsStringOrDefault("ModuleName"),
149+
ModuleVersion = data.GetValueAsVersionOrDefault("ModuleVersion"),
150+
Guid = String.IsNullOrEmpty(guid) ? (Guid?)null : Guid.Parse(guid)
151+
};
152+
}
153+
154+
155+
public static PsDefinition CreateDefinitionFromExisting(Hashtable existingDefinition, PsDefinitionHeader existingHeader)
156+
{
157+
var psData = new PsData();
158+
var existingPsData = existingDefinition.GetValueAsHashtable("PrivateData").GetValueAsHashtable("PSData");
159+
if (existingPsData.Any())
160+
{
161+
var licenseUri = existingPsData.GetValueAsStringOrDefault("LicenseUri");
162+
var projectUri = existingPsData.GetValueAsStringOrDefault("ProjectUri");
163+
var iconUri = existingPsData.GetValueAsStringOrDefault("IconUri");
164+
var requireLicenseAcceptance = existingPsData.GetValueAsStringOrDefault("RequireLicenseAcceptance");
165+
var externalModuleDependencies = existingDefinition.GetValueAsArray("ExternalModuleDependencies");
166+
psData = new PsData
167+
{
168+
Tags = existingPsData.GetValueAsStringListOrDefault("Tags"),
169+
LicenseUri = String.IsNullOrEmpty(licenseUri) ? null : new Uri(licenseUri),
170+
ProjectUri = String.IsNullOrEmpty(projectUri) ? null : new Uri(projectUri),
171+
IconUri = String.IsNullOrEmpty(iconUri) ? null : new Uri(iconUri),
172+
ReleaseNotes = existingPsData.GetValueAsStringOrDefault("ReleaseNotes"),
173+
Prerelease = existingPsData.GetValueAsStringOrDefault("Prerelease"),
174+
RequireLicenseAcceptance = String.IsNullOrEmpty(requireLicenseAcceptance) ? (bool?)null : Boolean.Parse(requireLicenseAcceptance),
175+
ExternalModuleDependencies = externalModuleDependencies.Any() ? externalModuleDependencies.Cast<Hashtable>().Select(CreateModuleReferenceFromHashtable).ToList() : null
176+
};
177+
}
178+
179+
var processorArchitecture = existingDefinition.GetValueAsStringOrDefault("ProcessorArchitecture");
180+
var requiredModules = existingDefinition.GetValueAsArray("RequiredModules");
181+
var moduleList = existingDefinition.GetValueAsArray("ModuleList");
182+
return new PsDefinition
183+
{
184+
ManifestHeader = existingHeader,
185+
RootModule = existingDefinition.GetValueAsStringOrDefault("RootModule"),
186+
ModuleVersion = existingDefinition.GetValueAsVersionOrDefault("ModuleVersion"),
187+
CompatiblePsEditions = existingDefinition.GetValueAsStringListOrDefault("CompatiblePSEditions"),
188+
Guid = Guid.Parse(existingDefinition.GetValueAsStringOrDefault("GUID")),
189+
Author = existingDefinition.GetValueAsStringOrDefault("Author"),
190+
CompanyName = existingDefinition.GetValueAsStringOrDefault("CompanyName"),
191+
Copyright = existingDefinition.GetValueAsStringOrDefault("Copyright"),
192+
Description = existingDefinition.GetValueAsStringOrDefault("Description"),
193+
PowerShellVersion = existingDefinition.GetValueAsVersionOrDefault("PowerShellVersion"),
194+
PowerShellHostName = existingDefinition.GetValueAsStringOrDefault("PowerShellHostName"),
195+
PowerShellHostVersion = existingDefinition.GetValueAsVersionOrDefault("PowerShellHostVersion"),
196+
DotNetFrameworkVersion = existingDefinition.GetValueAsVersionOrDefault("DotNetFrameworkVersion"),
197+
ClrVersion = existingDefinition.GetValueAsVersionOrDefault("CLRVersion"),
198+
ProcessorArchitecture = processorArchitecture != null ? Enum.Parse<ProcessorArchitecture>(processorArchitecture) : (ProcessorArchitecture?)null,
199+
RequiredModules = requiredModules.Any() ? requiredModules.Cast<Hashtable>().Select(CreateModuleReferenceFromHashtable).ToList() : null,
200+
RequiredAssemblies = existingDefinition.GetValueAsStringListOrDefault("RequiredAssemblies"),
201+
ScriptsToProcess = existingDefinition.GetValueAsStringListOrDefault("ScriptsToProcess"),
202+
TypesToProcess = existingDefinition.GetValueAsStringListOrDefault("TypesToProcess"),
203+
FormatsToProcess = existingDefinition.GetValueAsStringListOrDefault("FormatsToProcess"),
204+
NestedModules = existingDefinition.GetValueAsStringListOrDefault("NestedModules")?.Select(m => new ModuleReference { ModuleName = m }).ToList(),
205+
FunctionsToExport = existingDefinition.GetValueAsStringListOrDefault("FunctionsToExport"),
206+
CmdletsToExport = existingDefinition.GetValueAsStringListOrDefault("CmdletsToExport"),
207+
VariablesToExport = existingDefinition.GetValueAsStringListOrDefault("VariablesToExport"),
208+
AliasesToExport = existingDefinition.GetValueAsStringListOrDefault("AliasesToExport"),
209+
DscResourcesToExport = existingDefinition.GetValueAsStringListOrDefault("DscResourcesToExport"),
210+
ModuleList = moduleList.Any() ? moduleList.Cast<Hashtable>().Select(CreateModuleReferenceFromHashtable).ToList() : null,
211+
FileList = existingDefinition.GetValueAsStringListOrDefault("FileList"),
212+
PrivateData = new PrivateData { PsData = psData },
213+
HelpInfoUri = existingDefinition.GetValueAsStringOrDefault("HelpInfoURI"),
214+
DefaultCommandPrefix = existingDefinition.GetValueAsStringOrDefault("DefaultCommandPrefix")
215+
};
216+
}
141217
}
142218
}

tools/NetCorePsd1Sync/NetCorePsd1Sync/Program.cs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using System.IO;
1919
using System.Linq;
2020
using System.Management.Automation;
21+
using NetCorePsd1Sync.Model;
2122
using NetCorePsd1Sync.Utility;
2223
using static NetCorePsd1Sync.NetCoreDefinitionGenerator;
2324

@@ -40,7 +41,7 @@ public static class Program
4041

4142
public static void Main(string[] args)
4243
{
43-
var rmPath = args.FirstOrDefault(a => !ModeMap.ContainsKey(a.ToLower())) ?? @"..\..\..\src\ResourceManager";
44+
var rmPath = args.FirstOrDefault(a => !ModeMap.ContainsKey(a.ToLower()) && !Version.TryParse(a, out var _)) ?? @"..\..\..\src\ResourceManager";
4445
if (!Directory.Exists(rmPath))
4546
{
4647
throw new ArgumentException($"Directory [{rmPath}] does not exist");
@@ -65,13 +66,22 @@ private static void UpdateModuleVersions(string rmPath, Version newVersion)
6566

6667
foreach (var netCoreHashtable in netCoreHashTables)
6768
{
68-
var netCoreDefinition = CreateNetCoreDefinition(netCoreHashtable);
69+
var netCoreFilePath = netCoreHashtable.GetValueAsString("FilePath");
70+
var definitionContent = File.ReadAllLines(netCoreFilePath);
71+
const string moduleNameLeader = "# Module manifest for module ";
72+
var headerModuleName = definitionContent.First(c => c.StartsWith(moduleNameLeader)).Replace(moduleNameLeader, String.Empty).Replace("'", String.Empty);
73+
const string authorLeader = "# Generated by: ";
74+
var headerAuthor = definitionContent.First(c => c.StartsWith(authorLeader)).Replace(authorLeader, String.Empty);
75+
const string dateLeader = "# Generated on: ";
76+
var headerDate = DateTime.Parse(definitionContent.First(c => c.StartsWith(dateLeader)).Replace(dateLeader, String.Empty));
77+
Console.WriteLine($"Updating {netCoreFilePath} to version {newVersion}");
78+
var netCoreDefinition = CreateDefinitionFromExisting(netCoreHashtable, new PsDefinitionHeader { ModuleName = headerModuleName, Author = headerAuthor, Date = headerDate });
6979
netCoreDefinition.ModuleVersion = newVersion;
7080
if (netCoreDefinition.RequiredModules.Any(rm => rm.ModuleName == "AzureRM.Profile.Netcore"))
7181
{
7282
netCoreDefinition.RequiredModules.First(rm => rm.ModuleName == "AzureRM.Profile.Netcore").ModuleVersion = newVersion;
7383
}
74-
File.WriteAllLines(netCoreHashtable.GetValueAsString("FilePath"), netCoreDefinition.ToDefinitionEntry());
84+
File.WriteAllLines(netCoreFilePath, netCoreDefinition.ToDefinitionEntry());
7585
}
7686
}
7787

@@ -144,13 +154,13 @@ private static void CreateDefinitionFiles(string rmPath)
144154
{
145155
var netCoreFilePath = ConvertDesktopToNetCorePath(desktopHashtable.GetValueAsString("FilePath"));
146156
Console.WriteLine($"Creating {netCoreFilePath}");
147-
var netCoreDefinition = CreateNetCoreDefinition(desktopHashtable);
157+
var netCoreDefinition = CreateNewNetCoreDefinition(desktopHashtable);
148158
if (File.Exists(netCoreFilePath))
149159
{
150160
using (var powershell = PowerShell.Create())
151161
{
152162
var netCoreHashtable = GetHashtable(powershell, netCoreFilePath);
153-
netCoreDefinition = CreateNetCoreDefinition(netCoreHashtable);
163+
netCoreDefinition = CreateNewNetCoreDefinition(netCoreHashtable);
154164
var rootModule = netCoreHashtable.GetValueAsString("RootModule");
155165
netCoreDefinition.RootModule = rootModule == String.Empty ? null : rootModule;
156166
netCoreDefinition.Guid = new Guid(netCoreHashtable.GetValueAsString("GUID"));

tools/NetCorePsd1Sync/NetCorePsd1Sync/Utility/HashtableExtensions.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,33 @@ namespace NetCorePsd1Sync.Utility
2121
{
2222
internal static class HashtableExtensions
2323
{
24-
public static string GetValueAsString(this Hashtable hashtable, string key) => hashtable[key]?.ToString() ?? String.Empty;
24+
public static string GetValueAsString(this Hashtable hashtable, string key) => GetValueAsStringOrDefault(hashtable, key) ?? String.Empty;
25+
26+
public static string GetValueAsStringOrDefault(this Hashtable hashtable, string key) => hashtable[key]?.ToString();
27+
28+
public static Version GetValueAsVersion(this Hashtable hashtable, string key) => GetValueAsVersionOrDefault(hashtable, key) ?? new Version();
29+
30+
public static Version GetValueAsVersionOrDefault(this Hashtable hashtable, string key)
31+
{
32+
var valueAsString = GetValueAsStringOrDefault(hashtable, key);
33+
if (valueAsString == null || !Version.TryParse(valueAsString, out var version)) return null;
34+
return version;
35+
}
2536

2637
public static object[] GetValueAsArray(this Hashtable hashtable, string key) => hashtable[key] as object[] ?? new object[]{};
2738

2839
public static Hashtable GetValueAsHashtable(this Hashtable hashtable, string key) => hashtable[key] as Hashtable ?? new Hashtable();
2940

30-
public static List<string> GetValueAsStringList(this Hashtable hashtable, string key)
41+
public static List<string> GetValueAsStringList(this Hashtable hashtable, string key) => GetValueAsStringListOrDefault(hashtable, key) ?? new List<string>();
42+
43+
public static List<string> GetValueAsStringListOrDefault(this Hashtable hashtable, string key)
3144
{
3245
if (hashtable[key] is string stringValue)
3346
{
34-
return new List<string>{stringValue};
47+
return new List<string> { stringValue };
3548
}
36-
return hashtable.GetValueAsArray(key).OfType<string>().ToList();
49+
var stringList = hashtable.GetValueAsArray(key).OfType<string>().ToList();
50+
return stringList.Any() ? stringList : null;
3751
}
3852

3953
public static bool Any(this Hashtable hashtable) => hashtable.Count > 0;

0 commit comments

Comments
 (0)