wixgem 0.110.0 → 0.111.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10e61c62d03979266feff1ade5dcef49603123b87b8fa6e6103466783c9ef203
4
- data.tar.gz: 3ceb485b6e95b995d43d09e53fa89738a533d70ac1b3bec2d5390f8c3b5954ea
3
+ metadata.gz: acbf145ad790fe0b0faabf479d25e3837f65700d477e93a910d6efcd9f77e04d
4
+ data.tar.gz: cbc834eebb2e65b249f157edf7ebe065548d3cbd26d0968b2bc0ca672e14494e
5
5
  SHA512:
6
- metadata.gz: 36d3b66c9e9a27ab5850bbc429a3f8e6148915bf9df77a612dbc797cc01ee872fccdc4f942a6c75b8eeb368713e32ecdf09bdd54f73a1027ff993d0e59f5e4dc
7
- data.tar.gz: ece434c79d788ee69e20df13ce90cf31d7224db1c7fab0ad66381de28e3210125efb7ba50965965b5f8e00f18bc91273f0f26b508da2009ba1c1ceb1aabaa96d
6
+ metadata.gz: 69a025c6eef3598dbf2dba9f68265aa05c04f75af7f92c6af48929860781b9519e65b1bcad5d1824785428b3796a92fd8287f99be637758252234b9f984394e2
7
+ data.tar.gz: c27dba3df585bc4b46de25be5dd988eeb07c3f73f18537ce40e65d84b30131550d80a1de9864272f29754b5a7336d0bbc746a4511cb0ef36efb43725cfd389f6
data/lib/custom_action.rb CHANGED
@@ -48,8 +48,8 @@ class CustomAction
48
48
  action.attributes['FileKey'] = file_key
49
49
  end
50
50
 
51
- action.attributes['Directory'] = custom_action[:directory] if(custom_action.key?(:directory))
52
- action.attributes['ExeCommand'] = custom_action[:exe_command] if(custom_action.key?(:exe_command))
51
+ action.attributes['Directory'] = custom_action[:directory] if(custom_action.key?(:directory))
52
+ action.attributes['ExeCommand'] = custom_action[:exe_command] if(custom_action.key?(:exe_command))
53
53
  action.attributes['DllEntry'] = custom_action[:dll_entry] if(custom_action.key?(:dll_entry))
54
54
 
55
55
  if(custom_action.key?(:property))
data/lib/registry_key.rb CHANGED
@@ -1,81 +1,42 @@
1
- require 'rexml/document'
2
- require 'SecureRandom'
1
+ ##require 'rexml/document'
2
+ #require 'SecureRandom'
3
3
 
4
- module Wixgem
4
+ #module Wixgem
5
5
 
6
- class CustomAction
6
+ # https://support.firegiant.com/hc/en-us/articles/230912127-RegistryKey-and-RegistryValue-elements
7
+ class RegistryKey
7
8
  def initialize(xml_doc, input)
8
9
  @xml_doc = xml_doc
9
10
  @input = input
10
11
  end
11
- def add(custom_action)
12
- unless(custom_action.key?(:file) || custom_action.key?(:binary_key) || custom_action.key?(:property) || custom_action.key?(:directory))
13
- raise 'Currently, only supported custom actions work with installed executable, binary key, property, or directory'
14
- end
15
-
16
- file_key=nil
17
- if(custom_action.key?(:file))
18
- install_path = ".\\#{custom_action[:file].gsub(/\//,'\\')}"
19
- file_elements = REXML::XPath.match(@xml_doc, "//File[@Source='#{install_path}']")
20
- raise "Unable to locate installation file '#{custom_action[:file]} for custom action'" if(file_elements.nil? || (file_elements.size == 0))
21
-
22
- file_key = file_elements[0].attributes['Id']
23
- end
24
-
25
- id = "ca_#{SecureRandom.uuid.gsub(/-/,'')}"
26
- id = custom_action[:id] if(custom_action.key?(:id))
27
-
28
- impersonate = 'yes'
29
- impersonate = custom_action[:impersonate] if(custom_action.key?(:impersonate))
30
-
31
- condition='NOT Installed AND NOT REMOVE'
32
- condition='1' if(custom_action.key?(:binary_key))
33
- condition = custom_action[:condition] if(custom_action.key?(:condition))
34
-
35
- execute='deferred'
36
- execute = custom_action[:execute] if(custom_action.key?(:execute))
37
-
38
- ret='check'
39
- ret = custom_action[:return] if(custom_action.key?(:return))
40
-
41
- wix_element = REXML::XPath.match(@xml_doc, "/Wix")[0]
42
- fragment = wix_element.add_element 'Fragment'
43
-
44
- action = fragment.add_element 'CustomAction', { 'Id' => id, 'Impersonate' => impersonate, 'Return' => ret, 'HideTarget' => 'no', 'Execute' => execute }
45
- if(custom_action.key?(:binary_key))
46
- action.attributes['BinaryKey'] = custom_action[:binary_key]
47
- else
48
- action.attributes['FileKey'] = file_key
49
- end
12
+ def add(registry_key)
13
+ unless(registry_key.key?(:root) && registry_key.key?(:key) && registry_key.key?(:value))
14
+ raise 'Registry key must have root, key, and value elements'
15
+ end
50
16
 
