System.Data.SQLite
Check-in [7b20491eb4]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Fix long-standing issue with 'what-if' mode for the design-time components installer that caused some registry key names to be reported incorrectly in the generated log file. Updated the expected test results for 'installer-1.*' to account for this fix. More work on registry operation logging.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 7b20491eb4aef99498ed2c96ce355cd602b557a1
User & Date: mistachkin 2017-12-07 05:28:27
Context
2017-12-09
23:42
Further refinements to the design-time components installer. check-in: 7f0ac35baf user: mistachkin tags: trunk
2017-12-07
05:28
Fix long-standing issue with 'what-if' mode for the design-time components installer that caused some registry key names to be reported incorrectly in the generated log file. Updated the expected test results for 'installer-1.*' to account for this fix. More work on registry operation logging. check-in: 7b20491eb4 user: mistachkin tags: trunk
01:27
When cloning a MockRegistryKey, be sure to preserve its subKeyName field as well. check-in: c98795a9a2 user: mistachkin tags: trunk
Changes
Hide Diffs Side-by-Side Diffs Ignore Whitespace Patch

Changes to Tests/data/Installer_Test_Vs2005.log.

    23     23   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ID", value = 400
    24     24   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "InprocServer32", value = "[file nativename [file join $::env(windir) [expr {$is64 ? "SysWOW64" : "system32"}] mscoree.dll]]"
    25     25   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "CompanyName", value = "https://system.data.sqlite.org/"
    26     26   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "MinEdition", value = "standard"
    27     27   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductName", value = "System.Data.SQLite Designer Package"
    28     28   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductVersion", value = "1.0"
    29     29   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", subKeyName = "Toolbox"
    30         -Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\Toolbox", name = "Default Items", value = 3
           30  +Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}\Toolbox", name = "Default Items", value = 3
    31     31   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0", subKeyName = "Menus", writable = True
    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Menus", name = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", value = ", 1000, 3"
    33     33   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0", subKeyName = "Services", writable = True
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Services", subKeyName = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}"
    35     35   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = <null>, value = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}"
    36     36   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = "Name", value = "System.Data.SQLite Designer Service"
    37     37   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\8.0", writable = False
................................................................................
    60     60   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    61     61   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    62     62   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\8.0", writable = False
    63     63   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0", name = "InstallDir", defaultValue = <null>
    64     64   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 8} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 8} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    65     65   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesRead = 5, keyValuesWritten = 23, keyValuesDeleted = 0
    66     66   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
           67  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    67     68   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2008.log.

    33     33   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ID", value = 400
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "InprocServer32", value = "[file nativename [file join $::env(windir) [expr {$is64 ? "SysWOW64" : "system32"}] mscoree.dll]]"
    35     35   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "CompanyName", value = "https://system.data.sqlite.org/"
    36     36   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "MinEdition", value = "standard"
    37     37   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductName", value = "System.Data.SQLite Designer Package"
    38     38   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductVersion", value = "1.0"
    39     39   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", subKeyName = "Toolbox"
    40         -Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\Toolbox", name = "Default Items", value = 3
           40  +Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}\Toolbox", name = "Default Items", value = 3
    41     41   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0", subKeyName = "Menus", writable = True
    42     42   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Menus", name = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", value = ", 1000, 3"
    43     43   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0", subKeyName = "Services", writable = True
    44     44   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Services", subKeyName = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}"
    45     45   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = <null>, value = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}"
    46     46   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = "Name", value = "System.Data.SQLite Designer Service"
    47     47   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\9.0", writable = False
................................................................................
    70     70   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    71     71   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    72     72   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\9.0", writable = False
    73     73   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0", name = "InstallDir", defaultValue = <null>
    74     74   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 9.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 9.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    75     75   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 13, subKeysDeleted = 2, keyValuesRead = 6, keyValuesWritten = 24, keyValuesDeleted = 0
    76     76   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
           77  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    77     78   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2010.log.

    26     26   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ID", value = 400
    27     27   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "InprocServer32", value = "[file nativename [file join $::env(windir) [expr {$is64 ? "SysWOW64" : "system32"}] mscoree.dll]]"
    28     28   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "CompanyName", value = "https://system.data.sqlite.org/"
    29     29   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "MinEdition", value = "standard"
    30     30   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductName", value = "System.Data.SQLite Designer Package"
    31     31   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductVersion", value = "1.0"
    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", subKeyName = "Toolbox"
    33         -Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\Toolbox", name = "Default Items", value = 3
           33  +Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}\Toolbox", name = "Default Items", value = 3
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0", subKeyName = "Menus", writable = True
    35     35   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Menus", name = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", value = ", 1000, 3"
    36     36   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0", subKeyName = "Services", writable = True
    37     37   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Services", subKeyName = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}"
    38     38   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = <null>, value = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}"
    39     39   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = "Name", value = "System.Data.SQLite Designer Service"
    40     40   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\10.0", writable = False
