Fix decompiling multiple AppSearches with nested searches.
Sean Hall committed
Nov 26, 2019 at 08:24 UTC
dda4a326407eb8a0fb5d094ee1e2b5b85d419042
3 files changed
+35
-10
src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
+15
-9
@@ -2000,7 +2000,7 @@ namespace WixToolset.Core.WindowsInstaller
2000
var drLocators = new Hashtable();
2001
var locators = new Hashtable();
2002
var usedSearchElements = new Hashtable();
2003
- var unusedSearchElements = new ArrayList();
2003
+ var unusedSearchElements = new Dictionary<string, Wix.IParentElement>();
2004
2005
Wix.ComplianceCheck complianceCheck = null;
2006
@@ -2131,6 +2131,7 @@ namespace WixToolset.Core.WindowsInstaller
2131
}
2132
else if ("DrLocator" == locatorRow.TableDefinition.Name && null != locatorRow[1])
2133
{
2134
+ var drSearchElement = (Wix.DirectorySearch)searchElement;
2135
var parentSignature = Convert.ToString(locatorRow[1]);
2136
2137
if ("CCP_DRIVE" == parentSignature)
@@ -2266,7 +2267,7 @@ namespace WixToolset.Core.WindowsInstaller
2267
}
2268
2269
parentSearchElement = directorySeachRef;
2269
- unusedSearchElements.Add(directorySeachRef);
2270
+ unusedSearchElements.Add(directorySeachRef.Id, directorySeachRef);
2271
}
2272
2273
if (!usedSearchElements.Contains(searchElement))
@@ -2305,7 +2306,7 @@ namespace WixToolset.Core.WindowsInstaller
2306
// keep track of unused DrLocator rows
2307
if (!usedDrLocator)
2308
{
2308
- unusedSearchElements.Add(searchElement);
2309
+ unusedSearchElements.Add(drSearchElement.Id, drSearchElement);
2310
}
2311
}
2312
else
@@ -2370,10 +2371,13 @@ namespace WixToolset.Core.WindowsInstaller
2371
}
2372
else
2373
{
2373
- if ("DrLocator" == locatorRow.TableDefinition.Name ||
2374
- "RegLocator" == locatorRow.TableDefinition.Name)
2374
+ if (searchElement is Wix.DirectorySearch directorySearch)
2375
{
2376
- unusedSearchElements.Add(searchElement);
2376
+ unusedSearchElements.Add(directorySearch.Id, directorySearch);
2377
+ }
2378
+ else if (searchElement is Wix.RegistrySearch registrySearch)
2379
+ {
2380
+ unusedSearchElements.Add(registrySearch.Id, registrySearch);
2381
}
2382
else
2383
{
@@ -2390,8 +2394,12 @@ namespace WixToolset.Core.WindowsInstaller
2394
}
2395
}
2396
2393
- foreach (Wix.IParentElement unusedSearchElement in unusedSearchElements)
2397
+ // Iterate through the unused elements through a sorted list of their ids so the output is deterministic.
2398
+ var unusedSearchElementKeys = unusedSearchElements.Keys.ToList();
2399
+ unusedSearchElementKeys.Sort();
2400
+ foreach (var unusedSearchElementKey in unusedSearchElementKeys)
2401
{
2402
+ var unusedSearchElement = unusedSearchElements[unusedSearchElementKey];
2403
var used = false;
2404
2405
Wix.DirectorySearch leafDirectorySearch = null;
@@ -2422,13 +2430,11 @@ namespace WixToolset.Core.WindowsInstaller
2430
2431
property.AddChild(unusedSearchSchemaElement);
2432
used = true;
2425
- break;
2433
}
2434
else if (ccpSearches.Contains(leafDirectorySearch.Id))
2435
{
2436
complianceCheck.AddChild(unusedSearchSchemaElement);
2437
used = true;
2431
- break;
2438
}
2439
else
2440
{
src/test/WixToolsetTest.CoreIntegration/TestData/AppSearch/DecompiledNestedDirSearchUnderRegSearch.wxs
+20
-1
@@ -1,6 +1,6 @@
1
<?xml version="1.0" encoding="utf-8"?>
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
- <Product Id="{F71CC1C8-8EDC-4FCD-8946-D92AE30B3ABE}" Codepage="1252" Language="1033" Manufacturer="Example Corporation" Name="MsiPackage" UpgradeCode="{12E4699F-E774-4D05-8A01-5BDD41BBA127}" Version="1.0.0.0">
3
+ <Product Id="{33C58183-7333-4257-AEFD-6705DA66E617}" Codepage="1252" Language="1033" Manufacturer="Example Corporation" Name="MsiPackage" UpgradeCode="{12E4699F-E774-4D05-8A01-5BDD41BBA127}" Version="1.0.0.0">
4
<Package Description="MsiPackage" InstallerVersion="500" Languages="1033" Manufacturer="Example Corporation" Platform="x86" />
5
<Directory Id="TARGETDIR" Name="SourceDir">
6
<Directory Id="ProgramFilesFolder">
@@ -17,6 +17,25 @@
17
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
18
<Media Id="1" />
19
<Property Id="ALLUSERS" Value="1" />
20
+ <Property Id="SAMPLEREGFOUND">
21
+ <RegistrySearch Id="RegSearch" Root="HKLM" Key="Reg" Type="raw" Win64="no" />
22
+ </Property>
23
+ <Property Id="NESTEDDIRFOUND">
24
+ <RegistrySearch Id="ARegKeySearch" Root="HKLM" Key="ARegKey" Type="raw" Win64="no">
25
+ <DirectorySearch Id="TopDirSearch" Path="TopDir">
26
+ <DirectorySearch Id="SecondDirSearch" Path="SecondDir">
27
+ <DirectorySearch Id="ThirdDirSearch" Path="ThirdDir">
28
+ <DirectorySearch Id="FourthDirSearch" Path="FourthDir" />
29
+ </DirectorySearch>
30
+ </DirectorySearch>
31
+ </DirectorySearch>
32
+ </RegistrySearch>
33
+ </Property>
34
+ <Property Id="SAMPLENESTEDDIRFOUND">
35
+ <RegistrySearch Id="NestedRegSearch" Root="HKLM" Key="NestedReg" Type="raw" Win64="no">
36
+ <DirectorySearch Id="SampleNestedDirSearch" Path="NestedDir" />
37
+ </RegistrySearch>
38
+ </Property>
39
<Property Id="SAMPLEDIRFOUND">
40
<RegistrySearch Id="SubRegSearch" Root="HKLM" Key="SampleReg" Type="raw" Win64="no">
41
<DirectorySearch Id="SampleDirSearch" Path="SampleDir">
src/test/WixToolsetTest.CoreIntegration/TestData/AppSearch/NestedDirSearchUnderRegSearch.msi
Binary files a/src/test/WixToolsetTest.CoreIntegration/TestData/AppSearch/NestedDirSearchUnderRegSearch.msi and b/src/test/WixToolsetTest.CoreIntegration/TestData/AppSearch/NestedDirSearchUnderRegSearch.msi differ