@joebigelow / wix / commits / dda4a326

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