wixgem 0.32.0 → 0.33.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1b83dd501d80b926d39330bd5cf856ce566770bf
4
- data.tar.gz: bb57aae8fadb5997602880790cd824cce657526f
3
+ metadata.gz: 0ad9f8a4070ee4bddfa138baf13adfa2b6bc74d2
4
+ data.tar.gz: fd44d0d360a288cc10d5f07e88e77c2017c0591c
5
5
  SHA512:
6
- metadata.gz: d1bec407aebc0abb64c9a83612881d46de635a03055430b615d846b7c610e8404beebb0e2aaa45de4efb41de4812597869826184444c4846e4fc6a4198904be7
7
- data.tar.gz: 5b66b15274997bd4e9197a9697a2c708887eabc55153e5ab6289438a576a1b680b91cb91aca7e52cb97c844be62c0dc6f9dc731186f3f014136ff922afc42044
6
+ metadata.gz: bb6c4dddc389dee7cdba6d8596a4eb8939c657ce4f11675115cd3f3101543602255032e6c1cb4933b834f2088a58ca0984db62bb41f4a2b199f4dab95c1601a0
7
+ data.tar.gz: 2c5c97aeb97acb74ed7b37f8121a34c83485bb5fbd662ab35736d6b2fb80283dd41c27cef717ff9e307ac78b3cd680d7451ad66d7dafd5ee455618f7903b94a3
data/lib/command.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'open3'
2
+ require 'hash'
3
+
4
+ class Command < Hash
5
+ def initialize(cmd)
6
+ self[:command]=cmd
7
+ self[:output] = ''
8
+ self[:error] = ''
9
+ self[:exit_code] = ''
10
+ self[:ignore_exit_code] = false
11
+ end
12
+
13
+ def execute
14
+ begin
15
+ self[:output],self[:error], self[:exit_code] = Open3.capture3(self[:command])
16
+ self[:exit_code]=self[:exit_code].to_i
17
+ rescue Exception => e
18
+ self[:error] = "Exception: " + e.to_s
19
+ self[:exit_code]=1
20
+ end
21
+
22
+ raise self[:error] unless((self[:exit_code] == 0) || self[:ignore_exit_code])
23
+ end
24
+ end
data/lib/wixgem.rb CHANGED
@@ -1,12 +1,17 @@
1
1
  require 'fileutils'
2
2
  require 'SecureRandom'
3
+ require 'logging'
4
+ require 'tempfile'
3
5
  require 'tmpdir.rb'
4
6
  require 'rexml/document'
7
+ require "#{File.dirname(__FILE__)}/command.rb"
5
8
 
6
9
  class Wix
7
10
  def self.initialize
8
11
  @install_path = ''
9
12
  @debug = false
13
+ @logger = nil
14
+ @log_file = nil
10
15
  end
11
16
  def self.install_path=(path)
12
17
  @install_path = path
@@ -33,17 +38,23 @@ class Wix
33
38
  end
34
39
 
35
40
  private
41
+ def self.start_logger
42
+ @logger = ::Logging.logger['Wixgem_logger']
43
+ @log_file = Tempfile.new('wixgem')
44
+ @logger.add_appenders(Logging.appenders.file(@log_file.path))
45
+ @logger.level = :debug
46
+ end
47
+
48
+ def self.end_logger
49
+ @logger = nil
50
+ @log_file = nil
51
+ end
52
+
36
53
  def self.manage_upgrade(xml_doc, input)
37
54
  product = REXML::XPath.match(xml_doc, '//Wix/Product')
38
55
  return xml_doc if(product.length == 0)
39
56
 
40
- manufacturer = 'Not Set'
41
- manufacturer = input[:manufacturer] if(input.kind_of?(Hash) && input.has_key?(:manufacturer))
42
-
43
- if(input.kind_of?(Hash) &&
44
- input.has_key?(:remove_existing_products) &&
45
- input[:remove_existing_products])
46
-
57
+ if(input.has_key?(:remove_existing_products) && input[:remove_existing_products])
47
58
  raise 'Hash must have a version key if the hash has a :remove_existing_products key' unless(input.has_key?(:version))
48
59
  raise 'Hash must have an upgrade_code key if the hash has a :remove_existing_products key' unless(input.has_key?(:upgrade_code))
49
60
 
@@ -58,27 +69,9 @@ class Wix
58
69
  return xml_doc
59
70
  end
60
71
 