................................................................................
    63     63   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    64     64   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    65     65   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\10.0", writable = False
    66     66   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0", name = "InstallDir", defaultValue = <null>
    67     67   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 10.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 10.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    68     68   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesRead = 5, keyValuesWritten = 23, keyValuesDeleted = 0
    69     69   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
           70  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    70     71   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2012.log.

    26     26   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ID", value = 400
    27     27   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "InprocServer32", value = "[file nativename [file join $::env(windir) [expr {$is64 ? "SysWOW64" : "system32"}] mscoree.dll]]"
    28     28   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "CompanyName", value = "https://system.data.sqlite.org/"
    29     29   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "MinEdition", value = "standard"
    30     30   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductName", value = "System.Data.SQLite Designer Package"
    31     31   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductVersion", value = "1.0"
    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", subKeyName = "Toolbox"
    33         -Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\Toolbox", name = "Default Items", value = 3
           33  +Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}\Toolbox", name = "Default Items", value = 3
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0", subKeyName = "Menus", writable = True
    35     35   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Menus", name = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", value = ", 1000, 3"
    36     36   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0", subKeyName = "Services", writable = True
    37     37   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Services", subKeyName = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}"
    38     38   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = <null>, value = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}"
    39     39   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = "Name", value = "System.Data.SQLite Designer Service"
    40     40   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\11.0", writable = False
................................................................................
    63     63   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    64     64   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    65     65   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\11.0", writable = False
    66     66   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0", name = "InstallDir", defaultValue = <null>
    67     67   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 11.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 11.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    68     68   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesRead = 5, keyValuesWritten = 23, keyValuesDeleted = 0
    69     69   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
           70  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    70     71   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2013.log.

    26     26   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ID", value = 400
    27     27   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "InprocServer32", value = "[file nativename [file join $::env(windir) [expr {$is64 ? "SysWOW64" : "system32"}] mscoree.dll]]"
    28     28   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "CompanyName", value = "https://system.data.sqlite.org/"
    29     29   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "MinEdition", value = "standard"
    30     30   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductName", value = "System.Data.SQLite Designer Package"
    31     31   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductVersion", value = "1.0"
    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", subKeyName = "Toolbox"
    33         -Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\Toolbox", name = "Default Items", value = 3
           33  +Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}\Toolbox", name = "Default Items", value = 3
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0", subKeyName = "Menus", writable = True
    35     35   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Menus", name = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", value = ", 1000, 3"
    36     36   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0", subKeyName = "Services", writable = True
    37     37   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Services", subKeyName = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}"
    38     38   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = <null>, value = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}"
    39     39   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = "Name", value = "System.Data.SQLite Designer Service"
    40     40   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\12.0", writable = False
................................................................................
    63     63   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    64     64   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    65     65   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\12.0", writable = False
    66     66   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0", name = "InstallDir", defaultValue = <null>
    67     67   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 12.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 12.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    68     68   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesRead = 5, keyValuesWritten = 23, keyValuesDeleted = 0
    69     69   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
           70  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    70     71   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2015.log.

    21     21   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ID", value = 400
    22     22   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "InprocServer32", value = "[file nativename [file join $::env(windir) [expr {$is64 ? "SysWOW64" : "system32"}] mscoree.dll]]"
    23     23   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "CompanyName", value = "https://system.data.sqlite.org/"
    24     24   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "MinEdition", value = "standard"
    25     25   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductName", value = "System.Data.SQLite Designer Package"
    26     26   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", name = "ProductVersion", value = "1.0"
    27     27   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", subKeyName = "Toolbox"
    28         -Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\Toolbox", name = "Default Items", value = 3
           28  +Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Packages\{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}\Toolbox", name = "Default Items", value = 3
    29     29   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0", subKeyName = "Menus", writable = True
    30     30   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Menus", name = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}", value = ", 1000, 3"
    31     31   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0", subKeyName = "Services", writable = True
    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Services", subKeyName = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}"
    33     33   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = <null>, value = "{dcbe6c8d-0e57-4099-a183-98ff74c64d9c}"
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\Services\{dcbe6c8d-0e57-4099-a183-98ff74c64d9d}", name = "Name", value = "System.Data.SQLite Designer Service"
    35     35   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\14.0", writable = False