51
- action.attributes['Directory'] = custom_action[:directory] if(custom_action.key?(:directory))
52
- action.attributes['ExeCommand'] = custom_action[:exe_command] if(custom_action.key?(:exe_command))
53
- action.attributes['DllEntry'] = custom_action[:dll_entry] if(custom_action.key?(:dll_entry))
17
+ key_value = registry_key[:value]
18
+ unless(key_value.key?(:name) || key_value.key?(:value) || key_value.key?(:type))
19
+ raise 'Registry value must have name, value, and type elements'
20
+ end
54
21
 
55
- if(custom_action.key?(:property))
56
- raise "Custom action property '#{custom_action[:property]} must have a value!" unless(custom_action.key?(:value))
57
- action.attributes.delete('ExeCommand')
58
- action.attributes.delete('Return')
59
- action.attributes['Property'] = custom_action[:property]
60
- action.attributes['Value'] = custom_action[:value]
61
- end
62
-
63
- install_execute_sequence = fragment.add_element 'InstallExecuteSequence'
22
+ registry_keys_component = REXML::XPath.match(@xml_doc, "//Component[@Id='RegistryKeys']")
23
+ if(registry_keys_component.size == 0)
24
+ wix_element = REXML::XPath.match(@xml_doc, "/Wix")[0]
25
+ fragment = wix_element.add_element 'Fragment'
26
+ component_group = fragment.add_element 'ComponentGroup'
27
+ component_group.attributes['Id'] = "rk_#{SecureRandom.uuid.gsub(/-/,'')}"
64
28
 
65
- custom_action[:before] = 'InstallFinalize' if(!custom_action.key?(:after) && !custom_action.key?(:before))
66
- if(custom_action.key?(:after))
67
- action = install_execute_sequence.add_element 'Custom', { 'Action' => id, 'After' => custom_action[:after] }
68
- action.text = condition
69
- else
70
- action = install_execute_sequence.add_element 'Custom', { 'Action' => id, 'Before' => custom_action[:before] }
71
- action.text = condition
72
- end
73
-
74
- control=nil
75
- elements = REXML::XPath.match(@xml_doc, "/Wix/Product")
76
- elements = REXML::XPath.match(@xml_doc, "/Wix/Module") if(elements.nil? || elements.size == 0)
77
-
78
- elements[0].add_element 'CustomActionRef', { 'Id' => id }
79
- end
80
- end
29
+ default_feature = REXML::XPath.match(@xml_doc, '//Wix/Product/Feature')
30
+ component_ref = default_feature[0].add_element 'ComponentGroupRef', 'Id' => component_group.attributes['Id']
31
+
32
+ component = component_group.add_element 'Component'
33
+ component.attributes['Id'] = 'RegistryKeys'
34
+ component.attributes['Directory'] = 'INSTALLDIR'
35
+ else
36
+ puts "component: #{registry_keys_component.to_s}"
37
+ end
38
+
39
+ registry_key_element = component.add_element 'RegistryKey', { 'Root' => registry_key[:root], 'Key' => registry_key[:key] }
40
+ value_element = registry_key_element.add_element 'RegistryValue', { 'Action' => 'write', 'Name' => key_value[:name], 'Value' => key_value[:value], 'Type' => key_value[:type] }
41
+ end
81
42
  end