61
- def self.manage_com_files(xml_doc)
62
- component_groups = REXML::XPath.match(xml_doc, '//Wix/Fragment/ComponentGroup')
63
- return xml_doc if(component_groups.nil?)
64
-
65
- com_dlls = {}
66
- component_groups.each do |component_group|
67
- component_group.each_element do |component|
68
- classes = component.get_elements('Class')
69
- if((classes.length == 1) && (classes[0].attributes["Context"] == 'InprocServer32'))
70
- files = component.get_elements('File')
71
- files[0].add_attribute('Assembly','.net')
72
- end
73
- end
74
- end
75
-
76
- return xml_doc
77
- end
78
-
79
72
  def self.manage_custom_actions(xml_doc, input)
80
73
  manufacturer = 'Not Set'
81
- manufacturer = input[:manufacturer] if(input.kind_of?(Hash) && input.has_key?(:manufacturer))
74
+ manufacturer = input[:manufacturer] if(input.has_key?(:manufacturer))
82
75
 
83
76
  install_path = '[ProgramFilesFolder][ProductName]'
84
77
  install_path = "[ProgramFilesFolder][Manufacturer]\\[ProductName]" unless(manufacturer == 'Not Set')
@@ -122,16 +115,14 @@ class Wix
122
115
  end
123
116
 
124
117
  def self.copy_install_files(directory, input)
125
- files = input
126
- files = input[:files] if(input.kind_of?(Hash))
127
-
118
+ files = input[:files]
128
119
  raise 'No files were given to wixgem' if(files.length == 0)
129
120
 
130
121
  missing_files = []
131
122
  files.each do |file|
132
123
  if(File.file?(file))
133
124
  install_path = file
134
- if(input.kind_of?(Hash) && input.has_key?(:modify_file_paths))
125
+ if(input.has_key?(:modify_file_paths))
135
126
  input[:modify_file_paths].each { |regex, replacement_string| install_path = install_path.gsub(regex, replacement_string) }
136
127
  end
137
128
 
@@ -146,20 +137,21 @@ class Wix
146
137
  if(@debug)
147
138
  max_path = files.max { |a, b| a.length <=> b.length }
148
139
  columen_size = max_path.length + 10
149
- File.open('./installation_files.txt', 'w') do |f|
150
- f.printf("%-#{columen_size}s %s\n" % ['File path', 'Installation Path'])
151
- files.each do |file|
152
- if(File.file?(file))
153
- install_path = file
154
- if(input.kind_of?(Hash) && input.has_key?(:modify_file_paths))
155
- input[:modify_file_paths].each { |regex, replacement_string| install_path = install_path.gsub(regex, replacement_string) }
156
- end
157
- f.printf("%-#{columen_size}s %s\n" % [file, install_path])
140
+
141
+ @logger.debug "------------------------------------ Installation Paths -----------------------------------"
142
+ @logger.debug "%-#{columen_size}s %s\n" % ['File path', 'Installation Path']
143
+ files.each do |file|
144
+ if(File.file?(file))
145
+ install_path = file
146
+ if(input.has_key?(:modify_file_paths))
147
+ input[:modify_file_paths].each { |regex, replacement_string| install_path = install_path.gsub(regex, replacement_string) }
158
148
  end
159
- end
160
- end
149
+ @logger.debug "%-#{columen_size}s %s\n" % [file, install_path]
150
+ end
151
+ end
152
+ @logger.debug "-------------------------------------------------------------------------------------------"
161
153
  end
162
-
154
+
163
155
  if(missing_files.length > 0)
164
156
  missing_files_str = ''
