wixgem 0.16.0 → 0.17.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/lib/wixgem.rb +67 -67
- data/spec/execute.rb +8 -0
- data/spec/installation_spec.rb +51 -0
- data/spec/mergemodule_spec.rb +67 -0
- data/spec/multiple_product_installation_spec.rb +71 -0
- data/spec/test_files_exist.rb +35 -0
- data/spec/test_install.rb +68 -0
- data/spec/wixpath.rb +3 -0
- data/test_files/32145.txt +1 -0
- data/test_files/8.0/File With Space.txt +1 -0
- data/test_files/9.0/File With Space.txt +1 -0
- data/test_files/9.0/test_files/a_file.txt +1 -0
- data/test_files/File-With-Hyphen.txt +1 -0
- metadata +16 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcab5b805971c3bd561d29a61cdb4e65df483482
|
4
|
+
data.tar.gz: cc14dbc41912184286544ce90319ada1ab3829cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16c8423f29f4b45b5f4ba5007a2c8f2d5e7084eca375cd3928774085b540cfb29bfa5f174c36f1467c2e1b7008c6031b7793f5231e41fc0ddc3887b4c17cc22e
|
7
|
+
data.tar.gz: a402219a160d556a391be7912be1b4f6da0a8d45254a37444238eefaa034361f5b2897c8e0aef870e525a11b0524b199ddb215b3b58e390435a62d7bbf0d9f0f
|
data/lib/wixgem.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'SecureRandom'
|
3
3
|
require 'tmpdir.rb'
|
4
|
+
require 'rexml/document'
|
4
5
|
|
5
6
|
class Wix
|
6
7
|
def self.initialize
|
@@ -32,65 +33,75 @@ class Wix
|
|
32
33
|
end
|
33
34
|
|
34
35
|
private
|
35
|
-
def self.manage_upgrade(
|
36
|
+
def self.manage_upgrade(xml_doc, input)
|
37
|
+
product = REXML::XPath.match(xml_doc, '//Wix/Product')
|
38
|
+
return xml_doc if(product.length == 0)
|
39
|
+
|
40
|
+
manufacturer = 'Not Set'
|
41
|
+
manufacturer = input[:manufacturer] if(input.kind_of?(Hash) && input.has_key?(:manufacturer))
|
42
|
+
|
36
43
|
if(input.kind_of?(Hash) &&
|
37
44
|
input.has_key?(:remove_existing_products) &&
|
38
45
|
input[:remove_existing_products])
|
39
46
|
|
40
47
|
raise 'Hash must have a version key if the hash has a :remove_existing_products key' unless(input.has_key?(:version))
|
41
48
|
raise 'Hash must have an upgrade_code key if the hash has a :remove_existing_products key' unless(input.has_key?(:upgrade_code))
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
Maximum=\"#{input[:version]}\"
|
51
|
-
IncludeMaximum='no'
|
52
|
-
Property='UPGRADEFOUND' />
|
53
|
-
</Upgrade>
|
54
|
-
<CustomAction"
|
55
|
-
wxs_text = wxs_text.gsub(/<CustomAction/, upgrade)
|
56
|
-
|
57
|
-
remove_existing_products = " <RemoveExistingProducts After='InstallValidate' />
|
58
|
-
</InstallExecuteSequence>"
|
59
|
-
wxs_text = wxs_text.gsub(/<\/InstallExecuteSequence>/, remove_existing_products)
|
49
|
+
|
50
|
+
|
51
|
+
upgrade = product[0].add_element 'Upgrade', { 'Id' => input[:upgrade_code] }
|
52
|
+
upgrade.add_element 'UpgradeVersion', { 'Minimum' => input[:version], 'OnlyDetect'=>'yes', 'Property'=>'NEWPRODUCTFOUND' }
|
53
|
+
upgrade.add_element 'UpgradeVersion', { 'Minimum' => '1.0.0', 'IncludeMinimum'=>'yes','Maximum'=>input[:version],'IncludeMaximum'=>'no','Property'=>'UPGRADEFOUND' }
|
54
|
+
|
55
|
+
install_and_execute = REXML::XPath.match(xml_doc, '//Wix/Product/InstallExecuteSequence')
|
56
|
+
install_and_execute[0].add_element 'RemoveExistingProducts', { 'After'=>'InstallValidate' }
|
60
57
|
end
|
61
58
|
|
62
|
-
return
|
59
|
+
return xml_doc
|
63
60
|
end
|
64
|
-
|
65
|
-
def self.
|
66
|
-
|
67
|
-
|
61
|
+
|
62
|
+
def self.manage_custom_actions(xml_doc, input)
|
63
|
+
manufacturer = 'Not Set'
|
64
|
+
manufacturer = input[:manufacturer] if(input.kind_of?(Hash) && input.has_key?(:manufacturer))
|
68
65
|
|
69
|
-
|
70
|
-
|
71
|
-
|
66
|
+
install_path = '[ProgramFilesFolder][ProductName]'
|
67
|
+
install_path = "[ProgramFilesFolder][Manufacturer]\\[ProductName]" unless(manufacturer == 'Not Set')
|
68
|
+
|
69
|
+
product = REXML::XPath.match(xml_doc, '//Wix/Product')
|
70
|
+
return xml_doc if(product.length == 0)
|
72
71
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
72
|
+
product[0].add_element 'CustomAction', { 'Id' => 'SetTARGETDIR', 'Directory' => 'TARGETDIR', 'Value' => "#{install_path}", 'Return' => 'check'}
|
73
|
+
|
74
|
+
install_execute_sequence = product[0].add_element 'InstallExecuteSequence'
|
75
|
+
custom_action = install_execute_sequence.add_element 'Custom', { 'Action' => 'SetTARGETDIR', 'After'=>'InstallValidate' }
|
76
|
+
|
77
|
+
return xml_doc
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.manage_msm_files(xml_doc)
|
81
|
+
merge_modules = {}
|
82
|
+
component_group = REXML::XPath.match(xml_doc, '//Wix/Fragment/ComponentGroup')
|
83
|
+
component_group.each { |component_group|
|
84
|
+
component_group.each_element('Component') { |component|
|
85
|
+
component.each_element('File') { |file|
|
86
|
+
merge_modules[component] = file if(File.extname(file.attributes['Source']) == '.msm')
|
87
|
+
}
|
88
|
+
}
|
82
89
|
}
|
83
90
|
|
84
|
-
|
85
|
-
|
86
|
-
directory_element = "<Directory Id='TARGETDIR' Name='SourceDir'>\n#{merge_ids}#{indent_directory}</Directory>"
|
87
|
-
wxs_text = wxs_text.gsub('<Directory Id="TARGETDIR" Name="SourceDir" />', directory_element)
|
88
|
-
|
89
|
-
wxs_text = wxs_text.gsub(/\s+<\/Feature>/, "\n#{merge_refs} </Feature>")
|
91
|
+
directory_root = REXML::XPath.match(xml_doc, '//Wix/Product/Directory')
|
92
|
+
default_feature = REXML::XPath.match(xml_doc, '//Wix/Product/Feature')
|
90
93
|
|
91
|
-
|
94
|
+
merge_modules.each { |component,file|
|
95
|
+
id = component.attributes['Id'].gsub('cmp','merge')
|
96
|
+
directory_root[0].add_element 'Merge', { 'Id' => id, 'SourceFile' => file.attributes['Source'], 'Language' => '1033', 'DiskId' => '1'}
|
97
|
+
default_feature[0].add_element 'MergeRef', { 'Id' => id }
|
98
|
+
|
99
|
+
component_group[0].delete_element(component)
|
100
|
+
}
|
101
|
+
|
102
|
+
return xml_doc
|
92
103
|
end
|
93
|
-
|
104
|
+
|
94
105
|
def self.copy_install_files(directory, input)
|
95
106
|
files = input
|
96
107
|
files = input[:files] if(input.kind_of?(Hash))
|
@@ -110,7 +121,7 @@ class Wix
|
|
110
121
|
end
|
111
122
|
|
112
123
|
def self.create_wxs_file(wxs_file, input, ext)
|
113
|
-
|
124
|
+
@debug = input[:debug] if(!@debug && input.kind_of?(Hash) && input.has_key?(:debug))
|
114
125
|
|
115
126
|
template_option = "-template product"
|
116
127
|
template_option = "-template module" unless(ext == ".msi")
|
@@ -144,29 +155,18 @@ class Wix
|
|
144
155
|
wxs_text = wxs_text.gsub(/Version=\"1.0.0.0\"/) { |s| s = "Version=\"#{product_version}\"" } unless(product_version.empty?)
|
145
156
|
wxs_text = wxs_text.gsub(/Product Id=\"[^\"]+\"/) { |s| s = "Product Id=\"#{product_code}\"" } unless(product_code.empty?)
|
146
157
|
wxs_text = wxs_text.gsub(/UpgradeCode=\"[^\"]+\"/) { |s| s = "UpgradeCode=\"#{upgrade_code}\"" } unless(upgrade_code.empty?)
|
147
|
-
|
148
|
-
install_path = '[ProgramFilesFolder][ProductName]'
|
149
|
-
install_path = "[ProgramFilesFolder][Manufacturer]\\[ProductName]" unless(manufacturer == 'Not Set')
|
150
158
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
</InstallExecuteSequence>
|
163
|
-
</Product>"
|
164
|
-
wxs_text = wxs_text.gsub(/<\/Product>/) { |s| s = custom_action }
|
165
|
-
|
166
|
-
wxs_text = manage_upgrade(wxs_text,input)
|
167
|
-
wxs_text = manage_msm_files(wxs_text)
|
168
|
-
|
169
|
-
File.open(wxs_file, 'w') { |f| f.puts(wxs_text) }
|
159
|
+
xml_doc = REXML::Document.new(wxs_text)
|
160
|
+
xml_doc = manage_custom_actions(xml_doc, input)
|
161
|
+
xml_doc = manage_upgrade(xml_doc,input)
|
162
|
+
xml_doc = manage_msm_files(xml_doc)
|
163
|
+
|
164
|
+
File.open(wxs_file, 'w') { |f| f.puts(xml_doc.to_s) }
|
165
|
+
#formatter = REXML::Formatters::Pretty.new(2)
|
166
|
+
#formatter.compact = true # This is the magic line that does what you need!
|
167
|
+
#wxs_text = ''
|
168
|
+
#formatter.write(xml, wxs_text)
|
169
|
+
#File.open(wxs_file, 'w') { |f| f.puts(wxs_text) }
|
170
170
|
end
|
171
171
|
|
172
172
|
def self.create_output(wxs_file, output)
|
data/spec/execute.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require './lib/wixgem.rb'
|
3
|
+
require './spec/wixpath.rb'
|
4
|
+
require './spec/test_install.rb'
|
5
|
+
require './spec/test_files_exist.rb'
|
6
|
+
require 'json'
|
7
|
+
|
8
|
+
describe 'Wixgem' do
|
9
|
+
#Wix.debug = true
|
10
|
+
describe 'Installation' do
|
11
|
+
test_arguments = {
|
12
|
+
test1: ['test/wixgem_install_test1.msi', ['rakefile.rb']],
|
13
|
+
test2: ['test/wixgem_install_test2.msi', {manufacturer: 'musco', files: ['Gemfile']}],
|
14
|
+
test3: ['test/wixgem_install_test3.msi', ['rakefile.rb', 'Gemfile']],
|
15
|
+
test4: ['test/wixgem_install_test4.msi', {version: '1.1.2.3', files: ['Gemfile']}],
|
16
|
+
test5: ['test/wixgem_install_test5.msi', {product_code: '{4528ae5a-c7fa-40a6-a70e-ac8135f1114c}', files: ['Gemfile']}],
|
17
|
+
test6: ['test/wixgem_install_test6.msi', {upgrade_code: '{1d5df00a-c18d-4897-95e6-8c936dd19647}', files: ['Gemfile']}],
|
18
|
+
test7: ['test/wixgem_install_test7.msi', {product_name: 'test_productname', files: ['Gemfile']}],
|
19
|
+
test8: ['test/wixgem_install_test8.msi', {modify_file_paths: {/\Atest_files\// => ''}, files: Dir.glob("test_files/**/*")}]
|
20
|
+
}
|
21
|
+
|
22
|
+
test_arguments.each { |key, value|
|
23
|
+
it "should create an installation file using: #{value[0]}" do
|
24
|
+
Wix.make_installation(value[0], value[1])
|
25
|
+
expect(File.exists?(value[0])).to be(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should install and uninstall: #{value[0]}" do
|
29
|
+
execute = "test_files_exist('#{value[0]}', #{value[1]})"
|
30
|
+
execute = value[2] if(value.length == 3)
|
31
|
+
test_install(key, value[0], value[1], execute)
|
32
|
+
end
|
33
|
+
}
|
34
|
+
|
35
|
+
test_arguments.each { |key, value| FileUtils.rm(value[0]) if(File.exists?(value[0])) }
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'Packaging excptions' do
|
39
|
+
exception_test_arguments = {
|
40
|
+
test1: ['test/wixgem_install_test1.msi', nil],
|
41
|
+
test1: ['test/wixgem_install_test1.msi', []],
|
42
|
+
test2: ['test/wixgem_install_test1.msi', ['does_not_exist.txt']]
|
43
|
+
}
|
44
|
+
|
45
|
+
exception_test_arguments.each { |key, value|
|
46
|
+
it "should raise an exception" do
|
47
|
+
expect { Wix.make_installation(value[0], value[1]) }.to raise_error
|
48
|
+
end
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require './lib/wixgem.rb'
|
3
|
+
require './spec/wixpath.rb'
|
4
|
+
require './spec/test_install.rb'
|
5
|
+
require './spec/execute.rb'
|
6
|
+
require './admin.rb'
|
7
|
+
|
8
|
+
Wix.debug=true
|
9
|
+
|
10
|
+
describe 'Wixgem' do
|
11
|
+
describe 'Merge Module' do
|
12
|
+
test_arguments = {
|
13
|
+
#test1: ['test/wixgem_merge_test1.msm', ['rakefile.rb']],
|
14
|
+
#test2: ['test/wixgem_merge_test2.msm', {files: ['Gemfile']}],
|
15
|
+
#test3: ['test/wixgem_merge_test3.msm', ['rakefile.rb', 'Gemfile']],
|
16
|
+
#test4: ['test/wixgem_merge_test4.msm', Dir.glob("test_files/**/*")]
|
17
|
+
}
|
18
|
+
|
19
|
+
test_arguments.each { |key, value|
|
20
|
+
it "should create merge module: #{value[0]}" do
|
21
|
+
Wix.make_mergemodule(value[0], value[1])
|
22
|
+
raise "#{key}: #{value[0]} does not exist" unless(File.exists?(value[0]))
|
23
|
+
end
|
24
|
+
|
25
|
+
install_file = value[0].gsub(/msm/) { |s| s = 'msi' }
|
26
|
+
it "should be able to create an installation file using: #{value[0]}" do
|
27
|
+
Wix.make_installation(install_file, ["#{value[0]}"])
|
28
|
+
|
29
|
+
expect(File.exists?(install_file)).to be(true)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should install and uninstall: #{install_file}" do
|
33
|
+
test_install(key, install_file, value[1])
|
34
|
+
end
|
35
|
+
}
|
36
|
+
end
|
37
|
+
if(admin?)
|
38
|
+
describe 'Multiple merge Module' do
|
39
|
+
msi_file='test\\wixgem_multiple_merge_test1.msi'
|
40
|
+
merge1='test\\wixgem_multiple_merge_test1.msm'
|
41
|
+
merge2='test\\wixgem_multiple_merge_test2.msm'
|
42
|
+
it "should be able to create two merge modules" do
|
43
|
+
Wix.make_mergemodule(merge1, ['rakefile.rb'])
|
44
|
+
expect(File.exists?(merge1)).to be(true)
|
45
|
+
Wix.make_mergemodule(merge2, ['Gemfile'])
|
46
|
+
expect(File.exists?(merge2)).to be(true)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be able to create an installation file using: #{msi_file}" do
|
50
|
+
Wix.make_installation(msi_file, [merge1, merge2])
|
51
|
+
expect(File.exists?(msi_file)).to be(true)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should install contents of merge module" do
|
55
|
+
begin
|
56
|
+
execute("msiexec.exe /i #{msi_file}")
|
57
|
+
|
58
|
+
install_dir = "C:/Program Files (x86)/#{File.basename(msi_file, '.msi')}"
|
59
|
+
expect(File.exists?("#{install_dir}/rakefile.rb")).to be(true)
|
60
|
+
expect(File.exists?("#{install_dir}/Gemfile")).to be(true)
|
61
|
+
ensure
|
62
|
+
execute("msiexec.exe /quiet /x #{msi_file}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require './lib/wixgem.rb'
|
3
|
+
require './spec/wixpath.rb'
|
4
|
+
require './admin.rb'
|
5
|
+
require './spec/test_install.rb'
|
6
|
+
require './spec/test_files_exist.rb'
|
7
|
+
require 'json'
|
8
|
+
|
9
|
+
if(admin?)
|
10
|
+
describe 'Wixgem' do
|
11
|
+
describe 'Side by side installations' do
|
12
|
+
product1='wixgem_multiple 1.0'
|
13
|
+
product2='wixgem_multiple 1.1'
|
14
|
+
begin
|
15
|
+
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']})
|
16
|
+
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']})
|
17
|
+
|
18
|
+
it "should install version 1.0.0" do
|
19
|
+
execute("msiexec.exe /i test\\wixgem_multiple.1.0.0.msi")
|
20
|
+
expect(WindowsInstaller.installed?(product1)).to be(true)
|
21
|
+
expect(WindowsInstaller.version?(product1)).to eq('1.0.0.0')
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should install version 1.1.0" do
|
25
|
+
execute("msiexec.exe /i test\\wixgem_multiple.1.1.0.msi")
|
26
|
+
expect(WindowsInstaller.installed?(product2)).to be(true)
|
27
|
+
expect(WindowsInstaller.version?(product2)).to eq('1.1.0.0')
|
28
|
+
end
|
29
|
+
|
30
|
+
it "version 1.0.0 should still be installed" do
|
31
|
+
expect(WindowsInstaller.installed?(product1)).to be(true)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "product codes for version 1.0.0 and 1.0.0 should be different" do
|
35
|
+
expect(WindowsInstaller.product_code?(product1)).not_to eq(WindowsInstaller.product_code?(product2))
|
36
|
+
end
|
37
|
+
ensure
|
38
|
+
execute("msiexec.exe /quiet /x #{WindowsInstaller.product_code?(product1)}") while(WindowsInstaller.installed?(product1))
|
39
|
+
raise "Failed to uninstall product #{product1}" if(WindowsInstaller.installed?(product1))
|
40
|
+
execute("msiexec.exe /quiet /x #{WindowsInstaller.product_code?(product2)}") while(WindowsInstaller.installed?(product2))
|
41
|
+
raise "Failed to uninstall product #{product2}" if(WindowsInstaller.installed?(product2))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'remove previous version' do
|
46
|
+
product1='wixgem_install 1.0'
|
47
|
+
product2='wixgem_install 1.1'
|
48
|
+
begin
|
49
|
+
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']})
|
50
|
+
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']})
|
51
|
+
|
52
|
+
it "should install version 1.0.0" do
|
53
|
+
execute("msiexec.exe /i test\\wixgem_install.1.0.0.msi")
|
54
|
+
expect(WindowsInstaller.installed?(product1)).to be(true)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should install version 1.1.0" do
|
58
|
+
execute("msiexec.exe /i test\\wixgem_install.1.1.0.msi")
|
59
|
+
expect(WindowsInstaller.installed?(product2)).to be(true)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "the version 1.0.0 should have been uninstalled" do
|
63
|
+
expect(WindowsInstaller.installed?(product1)).to be(false)
|
64
|
+
end
|
65
|
+
ensure
|
66
|
+
execute("msiexec.exe /quiet /x #{WindowsInstaller.product_code?(product2)}") while(WindowsInstaller.installed?(product2))
|
67
|
+
raise "Failed to uninstall product #{product2}" if(WindowsInstaller.installed?(product2))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
def files(data)
|
2
|
+
files = data
|
3
|
+
if(data.kind_of?(Hash))
|
4
|
+
files = data[:files]
|
5
|
+
|
6
|
+
if(data.has_key?(:modify_file_paths))
|
7
|
+
modify_paths = data[:modify_file_paths]
|
8
|
+
files.each_index do |index|
|
9
|
+
file_path = files[index]
|
10
|
+
modify_paths.each { |regex, replacement_string| file_path = file_path.gsub(regex, replacement_string) }
|
11
|
+
files[index] = file_path
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
return files
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_files_exist(msi_file, data)
|
19
|
+
files = files(data)
|
20
|
+
|
21
|
+
product_name = File.basename(msi_file, File.extname(msi_file))
|
22
|
+
product_name = data[:product_name] if(data.kind_of?(Hash) && data.has_key?(:product_name))
|
23
|
+
|
24
|
+
manufacturer = ''
|
25
|
+
manufacturer = data[:manufacturer] if(data.kind_of?(Hash) && data.has_key?(:manufacturer))
|
26
|
+
|
27
|
+
relative_install_dir = product_name
|
28
|
+
raise "#{name}: relative_install_dir should be set to the product name" if(relative_install_dir.length == 0)
|
29
|
+
relative_install_dir = "#{manufacturer}/#{relative_install_dir}" if(manufacturer.length > 0)
|
30
|
+
|
31
|
+
files.each { |file|
|
32
|
+
full_path = "C:/Program Files (x86)/#{relative_install_dir}/#{file}"
|
33
|
+
raise "#{full_path} not installed." unless(File.exists?(full_path))
|
34
|
+
}
|
35
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require './WindowsInstaller.rb'
|
2
|
+
require './admin.rb'
|
3
|
+
require './spec/execute.rb'
|
4
|
+
|
5
|
+
def get_product_name(msi_file, arg2)
|
6
|
+
product_name = File.basename(msi_file, File.extname(msi_file))
|
7
|
+
product_name = arg2[:product_name] if(arg2.kind_of?(Hash) && arg2.has_key?(:product_name))
|
8
|
+
|
9
|
+
return product_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_msi(msi_file, arg2)
|
13
|
+
product_name = get_product_name(msi_file, arg2)
|
14
|
+
|
15
|
+
msi_info = WindowsInstaller.msi_records(msi_file)
|
16
|
+
#puts msi_info.to_s
|
17
|
+
|
18
|
+
if(arg2.kind_of?(Hash) && arg2.has_key?(:product_name))
|
19
|
+
raise "ProductName is #{msi_info['ProductName']} expected #{product_name}" unless(product_name == msi_info['ProductName'])
|
20
|
+
end
|
21
|
+
|
22
|
+
if(arg2.kind_of?(Hash) && arg2.has_key?(:product_code))
|
23
|
+
expected = arg2[:product_code].upcase
|
24
|
+
raise "ProductCode is #{msi_info['ProductCode']} expected #{expected}" unless(expected == msi_info['ProductCode'])
|
25
|
+
end
|
26
|
+
|
27
|
+
if(arg2.kind_of?(Hash) && arg2.has_key?(:upgrade_code))
|
28
|
+
expected = arg2[:upgrade_code].upcase
|
29
|
+
raise "UpgradeCode is #{msi_info['UpgradeCode']} expected #{expected}" unless(expected == msi_info['UpgradeCode'])
|
30
|
+
end
|
31
|
+
|
32
|
+
expected_product_version = '1.0.0.0'
|
33
|
+
expected_product_version = arg2[:version] if(arg2.kind_of?(Hash) && arg2.has_key?(:version))
|
34
|
+
raise "Invalid product version #{msi_info['ProductVersion']}" if(msi_info['ProductVersion'] != expected_product_version)
|
35
|
+
|
36
|
+
expected_manufacturer = 'Not Set'
|
37
|
+
expected_manufacturer = arg2[:manufacturer] if(arg2.kind_of?(Hash) && arg2.has_key?(:manufacturer))
|
38
|
+
raise "Invalid Manufacturer #{msi_info['Manufacturer']}" if(msi_info['Manufacturer'] != expected_manufacturer)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_install(name, msi_file, arg2, callback=nil)
|
42
|
+
msi_file = msi_file.gsub(/\//) { |s| s = '\\' }
|
43
|
+
|
44
|
+
test_msi(msi_file, arg2)
|
45
|
+
|
46
|
+
msi_info = WindowsInstaller.msi_records(msi_file)
|
47
|
+
|
48
|
+
product_name = msi_info['ProductName']
|
49
|
+
|
50
|
+
if(admin?)
|
51
|
+
while(WindowsInstaller.installed?(product_name))
|
52
|
+
execute("msiexec.exe /quiet /x #{WindowsInstaller.product_code?(product_name)}")
|
53
|
+
end
|
54
|
+
raise "#{name}: Uninstall #{product_name} before running tests" if(WindowsInstaller.installed?(product_name))
|
55
|
+
|
56
|
+
begin
|
57
|
+
execute("msiexec.exe /i #{msi_file}")
|
58
|
+
#WindowsInstaller.dump_info(product_name)
|
59
|
+
|
60
|
+
raise "#{name}: Product name #{product_name} is not installed" unless(WindowsInstaller.installed?(product_name))
|
61
|
+
|
62
|
+
eval callback unless(callback == nil)
|
63
|
+
ensure
|
64
|
+
execute("msiexec.exe /quiet /x #{msi_file}") if(WindowsInstaller.installed?(product_name))
|
65
|
+
raise "Failed to uninstall product #{product_name}" if(WindowsInstaller.installed?(product_name))
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/spec/wixpath.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Number File
|
@@ -0,0 +1 @@
|
|
1
|
+
Test File
|
@@ -0,0 +1 @@
|
|
1
|
+
Hello World
|
@@ -0,0 +1 @@
|
|
1
|
+
Test file
|
@@ -0,0 +1 @@
|
|
1
|
+
Test it
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wixgem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Marshall
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,9 +66,8 @@ dependencies:
|
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description:
|
70
|
-
files with the Wix Toolset
|
71
|
-
of COM objects or registry entries.'
|
69
|
+
description: Simple Ruby interface to facilitate creating and compiling windows installation
|
70
|
+
files with the Wix Toolset.
|
72
71
|
email: KCCKSMarshall@gmail.com
|
73
72
|
executables: []
|
74
73
|
extensions: []
|
@@ -77,6 +76,18 @@ files:
|
|
77
76
|
- LICENSE
|
78
77
|
- README.md
|
79
78
|
- lib/wixgem.rb
|
79
|
+
- spec/execute.rb
|
80
|
+
- spec/installation_spec.rb
|
81
|
+
- spec/mergemodule_spec.rb
|
82
|
+
- spec/multiple_product_installation_spec.rb
|
83
|
+
- spec/test_files_exist.rb
|
84
|
+
- spec/test_install.rb
|
85
|
+
- spec/wixpath.rb
|
86
|
+
- test_files/32145.txt
|
87
|
+
- test_files/8.0/File With Space.txt
|
88
|
+
- test_files/9.0/File With Space.txt
|
89
|
+
- test_files/9.0/test_files/a_file.txt
|
90
|
+
- test_files/File-With-Hyphen.txt
|
80
91
|
homepage: http://rubygems.org/gems/wixgem
|
81
92
|
licenses:
|
82
93
|
- Apache 2.0
|