................................................................................
    58     58   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    59     59   Installer.exe: #[getLineNumber]: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    60     60   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\14.0", writable = False
    61     61   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0", name = "InstallDir", defaultValue = <null>
    62     62   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 14.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 14.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    63     63   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 11, subKeysDeleted = 0, keyValuesRead = 5, keyValuesWritten = 22, keyValuesDeleted = 0
    64     64   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
           65  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    65     66   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2005.log.

    29     29   Installer.exe: #[getLineNumber]: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    30     30   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\8.0", writable = False
    31     31   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0", name = "InstallDir", defaultValue = <null>
    32     32   Installer.exe: #[getLineNumber]: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v8.0 'setup' mode to refresh its configuration.
    33     33   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 8} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 8} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    34     34   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    35     35   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
           36  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    36     37   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2008.log.

    36     36   Installer.exe: #[getLineNumber]: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    37     37   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\9.0", writable = False
    38     38   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0", name = "InstallDir", defaultValue = <null>
    39     39   Installer.exe: #[getLineNumber]: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v9.0 'setup' mode to refresh its configuration.
    40     40   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 9.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 9.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    41     41   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 0, subKeysDeleted = 6, keyValuesRead = 6, keyValuesWritten = 0, keyValuesDeleted = 1
    42     42   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
           43  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    43     44   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2010.log.

    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    33     33   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\10.0", writable = False
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0", name = "InstallDir", defaultValue = <null>
    35     35   Installer.exe: #[getLineNumber]: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v10.0 'setup' mode to refresh its configuration.
    36     36   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 10.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 10.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    37     37   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    38     38   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
           39  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    39     40   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2012.log.

    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    33     33   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\11.0", writable = False
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0", name = "InstallDir", defaultValue = <null>
    35     35   Installer.exe: #[getLineNumber]: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v11.0 'setup' mode to refresh its configuration.
    36     36   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 11.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 11.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    37     37   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    38     38   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
           39  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    39     40   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2013.log.

    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    33     33   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\12.0", writable = False
    34     34   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0", name = "InstallDir", defaultValue = <null>
    35     35   Installer.exe: #[getLineNumber]: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v12.0 'setup' mode to refresh its configuration.
    36     36   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 12.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 12.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    37     37   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    38     38   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
           39  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    39     40   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2015.log.

    30     30   Installer.exe: #[getLineNumber]: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    31     31   Installer.exe: #[getLineNumber]: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\14.0", writable = False
    32     32   Installer.exe: #[getLineNumber]: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\14.0", name = "InstallDir", defaultValue = <null>
    33     33   Installer.exe: #[getLineNumber]: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v14.0 'setup' mode to refresh its configuration.
    34     34   Installer.exe: #[getLineNumber]: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 14.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 14.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    35     35   Installer.exe: #[getLineNumber]: Installer.Main: subKeysCreated = 0, subKeysDeleted = 4, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    36     36   Installer.exe: #[getLineNumber]: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
           37  +Installer.exe: #[getLineNumber]: RegistryHelper.WriteOperationList: Registry operation log file name not set.
    37     38   Installer.exe: #[getLineNumber]: Installer.Main: Success.