165
157
  missing_files.each { |f|
@@ -177,28 +169,32 @@ class Wix
177
169
  template_option = "-template product"
178
170
  template_option = "-template module" unless(ext == ".msi")
179
171
 
180
- wix_cmd = "\"#{install_path}/bin/heat.exe\" dir . #{template_option} -cg InstallionFiles -gg -nologo -srd -o \"#{wxs_file}\""
181
- wix_cmd = wix_cmd.gsub(/-srd/, '-svb6 -srd') if(input.kind_of?(Hash) && input.has_key?(:has_vb6_files))
172
+ cmd = "\"#{install_path}/bin/heat.exe\" dir . #{template_option} -cg InstallionFiles -gg -nologo -srd -o \"#{wxs_file}\""
173
+ cmd = cmd.gsub(/-srd/, '-svb6 -srd') if(input.has_key?(:has_vb6_files))
182
174
 
183
- stdout = %x[#{wix_cmd}]
175
+ heat_cmd = Command.new(cmd)
176
+ @logger.debug "command: #{heat_cmd[:command]}" if(@debug)
184
177
 
185
- File.open("#{File.basename(wxs_file,'.wxs')}.wix_cmds.txt", 'w') { |f| f.puts wix_cmd } if(@debug)
186
- raise "#{stdout}\nFailed to generate .wxs file" unless(File.exists?(wxs_file))
187
-
178
+ heat_cmd.execute
179
+ if(@debug)
180
+ @logger.debug "--------------------------- Heat output -----------------------------------"
181
+ @logger.debug heat_cmd[:output]
182
+ end
183
+
188
184
  product_name = File.basename(wxs_file, '.wxs')
189
- product_name = input[:product_name] if(input.kind_of?(Hash) && input.has_key?(:product_name))
185
+ product_name = input[:product_name] if(input.has_key?(:product_name))
190
186
 
191
187
  manufacturer = 'Not Set'
192
- manufacturer = input[:manufacturer] if(input.kind_of?(Hash) && input.has_key?(:manufacturer))
188
+ manufacturer = input[:manufacturer] if(input.has_key?(:manufacturer))
193
189
 
194
190
  product_version = ''
195
- product_version = input[:version] if(input.kind_of?(Hash) && input.has_key?(:version))
191
+ product_version = input[:version] if(input.has_key?(:version))
196
192
 
197
193
  product_code = ''
198
- product_code = input[:product_code] if(input.kind_of?(Hash) && input.has_key?(:product_code))
194
+ product_code = input[:product_code] if(input.has_key?(:product_code))
199
195
 
200
196
  upgrade_code = ''
201
- upgrade_code = input[:upgrade_code] if(input.kind_of?(Hash) && input.has_key?(:upgrade_code))
197
+ upgrade_code = input[:upgrade_code] if(input.has_key?(:upgrade_code))
202
198
 
203
199
  wxs_text = File.read(wxs_file)
204
200
 
@@ -213,9 +209,11 @@ class Wix
213
209
  wxs_text = wxs_text.gsub(/UpgradeCode=\"[^\"]+\"/) { |s| s = "UpgradeCode=\"#{upgrade_code}\"" } unless(upgrade_code.empty?)
214
210
 
215
211
  xml_doc = REXML::Document.new(wxs_text)
212
+ packages = REXML::XPath.match(xml_doc, '//Wix/Product/Package')
213
+ packages.each { |package| package.add_attribute('InstallScope', 'perMachine') } if(input.has_key?(:all_users))
214
+
216
215
  xml_doc = manage_custom_actions(xml_doc, input)
217
216
  xml_doc = manage_upgrade(xml_doc,input)
218
- xml_doc = manage_com_files(xml_doc)
219
217
  xml_doc = manage_msm_files(xml_doc)
220
218
 
221
219
  File.open(wxs_file, 'w') { |f| f.puts(xml_doc.to_s) }
@@ -229,21 +227,32 @@ class Wix
229
227
  def self.create_output(wxs_file, output)
230
228
  wixobj_file = "#{File.basename(wxs_file,'.wxs')}.wixobj"
231
229
 
232
- wix_cmd = "\"#{install_path}\\bin\\candle.exe\" -out \"#{wixobj_file}\" \"#{wxs_file}\""
233
- File.open("#{File.basename(wxs_file,'.wxs')}.wix_cmds.txt", 'a') { |f| f.puts wix_cmd } if(@debug)
234
- stdout = %x[#{wix_cmd}]
235
- raise "#{stdout}\nFailed to generate .wixobj file" unless(File.exists?(wixobj_file))
230
+ candle_cmd = Command.new("\"#{install_path}\\bin\\candle.exe\" -out \"#{wixobj_file}\" \"#{wxs_file}\"")
231
+ @logger.debug "command: #{candle_cmd[:command]}" if(@debug)
232
+
233
+ candle_cmd.execute
234
+ if(@debug)
235
+ @logger.debug "--------------------------- Candle output -----------------------------------"
236
+ @logger.debug candle_cmd[:output]
237
+ end
238
+
239
+ light_cmd = Command.new("\"#{install_path}\\bin\\light.exe\" -nologo -out \"#{output}\" \"#{wixobj_file}\"")
240
+ @logger.debug "command: #{light_cmd[:command]}" if(@debug)
236
241
 
237
- wix_cmd = "\"#{install_path}\\bin\\light.exe\" -nologo -out \"#{output}\" \"#{wixobj_file}\""
238
- File.open("#{File.basename(wxs_file,'.wxs')}.wix_cmds.txt", 'a') { |f| f.puts wix_cmd } if(@debug)
239
- stdout = %x[#{wix_cmd}]
240
- raise "#{stdout}\nFailed to generate #{output} file" unless(File.exists?(output))
242
+ light_cmd.execute
243
+ if(@debug)
244
+ @logger.debug "--------------------------- Light output -----------------------------------"
245
+ @logger.debug light_cmd[:output]
246
+ end
241
247
  end
242
248
 
243
249
  def self.apply_wix_template(output, input, template)
244
250
  raise 'WIX path is not set!' if(install_path.nil?)
251
+ input = { files: input } unless(input.kind_of?(Hash))
252
+ @debug = input[:debug] if(!@debug && input.has_key?(:debug))
245
253
 
246
- @debug = input[:debug] if(!@debug && input.kind_of?(Hash) && input.has_key?(:debug))
254
+ start_logger if(@debug)
255
+
247
256
  FileUtils.mkpath(File.dirname(output)) unless(Dir.exists?(File.dirname(output)))
248
257
 
249
258
  ext = File.extname(output)
@@ -260,18 +269,17 @@ class Wix
260
269
  begin
261
270
  create_wxs_file(wxs_file, input, ext)
262
271
  create_output(wxs_file, output_absolute_path)
272
+ rescue Exception => e
273
+ raise "Wixgem exception: #{e}"
263
274
  ensure
264
- if(@debug)
265
- FileUtils.cp(wxs_file, "#{output_absolute_path}.wxs") if(File.exists?(wxs_file))
266
- wix_cmds_file = "#{File.basename(wxs_file,'.wxs')}.wix_cmds.txt"
267
- FileUtils.cp(wix_cmds_file, "#{output_absolute_path}.wix_cmds.txt") if(File.exists?(wix_cmds_file))
268
- end
275
+ FileUtils.cp(wxs_file, "#{output_absolute_path}.wxs") if(File.exists?(wxs_file) && @debug)
276
+ FileUtils.cp(@log_file.path, "#{output_absolute_path}.log") if(@debug)
269
277
  end
270
278
  end
271
-
272
- FileUtils.mv('installation_files.txt', "#{output_absolute_path}_paths.txt") if(File.exists?('installation_files.txt'))
273
279
  end
274
280
  pdb_file = output_absolute_path.gsub(ext,'.wixpdb')
275
281
  FileUtils.rm(pdb_file) if(File.exists?(pdb_file))
282
+
283
+ end_logger if(@debug)
276
284
  end
277
285
  end
data/spec/COM_spec.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  require 'rspec'
2
2
  require './lib/wixgem.rb'
3
3
  require './spec/wixpath.rb'
4
- require './WindowsInstaller.rb'
4
+ require './spec/WindowsInstaller.rb'
5
+ require './spec/test_files_exist.rb'
5
6
  require 'win32ole'
7
+ require './admin.rb'
6
8
 
9
+ if(admin?)
7
10
  describe 'Wixgem' do
8
11
  describe 'Installation of a COM object' do
9
12
  it 'should not be able to instance a COM object' do
@@ -15,28 +18,39 @@ describe 'Wixgem' do
15
18
  WindowsInstaller.uninstall(installation_file)
16
19
  end
17
20
 
21
+ installation_hash = { debug: true, modify_file_paths: {/^.+Release\// => ''}, all_users: 'perMachine', files: ['COMObject/bin/Release/COMObject.dll']}
18
22
  it "should create an installation file using: #{installation_file}" do
19
- Wix.make_installation(installation_file, { debug: true, files: ['COMObject/bin/Release/COMObject.dll']})
23
+ Wix.make_installation(installation_file, installation_hash)
20
24
  expect(File.exists?(installation_file)).to be(true)
21
25
  end
22
26
 
23
- WindowsInstaller.install(installation_file)
27
+ it 'should install' do
28
+ WindowsInstaller.install(installation_file)
29
+ expect(WindowsInstaller.installed?(installation_file)).to be(true)
30
+ end
24
31
 
32
+ it 'should have installed the COMObject.dll' do
33
+ test_files_exist(installation_file, installation_hash)
34
+ end
35
+
25
36
  it 'should be able to instance a COM object with a GUID' do
26
- #object = WIN32OLE.new('{863AEADA-EE73-4f4a-ABC0-3FB384CB41AA}')
27
- #expect(object.nil?).to eq(false)
28
- #puts "Text: #{object.GetText}"
29
- #expect(object.GetText).to eq('Hello World')
37
+ object = WIN32OLE.new('{863AEADA-EE73-4f4a-ABC0-3FB384CB41AA}')
38
+ expect(object.nil?).to eq(false)
39
+ puts "Text: #{object.GetText}"
40
+ expect(object.GetText).to eq('Hello World')
30
41
  end
31
42
 
32
- it 'should be able to instance a COM object with a Program Id' do
33
-
34
- #object = WIN32OLE.new('COMObject.ComClassExample')
35
- #expect(object.nil?).to eq(false)
36
- #puts "Text: #{object.GetText}"
37
- #expect(object.GetText).to eq('Hello World')
43
+ it 'should be able to instance a COM object with a Program Id' do
44
+ object = WIN32OLE.new('COMObject.ComClassExample')
45
+ expect(object.nil?).to eq(false)
46
+ puts "Text: #{object.GetText}"
47
+ expect(object.GetText).to eq('Hello World')
38
48
  end
39
49
 
40
- WindowsInstaller.uninstall(installation_file) if(WindowsInstaller.installed?(installation_file))
50
+ it 'should uninstall' do
51
+ WindowsInstaller.uninstall(installation_file) if(WindowsInstaller.installed?(installation_file))
52
+ expect(WindowsInstaller.installed?(installation_file)).to be(false)
53
+ end
41
54
  end
42
55
  end
56
+ end
@@ -0,0 +1,139 @@
1
+ require 'win32ole'
2
+ require 'dev_tasks'
3
+
4
+ class WindowsInstaller
5
+ def self.installed?(product_name)
6
+ installer = WIN32OLE.new('WindowsInstaller.Installer')
7
+ installer.Products.each { |prod_code|
8
+ name = installer.ProductInfo(prod_code, "ProductName")
9
+ return true if (product_name == name)
10
+ }
11
+ return false
12
+ end
13
+
14
+ def self.install(msi)
15
+ raise "#{msi} is already installed" if(WindowsInstaller.installed?(msi))
16
+ end
17
+
18
+ def self.uninstall(msi)
19
+ execute("msiexec.exe /quiet /x #{msi}") if(File.exists?(msi))
20
+ end
21
+
22
+ def self.product_code_installed?(product_code)
23
+ installer = WIN32OLE.new('WindowsInstaller.Installer')
24
+ installer.Products.each { |prod_code| return true if (product_code == prod_code) }
25
+ return false
26
+ end
27
+
28
+ def self.version?(product_name)
29
+ installer = WIN32OLE.new('WindowsInstaller.Installer')
30
+ info = product_info(installer, product_code?(product_name, installer))
31
+ return info['VersionString']
32
+ end
33
+
34
+ def self.product_code?(product_name, installer = nil)
35
+ installer = WIN32OLE.new('WindowsInstaller.Installer') if(installer.nil?)
36
+ installer.Products.each { |prod_code|
37
+ name = installer.ProductInfo(prod_code, "ProductName")
38
+ return prod_code if (product_name == name)
39
+ }
40
+ raise "Failed to find product code for product: #{product_name}"
41
+ end
42
+
43
+ private
44
+ def self.product_info(installer, code)
45
+ raise 'Windows installer cannot be nil' if(installer.nil?)
46
+ hash = Hash.new
47
+ # known product keywords found on internet. Would be nice to generate.
48
+ %w[Language PackageCode Transforms AssignmentType PackageName InstalledProductName VersionString RegCompany
49
+ RegOwner ProductID ProductIcon InstallLocation InstallSource InstallDate Publisher LocalPackage HelpLink
50
+ HelpTelephone URLInfoAbout URLUpdateInfo InstanceType].sort.each do |prop|
51
+ value = installer.ProductInfo(code, prop)
52
+ hash[prop] = value unless(value.nil? || value == '')
53
+ end
54
+ return hash
55
+ end
56
+
57
+ def self.msi_info(installer, msi_file)
58
+ raise 'Windows installer cannot be nil' if(installer.nil?)
59
+ hash = Hash.new
60
+ # known product keywords found on internet. Would be nice to generate.
61
+ %w[Language PackageCode Transforms AssignmentType PackageName InstalledProductName VersionString RegCompany
62
+ RegOwner ProductID ProductIcon InstallLocation InstallSource InstallDate Publisher LocalPackage HelpLink
63
+ HelpTelephone URLInfoAbout URLUpdateInfo InstanceType].sort.each do |prop|
64
+ value = installer.ProductInfo(code, prop)
65
+ hash[prop] = value unless(value.nil? || value == '')
66
+ end
67
+ return hash
68
+ end
69
+
70
+ public
71
+ def self.dump_info(product_name)
72
+ installer = WIN32OLE.new('WindowsInstaller.Installer')
73
+ properties = product_info(installer, product_code?(product_name, installer))
74
+ properties.each { |id, value| puts "#{id}: #{value}" }
75
+ end
76
+
77
+ def self.msi_records(msi)
78
+ records = {}
79
+
80
+ installer = WIN32OLE.new('WindowsInstaller.Installer')
81
+ sql_query = "SELECT * FROM `Property`"
82
+
83
+ db = installer.OpenDatabase(msi, 0)
84
+
85
+ view = db.OpenView(sql_query)
86
+ view.Execute(nil)
87
+
88
+ record = view.Fetch()
89
+ return '' if(record == nil)
90
+
91
+ while(!record.nil?)
92
+ records[record.StringData(1)] = record.StringData(2)
93
+ record = view.Fetch()
94
+ end
95
+ db = nil
96
+ installer = nil
97
+
98
+ return records
99
+ end
100
+
101
+ def self.dump_msi_records(msi)
102
+ records = msi_records(msi)
103
+
104
+ puts "#{msi} Properties:"
105
+ records.each do |key,value|
106
+ puts "#{key}: #{value}"
107
+ end
108
+ end
109
+
110
+ def self.dump_product(product_name)
111
+ installer = WIN32OLE.new('WindowsInstaller.Installer')
112
+ # only one session per process!
113
+ session = installer.OpenProduct(product_code?(product_name, installer))
114
+ db = session.Database
115
+
116
+ sql_query = "SELECT * FROM `Property`"
117
+ view = db.OpenView(sql_query)
118
+ view.Execute(nil)
119
+
120
+ record = view.Fetch()
121
+ return '' if(record == nil)
122
+
123
+ puts "Session Properties:"
124
+ while(!record.nil?)
125
+ puts "#{record.StringData(1)}: #{record.StringData(2)}"
126
+ record = view.Fetch()
127
+ end
128
+ db = nil
129
+ installer = nil
130
+ puts ''
131
+ end
132
+
133
+ def execute(cmd)
134
+ command = Command.new(cmd)
135
+ command.execute
136
+
137
+ raise "Failed: #{cmd} Status: #{command[:exit_code]}\nStdout: #{command[:output]}\nStderr: #{command[:error]}" unless(command[:exit_code] == 0)
138
+ end
139
+ end
@@ -0,0 +1,18 @@
1
+ require 'rspec'
2
+ require './lib/command.rb'
3
+
4
+ describe 'Command' do
5
+ it 'should be able to execute: dir' do
6
+ cmd = Command.new('dir')
7
+ cmd.execute
8
+ expect(cmd[:output].empty?).to eq(false)
9
+ expect(cmd[:output].include?('Directory')).to eq(true)
10
+ end
11
+
12
+ it 'should fail executing: isnotacommand' do
13
+ cmd = Command.new('isnotacommand')
14
+ expect { cmd.execute }.to raise_error
15
+ expect(cmd[:error].include?('No such file or directory')).to eq(true)
16
+ expect(cmd[:exit_status]).to_not eq(0)
17
+ end
18
+ end
@@ -51,8 +51,8 @@ describe 'Wixgem' do
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', {manufacturer: 'musco', has_vb6_files: true, files: ['rakefile.rb'], debug: true})
55
- wix_cmd_text = File.read('test/wixgem_install_vb6_files.msi.wix_cmds.txt')
54
+ Wix.make_installation('test/wixgem_install_vb6_files.msi', {debug: true, manufacturer: 'musco', has_vb6_files: true, files: ['rakefile.rb'], debug: true})
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
@@ -2,7 +2,7 @@ require 'rspec'
2
2
  require './lib/wixgem.rb'
3
3
  require './spec/wixpath.rb'
4
4
  require './spec/test_install.rb'
5
- require './spec/execute.rb'
5
+ require './spec/WindowsInstaller.rb'
6
6
  require './admin.rb'
7
7
 
8
8
  Wix.debug=true
@@ -37,8 +37,7 @@ describe 'Wixgem' do
37
37
  it "should produce the debug files" do
38
38
  if(key == :test5)
39
39
  expect(File.exists?("#{value[0]}.wxs")).to be(true)
40
- expect(File.exists?("#{value[0]}.wix_cmds.txt")).to be(true)
41
- expect(File.exists?("#{value[0]}_paths.txt")).to be(true)
40
+ expect(File.exists?("#{value[0]}.log")).to be(true)
42
41
  end
43
42
  end
44
43
  }
@@ -63,13 +62,13 @@ describe 'Wixgem' do
63
62
 
64
63
  it "should install contents of merge module" do
65
64
  begin
66
- execute("msiexec.exe /i #{msi_file}")
65
+ WindowsInstaller.install(msi_file)
67
66
 
68
67
  install_dir = "C:/Program Files (x86)/#{File.basename(msi_file, '.msi')}"
69
68
  expect(File.exists?("#{install_dir}/rakefile.rb")).to be(true)
70
69
  expect(File.exists?("#{install_dir}/Gemfile")).to be(true)
71
70
  ensure
72
- execute("msiexec.exe /quiet /x #{msi_file}")
71
+ WindowsInstaller.uninstall(msi_file)
73
72
  end
74
73
  end
75
74
  end
@@ -2,9 +2,6 @@ require 'rspec'
2
2
  require './lib/wixgem.rb'
3
3
  require './spec/wixpath.rb'
4
4
  require './admin.rb'
5
- require './spec/test_install.rb'
6
- require './spec/test_files_exist.rb'
7
- require 'json'
8
5
 
9
6
  if(admin?)
10
7
  describe 'Wixgem' do
data/spec/test_install.rb CHANGED
@@ -1,10 +1,11 @@
1
- require './WindowsInstaller.rb'
1
+ require './spec/WindowsInstaller.rb'
2
+
2
3
  require './admin.rb'
3
- require './spec/execute.rb'
4
+ require './lib/command.rb'
4
5
 
5
6
  def get_product_name(msi_file, arg2)
6
7
  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
+ product_name = arg2[:product_name] if(arg2.has_key?(:product_name))
8
9
 
9
10
  return product_name
10
11
  end
@@ -15,30 +16,32 @@ def test_msi(msi_file, arg2)
15
16
  msi_info = WindowsInstaller.msi_records(msi_file)
16
17
  #puts msi_info.to_s
17
18
 
18
- if(arg2.kind_of?(Hash) && arg2.has_key?(:product_name))
19
+ if(arg2.has_key?(:product_name))
19
20
  raise "ProductName is #{msi_info['ProductName']} expected #{product_name}" unless(product_name == msi_info['ProductName'])
20
21
  end
21
22
 
22
- if(arg2.kind_of?(Hash) && arg2.has_key?(:product_code))
23
+ if(arg2.has_key?(:product_code))
23
24
  expected = arg2[:product_code].upcase
24
25
  raise "ProductCode is #{msi_info['ProductCode']} expected #{expected}" unless(expected == msi_info['ProductCode'])
25
26
  end
26
27
 
27
- if(arg2.kind_of?(Hash) && arg2.has_key?(:upgrade_code))
28
+ if(arg2.has_key?(:upgrade_code))
28
29
  expected = arg2[:upgrade_code].upcase
29
30
  raise "UpgradeCode is #{msi_info['UpgradeCode']} expected #{expected}" unless(expected == msi_info['UpgradeCode'])
30
31
  end
31
32
 
32
33
  expected_product_version = '1.0.0.0'
33
- expected_product_version = arg2[:version] if(arg2.kind_of?(Hash) && arg2.has_key?(:version))
34
+ expected_product_version = arg2[:version] if(arg2.has_key?(:version))
34
35
  raise "Invalid product version #{msi_info['ProductVersion']}" if(msi_info['ProductVersion'] != expected_product_version)
35
36
 
36
37
  expected_manufacturer = 'Not Set'
37
- expected_manufacturer = arg2[:manufacturer] if(arg2.kind_of?(Hash) && arg2.has_key?(:manufacturer))
38
+ expected_manufacturer = arg2[:manufacturer] if(arg2.has_key?(:manufacturer))
38
39
  raise "Invalid Manufacturer #{msi_info['Manufacturer']}" if(msi_info['Manufacturer'] != expected_manufacturer)
39
40
  end
40
41
 
41
42
  def test_install(name, msi_file, arg2, callback=nil)
43
+ arg2 = { files: arg2} unless(arg2.kind_of?(Hash))
44
+
42
45
  msi_file = msi_file.gsub(/\//) { |s| s = '\\' }
43
46
 
44
47
  test_msi(msi_file, arg2)
@@ -49,19 +52,18 @@ def test_install(name, msi_file, arg2, callback=nil)
49
52
 
50
53
  if(admin?)
51
54
  while(WindowsInstaller.installed?(product_name))
52
- execute("msiexec.exe /quiet /x #{WindowsInstaller.product_code?(product_name)}")
55
+ WindowsInstaller.uninstall(product_name)
53
56
  end
54
57
  raise "#{name}: Uninstall #{product_name} before running tests" if(WindowsInstaller.installed?(product_name))
55
58
 
56
59
  begin
57
- execute("msiexec.exe /i #{msi_file}")
58
- #WindowsInstaller.dump_info(product_name)
60
+ WindowsInstaller.install(msi_file)
59
61
 
60
62
  raise "#{name}: Product name #{product_name} is not installed" unless(WindowsInstaller.installed?(product_name))
61
63
 
62
64
  eval callback unless(callback == nil)
63
65
  ensure
64
- execute("msiexec.exe /quiet /x #{msi_file}") if(WindowsInstaller.installed?(product_name))
66
+ WindowsInstaller.uninstall(msi_file) if(WindowsInstaller.installed?(product_name))
65
67
  raise "Failed to uninstall product #{product_name}" if(WindowsInstaller.installed?(product_name))
66
68
  end
67
69
  end
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.32.0
4
+ version: 0.33.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-16 00:00:00.000000000 Z
11
+ date: 2015-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - '='
73
73
  - !ruby/object:Gem::Version
74
74
  version: 1.0.28
75
+ - !ruby/object:Gem::Dependency
76
+ name: logging
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
75
89
  description: Simple Ruby interface to facilitate creating and compiling windows installation
76
90
  files with the Wix Toolset.
77
91
  email: KCCKSMarshall@gmail.com
@@ -86,11 +100,11 @@ files:
86
100
  - example/install_files/directory/file2.txt
87
101
  - example/install_files/file1.txt
88
102
  - example/rakefile.rb
89
- - lib/templates/Install.wxs
90
- - lib/templates/mergemodule.wxs
103
+ - lib/command.rb
91
104
  - lib/wixgem.rb
92
105
  - spec/COM_spec.rb
93
- - spec/execute.rb
106
+ - spec/WindowsInstaller.rb
107
+ - spec/command_spec.rb
94
108
  - spec/installation_spec.rb
95
109
  - spec/mergemodule_spec.rb
96
110
  - spec/multiple_product_installation_spec.rb
@@ -1,26 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
3
- <Product Id="PRODUCT_CODE" Name="PRODUCT_NAME" Language="1033" Version="VERSION" Manufacturer="MANUFACTURER" UpgradeCode="UPGRADE_CODE">
4
- <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
5
-
6
- <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
7
- <Media Id="1" Cabinet="WixgemTest.cab" EmbedCab="yes" />
8
-
9
- <!-- Step 1: Define the directory structure -->
10
- <Directory Id="TARGETDIR" Name="SourceDir">
11
- <Directory Id="ProgramFilesFolder">
12
- INSTALL_DIR
13
- </Directory>
14
- </Directory>
15
-
16
- <!-- Step 2: Add files to installer package -->
17
- <DirectoryRef Id="INSTALLFOLDER">
18
- FILES
19
- </DirectoryRef>
20
-
21
- <!-- Step 3: Tell Wix to install the files-->
22
- <Feature Id="ProductFeature" Title="PRODUCT_NAME Installation" Level="1">
23
- COMPONENT_REFS
24
- </Feature>
25
- </Product>
26
- </Wix>
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
3
- <Module Id="MODULE_NAME" Language="1033" Version="VERSION">
4
- <Package Id="PRODUCT_CODE" InstallerVersion="200" Manufacturer="MANUFACTURER" />
5
- COMPONENT_REFS
6
- <Directory Id="TARGETDIR" Name="SourceDir">
7
- <Directory Id="MergeRedirectFolder" />
8
- </Directory>
9
- </Module>
10
- <Fragment>
11
- <DirectoryRef Id="MergeRedirectFolder">
12
- FILES
13
- </DirectoryRef>
14
- </Fragment>
15
- </Wix>
data/spec/execute.rb DELETED
@@ -1,8 +0,0 @@
1
- require 'dev_tasks'
2
-
3
- def execute(cmd)
4
- command = Command.new(cmd)
5
- command.execute
6
-
7
- raise "Failed: #{cmd} Status: #{command[:exit_code]}\nStdout: #{command[:output]}\nStderr: #{command[:error]}" unless(command[:exit_code] == 0)
8
- end