data/lib/wixgem.rb CHANGED
@@ -6,6 +6,7 @@ require 'SecureRandom'
6
6
  require_relative 'file.rb'
7
7
  require_relative 'shortcut.rb'
8
8
  require_relative 'custom_action.rb'
9
+ require_relative 'registry_key.rb'
9
10
  require_relative 'temp_directory.rb'
10
11
  require_relative 'associate_extension.rb'
11
12
  require_relative 'service.rb'
@@ -134,13 +135,22 @@ class Wix
134
135
 
135
136
  def self.manage_custom_actions(xml_doc, input)
136
137
  custom_actions = CustomAction.new(xml_doc, input)
137
- return xml_doc if(input[:custom_actions].nil?)
138
+ return xml_doc if(input[:custom_actions].nil?)
138
139
 
139
- input[:custom_actions].each { |ca| custom_actions.add(ca) } if(input.key?(:custom_actions))
140
+ input[:custom_actions].each { |ca| custom_actions.add(ca) }
140
141
 
141
- return xml_doc
142
+ return xml_doc
142
143
  end
143
-
144
+
145
+ def self.manage_registry_keys(xml_doc, input)
146
+ return xml_doc if(input[:set_registry_keys].nil?)
147
+
148
+ registry_keys = RegistryKey.new(xml_doc, input)
149
+ input[:set_registry_keys].each { |rk| registry_keys.add(rk) }
150
+
151
+ return xml_doc
152
+ end
153
+
144
154
  def self.manage_associate_extensions(xml_doc, input)
145
155
  return xml_doc unless(input.key?(:extensions))
146
156
 
@@ -270,7 +280,7 @@ class Wix
270
280
  files = input
271
281
  files = input[:files] if(input.kind_of?(Hash))
272
282
 
273
- return files
283
+ return files
274
284
  end
275
285
 
276
286
  def self.ignore_files(input)
@@ -527,6 +537,7 @@ class Wix
527
537
  xml_doc = manage_win10_crt(xml_doc, input)
528
538
  #xml_doc = manage_ui(xml_doc, input)
529
539
  xml_doc = manage_custom_actions(xml_doc, input)
540
+ xml_doc = manage_registry_keys(xml_doc, input)
530
541
  xml_doc = manage_upgrade(xml_doc,input)
531
542
  xml_doc = manage_msm_files(xml_doc)
532
543
  xml_doc = manage_read_only_files(xml_doc,input)
@@ -603,6 +614,7 @@ class Wix
603
614
  rescue Exception => e
604
615
  raise e
605
616
  ensure
617
+ puts "debug path: #{output_absolute_path}" if(@debug)
606
618
  FileUtils.cp("#{dir}/#{wxs_file}", "#{output_absolute_path}.wxs") if(File.exists?("#{dir}/#{wxs_file}") && @debug)
607
619
  File.open("#{output_absolute_path}.log", 'w') { |f| f.puts(@logger) } if(@debug &!@logger.nil?)
608
620
  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.110.0
4
+ version: 0.111.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: 2023-04-12 00:00:00.000000000 Z
11
+ date: 2023-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: execute
@@ -140,7 +140,6 @@ files:
140
140
  - lib/associate_extension.rb
141
141
  - lib/custom_action.rb
142
142
  - lib/file.rb
143
- - lib/registry_entries.rb
144
143
  - lib/registry_key.rb
145
144
  - lib/service.rb
146
145
  - lib/shortcut.rb
