wixgem 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +12 -7
- data/example/example.msi +0 -0
- data/example/example.msm +0 -0
- data/example/rakefile.rb +4 -4
- data/lib/command.rb +17 -1
- data/lib/wixgem.rb +17 -8
- data/spec/COM_spec.rb +8 -3
- data/spec/WindowsInstaller.rb +22 -10
- data/spec/command_spec.rb +2 -2
- data/spec/installation_spec.rb +5 -6
- data/spec/mergemodule_spec.rb +5 -7
- data/spec/multiple_product_installation_spec.rb +40 -41
- data/spec/test_install.rb +1 -5
- data/spec/wixpath.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22c840bc7be89ccd3907cd8170f61197534d1d6d
|
4
|
+
data.tar.gz: 5fdb74a08e62361bdbba93f51617e22174d6e7d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b91f539189b3dcab3d616c619247378b25e381b27641859a439395ea8413ebf692c1867d482e8e23eb5887ab1cde3792b05d19011d9fe60b213e3be7aa57103
|
7
|
+
data.tar.gz: cc1e257c42d35b13c34ff21a1c730991d6ee7719ef90c7a8d0c570ac8aaf5ace8d2ee12d11e1fe907aa88d83da917461f7affd048888c371d54d820fc2b2650e
|
data/README.md
CHANGED
@@ -14,14 +14,15 @@ The [WiX Toolset](http://wixtoolset.org) must be installed.
|
|
14
14
|
require 'wixgem'
|
15
15
|
|
16
16
|
WIX_TOOLSET_ROOT='path to root of Wix toolset'
|
17
|
-
Wix.make_installation('Product.msi', ['rakefile.rb']])
|
17
|
+
Wixgen::Wix.make_installation('Product.msi', ['rakefile.rb']])
|
18
18
|
|
19
|
-
Wix.make_installation('Product.msi', {product_name: 'productname',
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
Wixgen::Wix.make_installation('Product.msi', {product_name: 'productname',
|
20
|
+
version: '1.1.0.0'
|
21
|
+
upgrade_code: '{1d5df00a-c18d-4897-95e6-8c936dd19647}',
|
22
|
+
files: ['rakefile.rb'] }
|
23
23
|
|
24
|
-
Wix.make_installation('Product.msi', {modify_file_paths: {/\Atest_files\// => ''},
|
24
|
+
Wixgen::Wix.make_installation('Product.msi', {modify_file_paths: {/\Atest_files\// => ''},
|
25
|
+
files: Dir.glob("test_files/**/*")})
|
25
26
|
```
|
26
27
|
|
27
28
|
#### Merge Module
|
@@ -29,7 +30,7 @@ Wix.make_installation('Product.msi', {modify_file_paths: {/\Atest_files\// => ''
|
|
29
30
|
require 'wixgem'
|
30
31
|
|
31
32
|
WIX_TOOLSET_ROOT='path to root of Wix toolset'
|
32
|
-
Wix.make_mergemodule('Product.msi', ['rakefile.rb']])
|
33
|
+
Wixgen::Wix.make_mergemodule('Product.msi', ['rakefile.rb']])
|
33
34
|
|
34
35
|
```
|
35
36
|
An example rakefile.rb is included in the example directory of the gem.
|
@@ -52,6 +53,10 @@ small set of optional arguments allowing the developer to customize the generate
|
|
52
53
|
* **has_vb6_files**: Required if installation contains any ocx's or dll's compiled with Visual Basic 6.
|
53
54
|
* **remove_existing_products**: A boolean value. If the value is true the installation will remove all existing
|
54
55
|
installations of the product before installing the product.
|
56
|
+
* **all_users**: String value perUser or perMachine. The default is perUser.
|
57
|
+
* **debug**: Boolean value. If debug is true the Product's wxs file and a log file are copied
|
58
|
+
to the same directory as the output msi file. This can help trouble shooting the
|
59
|
+
installation.
|
55
60
|
|
56
61
|
|
57
62
|
## License
|
data/example/example.msi
CHANGED
Binary file
|
data/example/example.msm
CHANGED
Binary file
|
data/example/rakefile.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'wixgem'
|
2
2
|
|
3
|
-
#Wix.install_path = 'E:\Development\dep\OpenSource\WixToolset\3.9'
|
4
|
-
Wix.install_path = '<Path to the root directory of the wix toolset>'
|
3
|
+
#Wixgem::Wix.install_path = 'E:\Development\dep\OpenSource\WixToolset\3.9'
|
4
|
+
Wixgem::Wix.install_path = '<Path to the root directory of the wix toolset>'
|
5
5
|
|
6
6
|
task :create_installation_files do
|
7
7
|
FileUtils.mkpath('./install_files/directory')
|
@@ -13,13 +13,13 @@ end
|
|
13
13
|
task :mergemodule => [:create_installation_files] do
|
14
14
|
installation_files = Dir.glob('./install_files/**/*')
|
15
15
|
|
16
|
-
Wix.make_mergemodule('./example.msm', installation_files)
|
16
|
+
Wixgem::Wix.make_mergemodule('./example.msm', installation_files)
|
17
17
|
end
|
18
18
|
|
19
19
|
desc "Generate an installation msi file"
|
20
20
|
task :installation => [:mergemodule] do
|
21
21
|
installation_files = Dir.glob('./example.msm')
|
22
|
-
Wix.make_installation("./example.msi",
|
22
|
+
Wixgem::Wix.make_installation("./example.msi",
|
23
23
|
{ upgrade_code: '{a62c35a7-6a6d-4392-822b-f6aca7eef88b}',
|
24
24
|
files: installation_files }
|
25
25
|
)
|
data/lib/command.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'open3'
|
2
2
|
require 'hash'
|
3
3
|
|
4
|
+
module Wixgem
|
5
|
+
|
4
6
|
class Command < Hash
|
5
7
|
def initialize(cmd)
|
6
8
|
self[:command]=cmd
|
@@ -8,17 +10,31 @@ class Command < Hash
|
|
8
10
|
self[:error] = ''
|
9
11
|
self[:exit_code] = ''
|
10
12
|
self[:ignore_exit_code] = false
|
13
|
+
self[:debug] = false
|
11
14
|
end
|
12
15
|
|
13
16
|
def execute
|
14
17
|
begin
|
18
|
+
puts "command: #{self[:command]}" if(self[:debug])
|
15
19
|
self[:output],self[:error], self[:exit_code] = Open3.capture3(self[:command])
|
16
20
|
self[:exit_code]=self[:exit_code].to_i
|
21
|
+
|
22
|
+
if(self[:debug])
|
23
|
+
puts "output: #{self[:output]}"
|
24
|
+
puts "error: #{self[:error]}"
|
25
|
+
puts "exit_code: #{self[:exit_code]}"
|
26
|
+
end
|
17
27
|
rescue Exception => e
|
18
28
|
self[:error] = "Exception: " + e.to_s
|
19
29
|
self[:exit_code]=1
|
20
30
|
end
|
21
31
|
|
22
|
-
|
32
|
+
if((self[:exit_code] != 0) && !self[:ignore_exit_code])
|
33
|
+
exception_text = self[:error]
|
34
|
+
exception_text = self[:output] if(self[:error].empty?)
|
35
|
+
raise "Command exception: #{exception_text}"
|
36
|
+
end
|
23
37
|
end
|
38
|
+
end
|
39
|
+
|
24
40
|
end
|
data/lib/wixgem.rb
CHANGED
@@ -6,6 +6,8 @@ require 'tmpdir.rb'
|
|
6
6
|
require 'rexml/document'
|
7
7
|
require "#{File.dirname(__FILE__)}/command.rb"
|
8
8
|
|
9
|
+
module Wixgem
|
10
|
+
|
9
11
|
class Wix
|
10
12
|
def self.initialize
|
11
13
|
@install_path = ''
|
@@ -70,6 +72,9 @@ class Wix
|
|
70
72
|
end
|
71
73
|
|
72
74
|
def self.manage_custom_actions(xml_doc, input)
|
75
|
+
# Example custom action
|
76
|
+
#<CustomAction Id='comReg' Directory='INSTALLLOCATION' Execute='deferred' Impersonate='no' ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]EAWordImporter.dll" /codebase' Return='check' />
|
77
|
+
|
73
78
|
manufacturer = 'Not Set'
|
74
79
|
manufacturer = input[:manufacturer] if(input.has_key?(:manufacturer))
|
75
80
|
|
@@ -79,13 +84,15 @@ class Wix
|
|
79
84
|
product = REXML::XPath.match(xml_doc, '//Wix/Product')
|
80
85
|
return xml_doc if(product.length == 0)
|
81
86
|
|
82
|
-
product[0].add_element 'CustomAction', { 'Id' => 'SetTARGETDIR', 'Property' => 'TARGETDIR', 'Value' => "#{install_path}", 'Return' => 'check'}
|
87
|
+
product[0].add_element 'CustomAction', { 'Id' => 'SetTARGETDIR', 'Property' => 'TARGETDIR', 'Value' => "#{install_path}", 'Execute' => 'firstSequence', 'Return' => 'check'}
|
83
88
|
|
84
89
|
install_execute_sequence = product[0].add_element 'InstallExecuteSequence'
|
85
|
-
custom_action = install_execute_sequence.add_element 'Custom', { 'Action' => 'SetTARGETDIR', 'Before'=>'CostFinalize' }
|
90
|
+
#custom_action = install_execute_sequence.add_element 'Custom', { 'Action' => 'SetTARGETDIR', 'Before'=>'CostFinalize' }
|
91
|
+
custom_action = install_execute_sequence.add_element 'Custom', { 'Action' => 'SetTARGETDIR', 'Before'=>'CostInitialize' }
|
86
92
|
|
87
93
|
admin_execute_sequence = product[0].add_element 'AdminExecuteSequence'
|
88
|
-
custom_action = admin_execute_sequence.add_element 'Custom', { 'Action' => 'SetTARGETDIR', 'Before'=>'CostFinalize' }
|
94
|
+
#custom_action = admin_execute_sequence.add_element 'Custom', { 'Action' => 'SetTARGETDIR', 'Before'=>'CostFinalize' }
|
95
|
+
custom_action = admin_execute_sequence.add_element 'Custom', { 'Action' => 'SetTARGETDIR', 'Before'=>'CostInitialize' }
|
89
96
|
return xml_doc
|
90
97
|
end
|
91
98
|
|
@@ -176,7 +183,7 @@ class Wix
|
|
176
183
|
@logger.debug "command: #{heat_cmd[:command]}" if(@debug)
|
177
184
|
|
178
185
|
heat_cmd.execute
|
179
|
-
if(@debug)
|
186
|
+
if(@debug && !heat_cmd[:output].empty?)
|
180
187
|
@logger.debug "--------------------------- Heat output -----------------------------------"
|
181
188
|
@logger.debug heat_cmd[:output]
|
182
189
|
end
|
@@ -227,20 +234,20 @@ class Wix
|
|
227
234
|
def self.create_output(wxs_file, output)
|
228
235
|
wixobj_file = "#{File.basename(wxs_file,'.wxs')}.wixobj"
|
229
236
|
|
230
|
-
candle_cmd = Command.new("\"#{install_path}
|
237
|
+
candle_cmd = Command.new("\"#{install_path}/bin/candle.exe\" -out \"#{wixobj_file}\" \"#{wxs_file}\"")
|
231
238
|
@logger.debug "command: #{candle_cmd[:command]}" if(@debug)
|
232
239
|
|
233
240
|
candle_cmd.execute
|
234
|
-
if(@debug)
|
241
|
+
if(@debug && !candle_cmd[:output].empty?)
|
235
242
|
@logger.debug "--------------------------- Candle output -----------------------------------"
|
236
243
|
@logger.debug candle_cmd[:output]
|
237
244
|
end
|
238
245
|
|
239
|
-
light_cmd = Command.new("\"#{install_path}
|
246
|
+
light_cmd = Command.new("\"#{install_path}/bin/light.exe\" -nologo -out \"#{output}\" \"#{wixobj_file}\"")
|
240
247
|
@logger.debug "command: #{light_cmd[:command]}" if(@debug)
|
241
248
|
|
242
249
|
light_cmd.execute
|
243
|
-
if(@debug)
|
250
|
+
if(@debug && !light_cmd[:output].empty?)
|
244
251
|
@logger.debug "--------------------------- Light output -----------------------------------"
|
245
252
|
@logger.debug light_cmd[:output]
|
246
253
|
end
|
@@ -282,4 +289,6 @@ class Wix
|
|
282
289
|
|
283
290
|
end_logger if(@debug)
|
284
291
|
end
|
292
|
+
end
|
293
|
+
|
285
294
|
end
|
data/spec/COM_spec.rb
CHANGED
@@ -6,7 +6,12 @@ require './spec/test_files_exist.rb'
|
|
6
6
|
require 'win32ole'
|
7
7
|
require './admin.rb'
|
8
8
|
|
9
|
-
|
9
|
+
# Unfortunately, I am unable to automate testing of the COM installation. What I do not understand is I am unable to
|
10
|
+
# script this COM msi. If I attempt to script the COM msi, the COM dll is never installed. I am speculating, the custom action
|
11
|
+
# for the TARGETDIR is not functioning. If I use the mouse to double click on the msi, the privileges are raised to
|
12
|
+
# administrative privileges the COM object is correctly installed. Don't understand the difference.
|
13
|
+
|
14
|
+
if(admin? && false)
|
10
15
|
describe 'Wixgem' do
|
11
16
|
describe 'Installation of a COM object' do
|
12
17
|
it 'should not be able to instance a COM object' do
|
@@ -18,9 +23,9 @@ describe 'Wixgem' do
|
|
18
23
|
WindowsInstaller.uninstall(installation_file)
|
19
24
|
end
|
20
25
|
|
21
|
-
installation_hash = { debug: true,
|
26
|
+
installation_hash = { debug: true, all_users: 'perMachine', files: ['COMObject/bin/Release/COMObject.dll']}
|
22
27
|
it "should create an installation file using: #{installation_file}" do
|
23
|
-
Wix.make_installation(installation_file, installation_hash)
|
28
|
+
Wixgem::Wix.make_installation(installation_file, installation_hash)
|
24
29
|
expect(File.exists?(installation_file)).to be(true)
|
25
30
|
end
|
26
31
|
|
data/spec/WindowsInstaller.rb
CHANGED
@@ -13,10 +13,23 @@ class WindowsInstaller
|
|
13
13
|
|
14
14
|
def self.install(msi)
|
15
15
|
raise "#{msi} is already installed" if(WindowsInstaller.installed?(msi))
|
16
|
+
execute("msiexec.exe /i #{msi}")
|
16
17
|
end
|
17
18
|
|
18
|
-
def self.uninstall(
|
19
|
-
|
19
|
+
def self.uninstall(msi_product_code_or_product_name)
|
20
|
+
value = msi_product_code_or_product_name
|
21
|
+
if(File.exists?(value))
|
22
|
+
execute("msiexec.exe /quiet /x #{value}")
|
23
|
+
return
|
24
|
+
end
|
25
|
+
|
26
|
+
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
27
|
+
installer.Products.each { |prod_code|
|
28
|
+
name = installer.ProductInfo(prod_code, "ProductName")
|
29
|
+
value = prod_code if (value == name)
|
30
|
+
}
|
31
|
+
|
32
|
+
execute("msiexec.exe /quiet /x #{value}")
|
20
33
|
end
|
21
34
|
|
22
35
|
def self.product_code_installed?(product_code)
|
@@ -25,13 +38,13 @@ class WindowsInstaller
|
|
25
38
|
return false
|
26
39
|
end
|
27
40
|
|
28
|
-
def self.version
|
41
|
+
def self.version(product_name)
|
29
42
|
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
30
|
-
info = product_info(installer, product_code
|
43
|
+
info = product_info(installer, product_code(product_name, installer))
|
31
44
|
return info['VersionString']
|
32
45
|
end
|
33
46
|
|
34
|
-
def self.product_code
|
47
|
+
def self.product_code(product_name, installer = nil)
|
35
48
|
installer = WIN32OLE.new('WindowsInstaller.Installer') if(installer.nil?)
|
36
49
|
installer.Products.each { |prod_code|
|
37
50
|
name = installer.ProductInfo(prod_code, "ProductName")
|
@@ -70,7 +83,7 @@ class WindowsInstaller
|
|
70
83
|
public
|
71
84
|
def self.dump_info(product_name)
|
72
85
|
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
73
|
-
properties = product_info(installer, product_code
|
86
|
+
properties = product_info(installer, product_code(product_name, installer))
|
74
87
|
properties.each { |id, value| puts "#{id}: #{value}" }
|
75
88
|
end
|
76
89
|
|
@@ -130,10 +143,9 @@ class WindowsInstaller
|
|
130
143
|
puts ''
|
131
144
|
end
|
132
145
|
|
133
|
-
def execute(cmd)
|
134
|
-
command = Command.new(cmd)
|
146
|
+
def self.execute(cmd)
|
147
|
+
command = Wixgem::Command.new(cmd)
|
135
148
|
command.execute
|
136
|
-
|
137
|
-
raise "Failed: #{cmd} Status: #{command[:exit_code]}\nStdout: #{command[:output]}\nStderr: #{command[:error]}" unless(command[:exit_code] == 0)
|
138
149
|
end
|
139
150
|
end
|
151
|
+
|
data/spec/command_spec.rb
CHANGED
@@ -3,14 +3,14 @@ require './lib/command.rb'
|
|
3
3
|
|
4
4
|
describe 'Command' do
|
5
5
|
it 'should be able to execute: dir' do
|
6
|
-
cmd = Command.new('dir')
|
6
|
+
cmd = Wixgem::Command.new('dir')
|
7
7
|
cmd.execute
|
8
8
|
expect(cmd[:output].empty?).to eq(false)
|
9
9
|
expect(cmd[:output].include?('Directory')).to eq(true)
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should fail executing: isnotacommand' do
|
13
|
-
cmd = Command.new('isnotacommand')
|
13
|
+
cmd = Wixgem::Command.new('isnotacommand')
|
14
14
|
expect { cmd.execute }.to raise_error
|
15
15
|
expect(cmd[:error].include?('No such file or directory')).to eq(true)
|
16
16
|
expect(cmd[:exit_status]).to_not eq(0)
|
data/spec/installation_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require './spec/test_install.rb'
|
|
5
5
|
require './spec/test_files_exist.rb'
|
6
6
|
|
7
7
|
describe 'Wixgem' do
|
8
|
-
#Wix.debug = true
|
8
|
+
#Wixgem::Wix.debug = true
|
9
9
|
describe 'Installation' do
|
10
10
|
test_arguments = {
|
11
11
|
test0: ['wixgem_install_test1.msi', ['rakefile.rb']],
|
@@ -21,7 +21,7 @@ describe 'Wixgem' do
|
|
21
21
|
|
22
22
|
test_arguments.each { |key, value|
|
23
23
|
it "should create an installation file using: #{value[0]}" do
|
24
|
-
Wix.make_installation(value[0], value[1])
|
24
|
+
Wixgem::Wix.make_installation(value[0], value[1])
|
25
25
|
expect(File.exists?(value[0])).to be(true)
|
26
26
|
end
|
27
27
|
|
@@ -44,17 +44,16 @@ describe 'Wixgem' do
|
|
44
44
|
|
45
45
|
exception_test_arguments.each { |key, value|
|
46
46
|
it "#{key} should raise an exception" do
|
47
|
-
expect { Wix.make_installation(value[0], value[1]) }.to raise_error
|
47
|
+
expect { Wixgem::Wix.make_installation(value[0], value[1]) }.to raise_error
|
48
48
|
end
|
49
49
|
}
|
50
50
|
end
|
51
51
|
|
52
52
|
describe 'including vb6 files' do
|
53
53
|
it "the wix's heat command should contain the -svb6 flag" do
|
54
|
-
Wix.make_installation('test/wixgem_install_vb6_files.msi', {debug: true, manufacturer: 'musco', has_vb6_files: true, files: ['rakefile.rb'], debug: true})
|
54
|
+
Wixgem::Wix.make_installation('test/wixgem_install_vb6_files.msi', {debug: true, manufacturer: 'musco', has_vb6_files: true, files: ['rakefile.rb'], debug: true})
|
55
55
|
wix_cmd_text = File.read('test/wixgem_install_vb6_files.msi.log')
|
56
56
|
expect(wix_cmd_text.include?('-svb6')).to eq(true)
|
57
57
|
end
|
58
58
|
end
|
59
|
-
|
60
|
-
end
|
59
|
+
end
|
data/spec/mergemodule_spec.rb
CHANGED
@@ -5,8 +5,6 @@ require './spec/test_install.rb'
|
|
5
5
|
require './spec/WindowsInstaller.rb'
|
6
6
|
require './admin.rb'
|
7
7
|
|
8
|
-
Wix.debug=true
|
9
|
-
|
10
8
|
describe 'Wixgem' do
|
11
9
|
describe 'Merge Module' do
|
12
10
|
test_arguments = {
|
@@ -19,13 +17,13 @@ describe 'Wixgem' do
|
|
19
17
|
|
20
18
|
test_arguments.each { |key, value|
|
21
19
|
it "should create merge module: #{value[0]}" do
|
22
|
-
Wix.make_mergemodule(value[0], value[1])
|
20
|
+
Wixgem::Wix.make_mergemodule(value[0], value[1])
|
23
21
|
raise "#{key}: #{value[0]} does not exist" unless(File.exists?(value[0]))
|
24
22
|
end
|
25
23
|
|
26
24
|
install_file = value[0].gsub(/msm/) { |s| s = 'msi' }
|
27
25
|
it "should be able to create an installation file using: #{value[0]}" do
|
28
|
-
|
26
|
+
Wixgem::Wix.make_installation(install_file, ["#{value[0]}"])
|
29
27
|
|
30
28
|
expect(File.exists?(install_file)).to be(true)
|
31
29
|
end
|
@@ -49,14 +47,14 @@ describe 'Wixgem' do
|
|
49
47
|
merge1='test\\wixgem_multiple_merge_test1.msm'
|
50
48
|
merge2='test\\wixgem_multiple_merge_test2.msm'
|
51
49
|
it "should be able to create two merge modules" do
|
52
|
-
Wix.make_mergemodule(merge1, ['rakefile.rb'])
|
50
|
+
Wixgem::Wix.make_mergemodule(merge1, ['rakefile.rb'])
|
53
51
|
expect(File.exists?(merge1)).to be(true)
|
54
|
-
Wix.make_mergemodule(merge2, ['Gemfile'])
|
52
|
+
Wixgem::Wix.make_mergemodule(merge2, ['Gemfile'])
|
55
53
|
expect(File.exists?(merge2)).to be(true)
|
56
54
|
end
|
57
55
|
|
58
56
|
it "should be able to create an installation file using: #{msi_file}" do
|
59
|
-
Wix.make_installation(msi_file, [merge1, merge2])
|
57
|
+
Wixgem::Wix.make_installation(msi_file, [merge1, merge2])
|
60
58
|
expect(File.exists?(msi_file)).to be(true)
|
61
59
|
end
|
62
60
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
require './lib/wixgem.rb'
|
3
3
|
require './spec/wixpath.rb'
|
4
|
+
require './spec/WindowsInstaller.rb'
|
4
5
|
require './admin.rb'
|
5
6
|
|
6
7
|
if(admin?)
|
@@ -8,60 +9,58 @@ describe 'Wixgem' do
|
|
8
9
|
describe 'Side by side installations' do
|
9
10
|
product1='wixgem_multiple 1.0'
|
10
11
|
product2='wixgem_multiple 1.1'
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
Wixgem::Wix.make_installation("test/wixgem_multiple.1.0.0.msi", {version: '1.0.0.0', product_name: product1, upgrade_code: '{face46ab-74ce-44eb-a2b7-81a8cfad5bab}', files: ['Gemfile']})
|
14
|
+
Wixgem::Wix.make_installation("test/wixgem_multiple.1.1.0.msi", {version: '1.1.0.0', product_name: product2, upgrade_code: '{face46ab-74ce-44eb-a2b7-81a8cfad5bab}', files: ['rakefile.rb']})
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
it "should install version 1.0.0" do
|
17
|
+
WindowsInstaller.install('test\\wixgem_multiple.1.0.0.msi')
|
18
|
+
expect(WindowsInstaller.installed?(product1)).to be(true)
|
19
|
+
expect(WindowsInstaller.version(product1)).to eq('1.0.0.0')
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
it "should install version 1.1.0" do
|
23
|
+
WindowsInstaller.install('test\\wixgem_multiple.1.1.0.msi')
|
24
|
+
expect(WindowsInstaller.installed?(product2)).to be(true)
|
25
|
+
expect(WindowsInstaller.version(product2)).to eq('1.1.0.0')
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
it "version 1.0.0 should still be installed" do
|
29
|
+
expect(WindowsInstaller.installed?(product1)).to be(true)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "product codes for version 1.0.0 and 1.0.0 should be different" do
|
33
|
+
expect(WindowsInstaller.product_code(product1)).not_to eq(WindowsInstaller.product_code(product2))
|
34
|
+
end
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
ensure
|
35
|
-
execute("msiexec.exe /quiet /x #{WindowsInstaller.product_code?(product1)}") while(WindowsInstaller.installed?(product1))
|
36
|
-
raise "Failed to uninstall product #{product1}" if(WindowsInstaller.installed?(product1))
|
37
|
-
execute("msiexec.exe /quiet /x #{WindowsInstaller.product_code?(product2)}") while(WindowsInstaller.installed?(product2))
|
38
|
-
raise "Failed to uninstall product #{product2}" if(WindowsInstaller.installed?(product2))
|
36
|
+
it "Should be able to uninstall both products" do
|
37
|
+
WindowsInstaller.uninstall(product1)
|
38
|
+
WindowsInstaller.uninstall(product2)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
describe 'remove previous version' do
|
43
43
|
product1='wixgem_install 1.0'
|
44
44
|
product2='wixgem_install 1.1'
|
45
|
-
|
46
|
-
|
47
|
-
Wix.make_installation("test/wixgem_install.1.1.0.msi", {version: '1.1.0.0', product_name: product2, remove_existing_products: true, upgrade_code: '{face46ab-74ce-44eb-a2b7-81a8cfad5bab}', files: ['rakefile.rb']})
|
45
|
+
Wixgem::Wix.make_installation("test/wixgem_install.1.0.0.msi", {version: '1.0.0.0', product_name: product1, upgrade_code: '{face46ab-74ce-44eb-a2b7-81a8cfad5bab}', files: ['Gemfile']})
|
46
|
+
Wixgem::Wix.make_installation("test/wixgem_install.1.1.0.msi", {version: '1.1.0.0', product_name: product2, remove_existing_products: true, upgrade_code: '{face46ab-74ce-44eb-a2b7-81a8cfad5bab}', files: ['rakefile.rb']})
|
48
47
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
48
|
+
it "should install version 1.0.0" do
|
49
|
+
WindowsInstaller.install('test\\wixgem_install.1.0.0.msi')
|
50
|
+
expect(WindowsInstaller.installed?(product1)).to be(true)
|
51
|
+
end
|
53
52
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
it "should install version 1.1.0" do
|
54
|
+
WindowsInstaller.install('test\\wixgem_install.1.1.0.msi')
|
55
|
+
expect(WindowsInstaller.installed?(product2)).to be(true)
|
56
|
+
end
|
58
57
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
58
|
+
it "the version 1.0.0 should have been uninstalled" do
|
59
|
+
expect(WindowsInstaller.installed?(product1)).to be(false)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should be able to uninstall #{product2}" do
|
63
|
+
WindowsInstaller.uninstall(product2)
|
65
64
|
end
|
66
65
|
end
|
67
66
|
end
|
data/spec/test_install.rb
CHANGED
@@ -41,13 +41,10 @@ end
|
|
41
41
|
|
42
42
|
def test_install(name, msi_file, arg2, callback=nil)
|
43
43
|
arg2 = { files: arg2} unless(arg2.kind_of?(Hash))
|
44
|
-
|
45
44
|
msi_file = msi_file.gsub(/\//) { |s| s = '\\' }
|
46
|
-
|
47
45
|
test_msi(msi_file, arg2)
|
48
46
|
|
49
47
|
msi_info = WindowsInstaller.msi_records(msi_file)
|
50
|
-
|
51
48
|
product_name = msi_info['ProductName']
|
52
49
|
|
53
50
|
if(admin?)
|
@@ -57,8 +54,7 @@ def test_install(name, msi_file, arg2, callback=nil)
|
|
57
54
|
raise "#{name}: Uninstall #{product_name} before running tests" if(WindowsInstaller.installed?(product_name))
|
58
55
|
|
59
56
|
begin
|
60
|
-
WindowsInstaller.install(msi_file)
|
61
|
-
|
57
|
+
WindowsInstaller.install(msi_file)
|
62
58
|
raise "#{name}: Product name #{product_name} is not installed" unless(WindowsInstaller.installed?(product_name))
|
63
59
|
|
64
60
|
eval callback unless(callback == nil)
|
data/spec/wixpath.rb
CHANGED