Skip to content

Commit 2c73ad3

Browse files
author
Kapil Borle
authored
Merge pull request #587 from PowerShell/FixSaveDscDependency
Fix save dsc dependency implementation
2 parents edba7cc + b9fa74c commit 2c73ad3

File tree

4 files changed

+58
-21
lines changed

4 files changed

+58
-21
lines changed

Engine/Commands/InvokeScriptAnalyzerCommand.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,10 @@ protected override void ProcessRecord()
250250
using (var moduleHandler = new ModuleDependencyHandler(rsp))
251251
{
252252
ScriptAnalyzer.Instance.ModuleHandler = moduleHandler;
253+
this.WriteVerbose(
254+
String.Format(
255+
"Temporary module location: {0}",
256+
moduleHandler.TempModulePath));
253257
ProcessInput();
254258
}
255259
}

Engine/Generic/ModuleDependencyHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,10 +445,10 @@ public static IEnumerable<string> GetModuleNameFromErrorExtent(ParseError error,
445445
}
446446

447447
// find a parameter named modulename
448-
int k;
448+
int k;
449449
for (k = 1; k < dynamicKywdAst.CommandElements.Count; k++)
450450
{
451-
var paramAst = dynamicKywdAst.CommandElements[1] as CommandParameterAst;
451+
var paramAst = dynamicKywdAst.CommandElements[k] as CommandParameterAst;
452452
// TODO match the initial letters only
453453
if (paramAst == null || !paramAst.ParameterName.Equals("ModuleName", StringComparison.OrdinalIgnoreCase))
454454
{

Engine/ScriptAnalyzer.cs

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,6 +1290,39 @@ private void BuildScriptPathList(
12901290
}
12911291
}
12921292

1293+
private bool TrySaveModules(ParseError[] errors, ScriptBlockAst scriptAst)
1294+
{
1295+
bool modulesSaved = false;
1296+
if (moduleHandler == null || errors == null || errors.Length == 0)
1297+
{
1298+
return modulesSaved;
1299+
}
1300+
foreach (var error in errors.Where(IsModuleNotFoundError))
1301+
{
1302+
var moduleNames = moduleHandler.GetUnavailableModuleNameFromErrorExtent(error, scriptAst);
1303+
if (moduleNames == null)
1304+
{
1305+
continue;
1306+
}
1307+
foreach(var moduleName in moduleNames)
1308+
{
1309+
this.outputWriter.WriteVerbose(
1310+
String.Format(
1311+
"Saving module {0} from PSGallery",
1312+
moduleName));
1313+
var moduleSaved = moduleHandler.TrySaveModule(moduleName);
1314+
if (!moduleSaved)
1315+
{
1316+
this.outputWriter.WriteVerbose(
1317+
String.Format(
1318+
"Cannot download {0} from PSGallery",
1319+
moduleName));
1320+
}
1321+
modulesSaved |= moduleSaved;
1322+
}
1323+
}
1324+
return modulesSaved;
1325+
}
12931326

12941327
private IEnumerable<DiagnosticRecord> AnalyzeFile(string filePath)
12951328
{
@@ -1315,23 +1348,8 @@ private IEnumerable<DiagnosticRecord> AnalyzeFile(string filePath)
13151348
return null;
13161349
}
13171350
#if !PSV3
1318-
bool parseAgain = false;
1319-
if (moduleHandler != null && errors != null && errors.Length > 0)
1320-
{
1321-
foreach (ParseError error in errors.Where(IsModuleNotFoundError))
1322-
{
1323-
var moduleNames = moduleHandler.GetUnavailableModuleNameFromErrorExtent(error, scriptAst);
1324-
if (moduleNames != null)
1325-
{
1326-
parseAgain |= moduleNames.Any(x => moduleHandler.TrySaveModule(x));
1327-
}
1328-
}
1329-
}
1330-
13311351
//try parsing again
1332-
//var oldDefault = Runspace.DefaultRunspace;
1333-
//Runspace.DefaultRunspace = moduleHandler.Runspace;
1334-
if (parseAgain)
1352+
if (TrySaveModules(errors, scriptAst))
13351353
{
13361354
scriptAst = Parser.ParseFile(filePath, out scriptTokens, out errors);
13371355
}

Tests/Engine/ModuleDependencyHandler.tests.ps1

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ Describe "Resolve DSC Resource Dependency" {
7272
{$moduleHandlerType::new($rsp)} | Should Throw
7373
$rsp.Dispose()
7474
}
75-
75+
7676
It "Extracts 1 module name" {
7777
$sb = @"
7878
{Configuration SomeConfiguration
@@ -84,9 +84,9 @@ Describe "Resolve DSC Resource Dependency" {
8484
$parseError = $null
8585
$ast = [System.Management.Automation.Language.Parser]::ParseInput($sb, [ref]$tokens, [ref]$parseError)
8686
$resultModuleNames = $moduleHandlerType::GetModuleNameFromErrorExtent($parseError[0], $ast).ToArray()
87-
$resultModuleNames[0] | Should Be 'SomeDscModule1'
87+
$resultModuleNames[0] | Should Be 'SomeDscModule1'
8888
}
89-
89+
9090
It "Extracts more than 1 module names" {
9191
$sb = @"
9292
{Configuration SomeConfiguration
@@ -102,6 +102,21 @@ Describe "Resolve DSC Resource Dependency" {
102102
$resultModuleNames[1] | Should Be 'SomeDscModule2'
103103
$resultModuleNames[2] | Should Be 'SomeDscModule3'
104104
}
105+
106+
107+
It "Extracts module names when ModuleName parameter is not the first named parameter" {
108+
$sb = @"
109+
{Configuration SomeConfiguration
110+
{
111+
Import-DscResource -Name SomeName -ModuleName SomeDscModule1
112+
}}
113+
"@
114+
$tokens = $null
115+
$parseError = $null
116+
$ast = [System.Management.Automation.Language.Parser]::ParseInput($sb, [ref]$tokens, [ref]$parseError)
117+
$resultModuleNames = $moduleHandlerType::GetModuleNameFromErrorExtent($parseError[0], $ast).ToArray()
118+
$resultModuleNames[0] | Should Be 'SomeDscModule1'
119+
}
105120
}
106121

107122
Context "Invoke-ScriptAnalyzer without switch" {

0 commit comments

Comments
 (0)