@@ -1,68 +0,0 @@
1
- class RegistryEntries
2
- def initialize(hash)
3
- @hash = hash
4
- end
5
-
6
- def create_key(xml_doc)
7
- raise "RegistryEntry hash is required to have a :root key" unless(@hash.has_key?(:root))
8
- raise "RegistryEntry hash is required to have a :path key" unless(@hash.has_key?(:path))
9
- raise "RegistryEntry hash is required to have a :key key" unless(@hash.has_key?(:key))
10
- raise "Key hash is required to have a :name key" unless(@hash[:key].has_key?(:name))
11
- raise "Key hash is required to have a :value key" unless(@hash[:value].has_key?(:name))
12
- raise "Key hash is required to have a :value key" unless(@hash[:value_type].has_key?(:name))
13
-
14
- service_exe = @hash[:service_exe]
15
- raise "Service #{file} does not exist" unless(File.exists?(service_exe))
16
-
17
- file_elements = REXML::XPath.match(xml_doc, "//File[@Source='.\\#{service_exe.gsub(/\//,'\\')}']")
18
- raise "Service #{@file} does not match a 'File' element with a 'Source' attribute in the wix generated wix file" if(file_elements.length == 0)
19
-
20
- service_exe_element = file_elements[0]
21
- service_exe_element.attributes['KeyPath']='yes'
22
-
23
- create_service_element(xml_doc, service_exe_element)
24
-
25
- return xml_doc
26
- end
27
-
28
- def set(xml_doc, input)
29
- file = file.gsub(/\//,'\\')
30
- file_elements = REXML::XPath.match(@xml_doc, "//File[@Source='.\\#{file}']")
31
- raise "Unable to find file '#{file}' to associate with extension '#{extension}'" if(file_elements.nil? || file_elements.size != 1)
32
-
33
- file_parent = file_elements[0].parent
34
-
35
- app=File.basename(file)
36
- # App Paths to support Start,Run -> "myapp"
37
- #<RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MyApp.exe" Value="[!MyApp.exe]" Type="string" />
38
- file_parent.add_element 'RegistryValue', { 'Root' => 'HKLM', 'Key' => "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\#{app}",
39
- 'Value' => "[INSTALLDIR]#{file}", 'Type' => 'string' }
40
- #<RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MyApp.exe" Name="Path" Value="[APPLICATIONFOLDER]" Type="string" />
41
- file_parent.add_element 'RegistryValue', { 'Root' => 'HKLM', 'Key' => "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\#{app}",
42
- 'Name' => 'Path', 'Value' => '[INSTALLDIR]', 'Type' => 'string' }
43
-
44
- # Extend to the "open with" list + Win7 jump menu pinning
45
- #<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\MyApp.exe\SupportedTypes" Name=".xyz" Value="" Type="string" />
46
- file_parent.add_element 'RegistryValue', { 'Root' => 'HKLM', 'Key' => "SOFTWARE\\Classes\\Applications\\#{app}\\SupportedTypes",
47
- 'Name' => extension, 'Value' => '', 'Type' => 'string' }
48
- #<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\MyApp.exe\shell\open" Name="FriendlyAppName" Value="!(loc.ApplicationName)" Type="string" />
49
- file_parent.add_element 'RegistryValue', { 'Root' => 'HKLM', 'Key' => "SOFTWARE\\Classes\\Applications\\#{app}\\shell\\open\\command",
50
- 'Value' => "[INSTALLDIR]#{file} \"%1\"", 'Type' => 'string' }
51
-
52
- # MyApp.Document ProgID
53
- #<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\MyApp.Document" Name="FriendlyTypeName" Value="!(loc.DescXYZ)" Type="string" />
54
- file_parent.add_element 'RegistryValue', { 'Root' => 'HKLM', 'Key' => "SOFTWARE\\Classes\\#{File.basename(app, '.exe')}.Document",
55
- 'Name' => 'Aim Project File', 'Value' => "[INSTALLDIR]#{app} \"%1\"", 'Type' => 'string' }
56
-
57
- #<ProgId Id="MyApp.Document" Description="!(loc.DescXYZ)" Icon="filetype.ico" Advertise="yes">
58
- # <Extension Id="xyz">
59
- # <Verb Id="open" Command="!(loc.ExplorerMenuOpenXYZ)" Argument="&quot;%1&quot;" />
60
- # <MIME Advertise="yes" ContentType="application/xyz" Default="yes" />
61
- # </Extension>
62
- #</ProgId>
63
- prog_id = file_parent.add_element 'ProgId', { 'Id' => "#{File.basename(app, '.exe')}.Document", 'Description' => "Aim project file",
64
- 'Advertise' => 'yes'}
65
- ext = prog_id.add_element 'Extension', { 'Id' => extension.gsub(/\./, '') }
66
- ext.add_element 'Verb', { 'Id' => 'open', 'Command' => "[INSTALLDIR]#{app}", 'Argument' => "\"%1\"" }
67
- end
68
- end