Changes to tools/install/Installer.cs.

  1250   1250           {
  1251   1251               #region Private Constructors
  1252   1252               private MockRegistryKey()
  1253   1253               {
  1254   1254                   whatIf = true;
  1255   1255                   readOnly = true;
  1256   1256                   safe = true;
         1257  +                noClose = false;
  1257   1258               }
  1258   1259               #endregion
  1259   1260   
  1260   1261               ///////////////////////////////////////////////////////////////////
  1261   1262   
  1262   1263               #region Public Constructors
  1263   1264               public MockRegistryKey(
................................................................................
  1371   1372   
  1372   1373               public void DisableClose()
  1373   1374               {
  1374   1375                   CheckDisposed();
  1375   1376   
  1376   1377                   noClose = true;
  1377   1378               }
         1379  +
         1380  +            ///////////////////////////////////////////////////////////////////
         1381  +
         1382  +            public void ResetSubKeyName(
         1383  +                string subKeyName
         1384  +                )
         1385  +            {
         1386  +                CheckDisposed();
         1387  +
         1388  +                this.subKeyName = subKeyName;
         1389  +            }
  1378   1390   
  1379   1391               ///////////////////////////////////////////////////////////////////
  1380   1392   
  1381   1393               public MockRegistryKey Clone(
  1382   1394                   bool whatIf,
  1383   1395                   bool readOnly,
  1384   1396                   bool safe
................................................................................
  2372   2384                           // HACK: Attempt to open the specified sub-key.  If
  2373   2385                           //       this fails, we will simply return the root
  2374   2386                           //       key itself since no writes are allowed in
  2375   2387                           //       "what-if" mode anyhow.
  2376   2388                           //
  2377   2389                           MockRegistryKey key = rootKey.OpenSubKey(subKeyName);
  2378   2390   
  2379         -                        return (key != null) ?
  2380         -                            key : new MockRegistryKey(
  2381         -                                rootKey, subKeyName, whatIf, false, false);
         2391  +                        if (key != null)
         2392  +                            return key;
         2393  +
         2394  +                        //
         2395  +                        // BUGFIX: The registry key we are supposed to create
         2396  +                        //         does not exist and we cannot create it since
         2397  +                        //         this is "what-if" mode.  The problem here is
         2398  +                        //         this will have a "side-effect" of discarding
         2399  +                        //         any sub-key name value from within the root
         2400  +                        //         key specified by the caller (and then passed
         2401  +                        //         to the MockRegistryKey constructor).  Since
         2402  +                        //         we still want to use that registry key, we
         2403  +                        //         need to migrate that sub-key name from the
         2404  +                        //         root key, by combining it with the sub-key
         2405  +                        //         name specified by the caller and use the new
         2406  +                        //         combined sub-key name for the constructor.
         2407  +                        //
         2408  +                        string newSubKeyName = subKeyName;
         2409  +
         2410  +                        AdjustSubKeyNameForWhatIf(rootKey, ref newSubKeyName);
         2411  +
         2412  +                        return new MockRegistryKey(
         2413  +                            rootKey, newSubKeyName, whatIf, false, false);
  2382   2414                       }
  2383   2415                       else
  2384   2416                       {
  2385   2417                           return new MockRegistryKey(
  2386   2418                               rootKey.CreateSubKey(subKeyName), whatIf, false,
  2387   2419                               false);
  2388   2420                       }
................................................................................
  2570   2602               }
  2571   2603   
  2572   2604               ///////////////////////////////////////////////////////////////////
  2573   2605   
  2574   2606               [MethodImpl(MethodImplOptions.NoInlining)]
  2575   2607               public static int WriteOperationList(
  2576   2608                   string fileName,
         2609  +                bool header,
  2577   2610                   bool verbose
  2578   2611                   )
  2579   2612               {
  2580   2613                   int count = 0;
  2581   2614   
  2582   2615                   if (String.IsNullOrEmpty(fileName))
  2583   2616                   {
................................................................................
  2606   2639   
  2607   2640                           return count;
  2608   2641                       }
  2609   2642   
  2610   2643                       using (StreamWriter streamWriter = new StreamWriter(
  2611   2644                               fileName))
  2612   2645                       {
         2646  +                        if (header)
         2647  +                        {
         2648  +                            streamWriter.WriteLine(
         2649  +                                RegistryOperation.GetHeaderLine());
         2650  +                        }
         2651  +
  2613   2652                           foreach (RegistryOperation operation in operationList)
  2614   2653                           {
  2615   2654                               if (operation == null)
  2616   2655                                   continue;
  2617   2656   
  2618   2657                               streamWriter.WriteLine(operation.ToString());
  2619   2658                               count++;
................................................................................
  2634   2673                   return count;
  2635   2674               }
  2636   2675               #endregion
  2637   2676   
  2638   2677               ///////////////////////////////////////////////////////////////////
  2639   2678   
  2640   2679               #region Private Static Methods
         2680  +            private static void AdjustSubKeyNameForWhatIf(
         2681  +                MockRegistryKey rootKey,
         2682  +                ref string subKeyName
         2683  +                )
         2684  +            {
         2685  +                if (rootKey == null)
         2686  +                    return;
         2687  +
         2688  +                string rootKeySubKeyName = rootKey.SubKeyName;
         2689  +
         2690  +                if (rootKeySubKeyName == null)
         2691  +                    return;
         2692  +
         2693  +                subKeyName = (subKeyName != null) ?
         2694  +                    JoinKeyNames(rootKeySubKeyName, subKeyName) :
         2695  +                    rootKeySubKeyName;
         2696  +            }
         2697  +
         2698  +            ///////////////////////////////////////////////////////////////////
         2699  +
  2641   2700               [MethodImpl(MethodImplOptions.NoInlining)]
  2642   2701               private static string GetMethodName()
  2643   2702               {
  2644   2703                   return TraceOps.GetMethodName(null, 1);
  2645   2704               }
  2646   2705   
  2647   2706               ///////////////////////////////////////////////////////////////////
................................................................................
  2887   2946               {
  2888   2947                   get { CheckDisposed(); return value; }
  2889   2948               }
  2890   2949               #endregion
  2891   2950   
  2892   2951               ///////////////////////////////////////////////////////////////////
  2893   2952   
         2953  +            #region Public Static Methods
         2954  +            public static string GetHeaderLine()
         2955  +            {
         2956  +                StringBuilder builder = new StringBuilder();
         2957  +
         2958  +                builder.Append("MethodName");
         2959  +                builder.Append(FieldDelimiter);
         2960  +                builder.Append("Key");
         2961  +                builder.Append(FieldDelimiter);
         2962  +                builder.Append("SubKeyName");
         2963  +                builder.Append(FieldDelimiter);
         2964  +                builder.Append("ValueName");
         2965  +                builder.Append(FieldDelimiter);
         2966  +                builder.Append("Value");
         2967  +
         2968  +                return builder.ToString();
         2969  +            }
         2970  +            #endregion
         2971  +
         2972  +            ///////////////////////////////////////////////////////////////////
         2973  +
  2894   2974               #region System.Object Overrides
         2975  +            public override string ToString()
         2976  +            {
         2977  +                CheckDisposed();
         2978  +
         2979  +                StringBuilder builder = new StringBuilder();
         2980  +
         2981  +                builder.Append(ForDisplay(methodName));
         2982  +                builder.Append(FieldDelimiter);
         2983  +                builder.Append(ForDisplay(key));
         2984  +                builder.Append(FieldDelimiter);
         2985  +                builder.Append(ForDisplay(subKeyName));
         2986  +                builder.Append(FieldDelimiter);
         2987  +                builder.Append(ForDisplay(valueName));
         2988  +                builder.Append(FieldDelimiter);
         2989  +
         2990  +                builder.Append(ForDisplay(MockRegistryKey.ValueToString(
         2991  +                    value, ListElementDelimiter, DisplayNull)));
         2992  +
         2993  +                return builder.ToString();
         2994  +            }
         2995  +
         2996  +            ///////////////////////////////////////////////////////////////////
         2997  +
  2895   2998               public override bool Equals(
  2896   2999                   object obj
  2897   3000                   )
  2898   3001               {
  2899   3002                   CheckDisposed();
  2900   3003   
  2901   3004                   RegistryOperation operation = obj as RegistryOperation;
................................................................................
  2943   3046                   if (valueName != null)
  2944   3047                       result ^= valueName.GetHashCode();
  2945   3048   
  2946   3049                   result ^= MockRegistryKey.ValueHashCode(value);
  2947   3050   
  2948   3051                   return result;
  2949   3052               }
  2950         -
  2951         -            ///////////////////////////////////////////////////////////////////
  2952         -
  2953         -            public override string ToString()
  2954         -            {
  2955         -                CheckDisposed();
  2956         -
  2957         -                StringBuilder builder = new StringBuilder();
  2958         -
  2959         -                builder.Append(ForDisplay(methodName));
  2960         -                builder.Append(FieldDelimiter);
  2961         -                builder.Append(ForDisplay(key));
  2962         -                builder.Append(FieldDelimiter);
  2963         -                builder.Append(ForDisplay(subKeyName));
  2964         -                builder.Append(FieldDelimiter);
  2965         -                builder.Append(ForDisplay(valueName));
  2966         -                builder.Append(FieldDelimiter);
  2967         -
  2968         -                builder.Append(ForDisplay(MockRegistryKey.ValueToString(
  2969         -                    value, ListElementDelimiter, DisplayNull)));
  2970         -
  2971         -                return builder.ToString();
  2972         -            }
  2973   3053               #endregion
  2974   3054   
  2975   3055               ///////////////////////////////////////////////////////////////////
  2976   3056   
  2977   3057               #region IDisposable "Pattern" Members
  2978   3058               private bool disposed;
  2979   3059               private void CheckDisposed() /* throw */
................................................................................
  9348   9428   
  9349   9429                       #region Write Registry Log (Optional)
  9350   9430                       //
  9351   9431                       // NOTE: If applicable, write the list of registry write
  9352   9432                       //       operations now.
  9353   9433                       //
  9354   9434                       RegistryHelper.WriteOperationList(
  9355         -                        configuration.RegistryLogFileName,
         9435  +                        configuration.RegistryLogFileName, true,
  9356   9436                           configuration.Verbose);
  9357   9437   
  9358   9438                       RegistryHelper.EnableOrDisableOperationList(false);
  9359   9439                       #endregion
  9360   9440   
  9361   9441                       ///////////////////////////////////////////////////////////
  9362   9442