u3d 1.2.3 → 1.3.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 +5 -5
- data/.circleci/config.yml +33 -10
- data/.github/workflows/ci.yml +35 -0
- data/.github_changelog_generator +3 -1
- data/.gitignore +1 -0
- data/.rubocop.yml +15 -3
- data/CHANGELOG.md +62 -11
- data/Gemfile.lock +147 -87
- data/Rakefile +12 -7
- data/appveyor.yml +25 -6
- data/examples/Example1/Gemfile +4 -2
- data/examples/Example1/Gemfile.lock +8 -6
- data/examples/Example1/Rakefile +2 -0
- data/examples/Example1/fastlane/Fastfile +2 -0
- data/examples/Example2/Gemfile +4 -2
- data/examples/Example2/Gemfile.lock +12 -7
- data/examples/Example2/fastlane/Fastfile +2 -0
- data/exe/u3d +3 -1
- data/lib/u3d/asset.rb +6 -2
- data/lib/u3d/cache.rb +14 -10
- data/lib/u3d/commands.rb +14 -9
- data/lib/u3d/commands_generator.rb +6 -4
- data/lib/u3d/compatibility.rb +2 -0
- data/lib/u3d/download_validator.rb +6 -3
- data/lib/u3d/downloader.rb +12 -8
- data/lib/u3d/failure_reporter.rb +4 -3
- data/lib/u3d/hub_modules_parser.rb +24 -7
- data/lib/u3d/ini_modules_parser.rb +10 -8
- data/lib/u3d/installation.rb +31 -49
- data/lib/u3d/installer.rb +44 -33
- data/lib/u3d/log_analyzer.rb +31 -27
- data/lib/u3d/unity_license.rb +2 -0
- data/lib/u3d/unity_module.rb +2 -0
- data/lib/u3d/unity_project.rb +4 -1
- data/lib/u3d/unity_runner.rb +12 -10
- data/lib/u3d/unity_version_definition.rb +3 -0
- data/lib/u3d/unity_version_number.rb +8 -2
- data/lib/u3d/unity_versions.rb +28 -23
- data/lib/u3d/utils.rb +82 -15
- data/lib/u3d/version.rb +8 -6
- data/lib/u3d.rb +2 -0
- data/lib/u3d_core/admin_tools.rb +2 -0
- data/lib/u3d_core/command_executor.rb +11 -7
- data/lib/u3d_core/command_runner.rb +17 -19
- data/lib/u3d_core/core_ext/hash.rb +2 -0
- data/lib/u3d_core/core_ext/operating_system_symbol.rb +3 -0
- data/lib/u3d_core/core_ext/string.rb +2 -0
- data/lib/u3d_core/credentials.rb +9 -7
- data/lib/u3d_core/env.rb +3 -0
- data/lib/u3d_core/globals.rb +7 -7
- data/lib/u3d_core/helper.rb +6 -4
- data/lib/u3d_core/ui/disable_colors.rb +2 -0
- data/lib/u3d_core/ui/implementations/shell.rb +8 -5
- data/lib/u3d_core/ui/interface.rb +3 -0
- data/lib/u3d_core/ui/ui.rb +5 -4
- data/lib/u3d_core/update_checker/changelog.rb +4 -0
- data/lib/u3d_core/update_checker/update_checker.rb +7 -8
- data/lib/u3d_core/version.rb +2 -0
- data/lib/u3d_core.rb +2 -0
- data/u3d.gemspec +19 -9
- metadata +101 -30
data/lib/u3d/installer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
## --- BEGIN LICENSE BLOCK ---
|
2
4
|
# Copyright (c) 2016-present WeWantToKnow AS
|
3
5
|
#
|
@@ -30,13 +32,13 @@ require 'pathname'
|
|
30
32
|
require 'zip'
|
31
33
|
|
32
34
|
module U3d
|
33
|
-
DEFAULT_LINUX_INSTALL = '/opt/'
|
34
|
-
DEFAULT_MAC_INSTALL = '/'
|
35
|
-
DEFAULT_WINDOWS_INSTALL = 'C:/Program Files/'
|
36
|
-
UNITY_DIR = "Unity_%<version>s"
|
37
|
-
UNITY_DIR_LONG = "Unity_%<version>s_%<build_number>s"
|
38
|
-
UNITY_DIR_LINUX = "unity-editor-%<version>s"
|
39
|
-
UNITY_DIR_LINUX_LONG = "unity-editor-%<version>s_%<build_number>s"
|
35
|
+
DEFAULT_LINUX_INSTALL = '/opt/'
|
36
|
+
DEFAULT_MAC_INSTALL = '/'
|
37
|
+
DEFAULT_WINDOWS_INSTALL = 'C:/Program Files/'
|
38
|
+
UNITY_DIR = "Unity_%<version>s"
|
39
|
+
UNITY_DIR_LONG = "Unity_%<version>s_%<build_number>s"
|
40
|
+
UNITY_DIR_LINUX = "unity-editor-%<version>s"
|
41
|
+
UNITY_DIR_LINUX_LONG = "unity-editor-%<version>s_%<build_number>s"
|
40
42
|
|
41
43
|
class Installer
|
42
44
|
def self.create
|
@@ -57,7 +59,7 @@ module U3d
|
|
57
59
|
installer = Installer.create
|
58
60
|
files.each do |name, file, info|
|
59
61
|
UI.header "Installing #{info.name} (#{name})"
|
60
|
-
UI.message
|
62
|
+
UI.message "Installing with #{file}"
|
61
63
|
installer.install(file, version, installation_path: installation_path, info: info)
|
62
64
|
end
|
63
65
|
end
|
@@ -71,20 +73,24 @@ module U3d
|
|
71
73
|
class BaseInstaller
|
72
74
|
def sanitize_installs
|
73
75
|
return unless UI.interactive? || Helper.test?
|
76
|
+
|
74
77
|
unclean = []
|
75
78
|
installed.each { |unity| unclean << unity unless unity.clean_install? }
|
76
79
|
return if unclean.empty?
|
80
|
+
|
77
81
|
UI.important("u3d can optionally standardize the existing Unity installation names and locations.")
|
78
82
|
UI.important("Check the documentation for more information:")
|
79
83
|
UI.important("** https://github.com/DragonBox/u3d/blob/master/README.md#default-installation-paths **")
|
80
84
|
unclean.each { |unity| sanitize_install(unity, dry_run: true) }
|
81
85
|
return unless UI.confirm("#{unclean.count} Unity installation(s) will be moved. Proceed??")
|
86
|
+
|
82
87
|
unclean.each { |unity| sanitize_install(unity) }
|
83
88
|
end
|
84
89
|
|
85
90
|
def installed_sorted_by_versions
|
86
91
|
list = installed
|
87
92
|
return [] if list.empty?
|
93
|
+
|
88
94
|
list.sort { |a, b| UnityVersionComparator.new(a.version) <=> UnityVersionComparator.new(b.version) }
|
89
95
|
end
|
90
96
|
|
@@ -123,7 +129,7 @@ module U3d
|
|
123
129
|
end
|
124
130
|
end
|
125
131
|
|
126
|
-
if info
|
132
|
+
if info&.rename_from && info&.rename_to
|
127
133
|
rename_from = info.rename_from.gsub(/{UNITY_PATH}/, unity.root_path)
|
128
134
|
rename_to = info.rename_to.gsub(/{UNITY_PATH}/, unity.root_path)
|
129
135
|
Utils.ensure_dir(rename_to)
|
@@ -131,7 +137,7 @@ module U3d
|
|
131
137
|
if File.file? rename_from
|
132
138
|
FileUtils.mv(rename_from, rename_to)
|
133
139
|
else
|
134
|
-
Dir.glob(rename_from
|
140
|
+
Dir.glob("#{rename_from}/*").each { |path| FileUtils.mv(path, rename_to) }
|
135
141
|
end
|
136
142
|
end
|
137
143
|
|
@@ -139,7 +145,7 @@ module U3d
|
|
139
145
|
end
|
140
146
|
|
141
147
|
def package_destination(info, unity_root_path)
|
142
|
-
if info
|
148
|
+
if info&.destination
|
143
149
|
info.destination.gsub(/{UNITY_PATH}/, unity_root_path)
|
144
150
|
else
|
145
151
|
unity_root_path
|
@@ -151,14 +157,15 @@ module U3d
|
|
151
157
|
# Returns an array of ruby style paths
|
152
158
|
def extra_installation_paths
|
153
159
|
return [] if ENV['U3D_EXTRA_PATHS'].nil?
|
160
|
+
|
154
161
|
ENV['U3D_EXTRA_PATHS'].strip.split(File::PATH_SEPARATOR).map { |p| File.expand_path p }
|
155
162
|
end
|
156
163
|
|
157
|
-
def find_installations_with_path(default_root_path: '', postfix: [])
|
164
|
+
def find_installations_with_path(default_root_path: '', postfix: [], &block)
|
158
165
|
([default_root_path] | extra_installation_paths).map do |path|
|
159
166
|
UI.verbose "Looking for installed Unity version under #{path}"
|
160
167
|
pattern = File.join([path] + postfix)
|
161
|
-
Dir.glob(pattern).map
|
168
|
+
Dir.glob(pattern).map(&block)
|
162
169
|
end.flatten
|
163
170
|
end
|
164
171
|
end
|
@@ -189,15 +196,16 @@ module U3d
|
|
189
196
|
end
|
190
197
|
|
191
198
|
def install(file_path, version, installation_path: nil, info: nil)
|
192
|
-
# rubocop:enable UnusedMethodArgument
|
193
199
|
extension = File.extname(file_path)
|
194
200
|
raise "Installation of #{extension} files is not supported on Mac" unless %w[.zip .po .pkg .dmg].include? extension
|
201
|
+
|
195
202
|
path = installation_path || DEFAULT_MAC_INSTALL
|
196
|
-
|
203
|
+
case extension
|
204
|
+
when '.po'
|
197
205
|
install_po(file_path, version, info: info)
|
198
|
-
|
206
|
+
when '.zip'
|
199
207
|
install_zip(file_path, version, info: info)
|
200
|
-
|
208
|
+
when '.dmg'
|
201
209
|
UI.important "Skipping installation of #{file_path} for now"
|
202
210
|
else
|
203
211
|
install_pkg(file_path, version: version, target_path: path)
|
@@ -278,7 +286,7 @@ module U3d
|
|
278
286
|
end
|
279
287
|
end
|
280
288
|
|
281
|
-
# rubocop:disable ClassLength
|
289
|
+
# rubocop:disable Metrics/ClassLength
|
282
290
|
class LinuxInstaller < BaseInstaller
|
283
291
|
def sanitize_install(unity, long: false, dry_run: false)
|
284
292
|
source_path = File.expand_path(unity.root_path)
|
@@ -296,26 +304,26 @@ module U3d
|
|
296
304
|
paths.map { |path| LinuxInstallation.new(root_path: path) }
|
297
305
|
end
|
298
306
|
|
299
|
-
# rubocop:disable PerceivedComplexity
|
300
307
|
def install(file_path, version, installation_path: nil, info: nil)
|
301
|
-
# rubocop:enable UnusedMethodArgument, PerceivedComplexity
|
302
308
|
extension = File.extname(file_path)
|
303
309
|
|
304
310
|
raise "Installation of #{extension} files is not supported on Linux" unless ['.zip', '.po', '.sh', '.xz', '.pkg'].include? extension
|
305
|
-
|
311
|
+
|
312
|
+
case extension
|
313
|
+
when '.sh'
|
306
314
|
path = installation_path || DEFAULT_LINUX_INSTALL
|
307
315
|
install_sh(file_path, installation_path: path)
|
308
|
-
|
316
|
+
when '.xz'
|
309
317
|
new_path = File.join(DEFAULT_LINUX_INSTALL, format(UNITY_DIR_LINUX, version: version))
|
310
318
|
path = installation_path || new_path
|
311
319
|
install_xz(file_path, installation_path: path)
|
312
|
-
|
320
|
+
when '.pkg'
|
313
321
|
new_path = File.join(DEFAULT_LINUX_INSTALL, format(UNITY_DIR_LINUX, version: version))
|
314
322
|
path = installation_path || new_path
|
315
323
|
install_pkg(file_path, installation_path: path)
|
316
|
-
|
324
|
+
when '.po'
|
317
325
|
install_po(file_path, version, info: info)
|
318
|
-
|
326
|
+
when '.zip'
|
319
327
|
install_zip(file_path, version, info: info)
|
320
328
|
end
|
321
329
|
|
@@ -399,6 +407,7 @@ module U3d
|
|
399
407
|
|
400
408
|
def pkg_install_path(unity_root_path, pinfo_path)
|
401
409
|
raise "PackageInfo not found under #{pinfo_path}" unless File.exist? pinfo_path
|
410
|
+
|
402
411
|
pinfo = File.read(pinfo_path)
|
403
412
|
require 'rexml/document'
|
404
413
|
d = REXML::Document.new(pinfo)
|
@@ -414,6 +423,7 @@ module U3d
|
|
414
423
|
else
|
415
424
|
install_location = d.root.attributes['install-location']
|
416
425
|
raise "Not sure how to install this module with identifier #{identifier} install-location: #{install_location}" unless install_location.start_with? '/Applications/Unity/'
|
426
|
+
|
417
427
|
install_location.gsub(%(\/Applications\/Unity), "#{unity_root_path}/Editor/Data")
|
418
428
|
end
|
419
429
|
end
|
@@ -442,7 +452,7 @@ module U3d
|
|
442
452
|
paths
|
443
453
|
end
|
444
454
|
end
|
445
|
-
# rubocop:enable ClassLength
|
455
|
+
# rubocop:enable Metrics/ClassLength
|
446
456
|
|
447
457
|
class WindowsInstaller < BaseInstaller
|
448
458
|
def sanitize_install(unity, long: false, dry_run: false)
|
@@ -470,10 +480,12 @@ module U3d
|
|
470
480
|
def install(file_path, version, installation_path: nil, info: nil)
|
471
481
|
extension = File.extname(file_path)
|
472
482
|
raise "Installation of #{extension} files is not supported on Windows" unless %w[.po .zip .exe .msi].include? extension
|
483
|
+
|
473
484
|
path = installation_path || File.join(DEFAULT_WINDOWS_INSTALL, format(UNITY_DIR, version: version))
|
474
|
-
|
485
|
+
case extension
|
486
|
+
when '.po'
|
475
487
|
install_po(file_path, version, info: info)
|
476
|
-
|
488
|
+
when '.zip'
|
477
489
|
install_zip(file_path, version, info: info)
|
478
490
|
else
|
479
491
|
install_exe(file_path, installation_path: path, info: info)
|
@@ -489,14 +501,14 @@ module U3d
|
|
489
501
|
if info.command
|
490
502
|
command = info.command
|
491
503
|
if /msiexec/ =~ command
|
492
|
-
command.sub!(/{FILENAME}/,
|
504
|
+
command.sub!(/{FILENAME}/, "\"#{U3dCore::Helper.windows_path(file_path)}\"")
|
493
505
|
else
|
494
506
|
command.sub!(/{FILENAME}/, file_path.argescape)
|
495
507
|
end
|
496
508
|
command.sub!(/{INSTDIR}/, final_path)
|
497
509
|
command.sub!(/{DOCDIR}/, final_path)
|
498
510
|
command.sub!(/{MODULEDIR}/, final_path)
|
499
|
-
command.sub!(%r{
|
511
|
+
command.sub!(%r{/D=}, '/S /D=') unless %r{/S} =~ command
|
500
512
|
end
|
501
513
|
command ||= file_path.argescape
|
502
514
|
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
@@ -572,9 +584,8 @@ module U3d
|
|
572
584
|
raise 'Cannot install dependencies on your Linux distribution'
|
573
585
|
end
|
574
586
|
|
575
|
-
if UI.interactive?
|
576
|
-
|
577
|
-
end
|
587
|
+
return if UI.interactive? && !(UI.confirm "Install dependencies? (#{DEPENDENCIES.length} dependency(ies) to install)")
|
588
|
+
|
578
589
|
U3dCore::CommandExecutor.execute(command: "#{prefix} #{DEPENDENCIES.join(' ')}", admin: true)
|
579
590
|
end
|
580
591
|
end
|
data/lib/u3d/log_analyzer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
## --- BEGIN LICENSE BLOCK ---
|
2
4
|
# Copyright (c) 2016-present WeWantToKnow AS
|
3
5
|
#
|
@@ -25,9 +27,9 @@ require 'u3d/failure_reporter'
|
|
25
27
|
|
26
28
|
module U3d
|
27
29
|
# Analyzes log by filtering output along a set of rules
|
28
|
-
# rubocop:disable ClassLength, PerceivedComplexity, BlockNesting
|
30
|
+
# rubocop:disable Metrics/ClassLength, Metrics/PerceivedComplexity, Metrics/BlockNesting
|
29
31
|
class LogAnalyzer
|
30
|
-
RULES_PATH = File.expand_path('
|
32
|
+
RULES_PATH = File.expand_path('../../config/log_rules.json', __dir__)
|
31
33
|
MEMORY_SIZE = 10
|
32
34
|
|
33
35
|
def initialize
|
@@ -55,6 +57,7 @@ module U3d
|
|
55
57
|
# Phase parsing
|
56
58
|
next unless phase['active']
|
57
59
|
next if phase['phase_start_pattern'].nil?
|
60
|
+
|
58
61
|
phase['phase_start_pattern'] = Regexp.new phase['phase_start_pattern']
|
59
62
|
phase['phase_end_pattern'] = Regexp.new phase['phase_end_pattern'] if phase['phase_end_pattern']
|
60
63
|
phase.delete('comment')
|
@@ -79,6 +82,7 @@ module U3d
|
|
79
82
|
@phases.each do |name, phase|
|
80
83
|
next if name == @active_phase
|
81
84
|
next unless line =~ phase['phase_start_pattern']
|
85
|
+
|
82
86
|
finish_phase if @active_phase
|
83
87
|
@active_phase = name
|
84
88
|
UI.verbose("--- Beginning #{name} phase ---")
|
@@ -116,12 +120,10 @@ module U3d
|
|
116
120
|
# It's not the end of the rules, should the line be stored?
|
117
121
|
elsif rule['store_lines']
|
118
122
|
match = false
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
break
|
124
|
-
end
|
123
|
+
rule['ignore_lines']&.each do |pat|
|
124
|
+
if line =~ pat
|
125
|
+
match = true
|
126
|
+
break
|
125
127
|
end
|
126
128
|
end
|
127
129
|
@rule_lines_buffer << line.chomp unless match
|
@@ -133,6 +135,7 @@ module U3d
|
|
133
135
|
ruleset.each do |rn, r|
|
134
136
|
pattern = r['start_pattern']
|
135
137
|
next unless line =~ pattern
|
138
|
+
|
136
139
|
@active_rule = rn if r['end_pattern']
|
137
140
|
match = line.match(pattern)
|
138
141
|
@context = match.names.map(&:to_sym).zip(match.captures).to_h
|
@@ -145,10 +148,12 @@ module U3d
|
|
145
148
|
match = false
|
146
149
|
r['fetch_first_line_not_matching'].each do |pat|
|
147
150
|
next unless l =~ pat
|
151
|
+
|
148
152
|
match = true
|
149
153
|
break
|
150
154
|
end
|
151
155
|
next if match
|
156
|
+
|
152
157
|
fetched_line = l
|
153
158
|
break
|
154
159
|
end
|
@@ -196,7 +201,7 @@ module U3d
|
|
196
201
|
if @active_rule
|
197
202
|
# Active rule should be finished
|
198
203
|
# If it is still active during phase change, it means that something went wrong
|
199
|
-
context = @lines_memory.map { |l| "> #{l}" }.join
|
204
|
+
context = @lines_memory.map { |l| "> #{l}" }.join
|
200
205
|
UI.error("[#{@active_phase}] Could not finish active rule '#{@active_rule}'. Aborting it. Context:\n#{context}")
|
201
206
|
|
202
207
|
U3d::FailureReporter.report(
|
@@ -237,26 +242,25 @@ module U3d
|
|
237
242
|
message
|
238
243
|
end
|
239
244
|
|
240
|
-
def parse_rule(
|
241
|
-
return false unless
|
242
|
-
return false if
|
243
|
-
|
244
|
-
|
245
|
-
if
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
if r['fetch_line_at_index'] || r['fetch_first_line_not_matching']
|
252
|
-
r['fetched_line_pattern'] = Regexp.new r['fetched_line_pattern'] if r['fetched_line_pattern']
|
245
|
+
def parse_rule(rule)
|
246
|
+
return false unless rule['active']
|
247
|
+
return false if rule['start_pattern'].nil?
|
248
|
+
|
249
|
+
rule['start_pattern'] = Regexp.new rule['start_pattern']
|
250
|
+
rule['end_pattern'] = Regexp.new rule['end_pattern'] if rule['end_pattern']
|
251
|
+
if rule['fetch_line_at_index']
|
252
|
+
rule.delete('fetch_line_at_index') if rule['fetch_line_at_index'] >= MEMORY_SIZE
|
253
|
+
rule.delete('fetch_line_at_index') if rule['fetch_line_at_index'] <= 0
|
254
|
+
elsif rule['fetch_first_line_not_matching']
|
255
|
+
rule['fetch_first_line_not_matching'].map! { |pat| Regexp.new pat }
|
253
256
|
end
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
257
|
+
rule['fetched_line_pattern'] = Regexp.new rule['fetched_line_pattern'] if (rule['fetch_line_at_index'] || rule['fetch_first_line_not_matching']) && (rule['fetched_line_pattern'])
|
258
|
+
rule['type'] = 'important' if rule['type'] == 'warning'
|
259
|
+
rule['type'] = 'message' if rule['type'] && rule['type'] != 'error' && rule['type'] != 'important' && rule['type'] != 'success'
|
260
|
+
rule['type'] ||= 'message'
|
261
|
+
rule['ignore_lines']&.map! { |pat| Regexp.new pat }
|
258
262
|
true
|
259
263
|
end
|
260
264
|
end
|
261
|
-
# rubocop:enable ClassLength, PerceivedComplexity, BlockNesting
|
265
|
+
# rubocop:enable Metrics/ClassLength, Metrics/PerceivedComplexity, Metrics/BlockNesting
|
262
266
|
end
|
data/lib/u3d/unity_license.rb
CHANGED
data/lib/u3d/unity_module.rb
CHANGED
data/lib/u3d/unity_project.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
## --- BEGIN LICENSE BLOCK ---
|
2
4
|
# Copyright (c) 2016-present WeWantToKnow AS
|
3
5
|
#
|
@@ -46,9 +48,10 @@ module U3d
|
|
46
48
|
require 'yaml'
|
47
49
|
project_version = File.join(project_settings_path, 'ProjectVersion.txt')
|
48
50
|
return nil unless File.exist? project_version
|
51
|
+
|
49
52
|
yaml = YAML.safe_load(File.read(project_version))
|
50
53
|
version = yaml['m_EditorVersion']
|
51
|
-
version.gsub
|
54
|
+
version = version.gsub(/(\d+\.\d+\.\d+)(?:x)?(\w\d+)(?:Linux)?/, '\1\2') if Helper.linux?
|
52
55
|
version
|
53
56
|
end
|
54
57
|
end
|
data/lib/u3d/unity_runner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
## --- BEGIN LICENSE BLOCK ---
|
2
4
|
# Copyright (c) 2016-present WeWantToKnow AS
|
3
5
|
#
|
@@ -45,6 +47,7 @@ module U3d
|
|
45
47
|
if log_file
|
46
48
|
tail_thread = start_tail_thread(log_file, output_callback)
|
47
49
|
return unless tail_thread.status
|
50
|
+
|
48
51
|
tail_thread.run
|
49
52
|
end
|
50
53
|
|
@@ -78,9 +81,9 @@ module U3d
|
|
78
81
|
end
|
79
82
|
|
80
83
|
class << self
|
81
|
-
# rubocop:disable MethodName
|
84
|
+
# rubocop:disable Naming/MethodName
|
82
85
|
def find_logFile_in_args(args)
|
83
|
-
# rubocop:enable MethodName
|
86
|
+
# rubocop:enable Naming/MethodName
|
84
87
|
find_arg_in_args('-logFile', args)
|
85
88
|
end
|
86
89
|
|
@@ -90,6 +93,7 @@ module U3d
|
|
90
93
|
|
91
94
|
def find_arg_in_args(arg_to_find, args)
|
92
95
|
raise 'Only arguments of type array supported right now' unless args.is_a?(Array)
|
96
|
+
|
93
97
|
args.each_with_index do |arg, index|
|
94
98
|
return args[index + 1] if arg == arg_to_find && index < args.count - 1
|
95
99
|
end
|
@@ -101,12 +105,10 @@ module U3d
|
|
101
105
|
|
102
106
|
def start_tail_thread(log_file, output_callback)
|
103
107
|
tail_thread = Thread.new do
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
e.backtrace.each { |l| UI.error " #{l}" }
|
109
|
-
end
|
108
|
+
pipe(log_file) { |line| output_callback.call(line) }
|
109
|
+
rescue StandardError => e
|
110
|
+
UI.error "Failure while trying to pipe #{log_file}: #{e.message}"
|
111
|
+
e.backtrace.each { |l| UI.error " #{l}" }
|
110
112
|
end
|
111
113
|
|
112
114
|
# Wait for tail_thread setup to be complete
|
@@ -114,14 +116,14 @@ module U3d
|
|
114
116
|
tail_thread
|
115
117
|
end
|
116
118
|
|
117
|
-
def pipe(file)
|
119
|
+
def pipe(file, &block)
|
118
120
|
File.open(file, 'r') do |f|
|
119
121
|
f.extend File::Tail
|
120
122
|
f.interval = 0.1
|
121
123
|
f.max_interval = 0.4
|
122
124
|
f.backward 0
|
123
125
|
Thread.stop
|
124
|
-
f.tail
|
126
|
+
f.tail(&block)
|
125
127
|
end
|
126
128
|
end
|
127
129
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
## --- BEGIN LICENSE BLOCK ---
|
2
4
|
# Copyright (c) 2016-present WeWantToKnow AS
|
3
5
|
#
|
@@ -51,6 +53,7 @@ module U3d
|
|
51
53
|
|
52
54
|
def [](package)
|
53
55
|
return nil unless available_package? package
|
56
|
+
|
54
57
|
@packages.find { |pack| pack.id == package.downcase }
|
55
58
|
end
|
56
59
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
## --- BEGIN LICENSE BLOCK ---
|
2
4
|
# Copyright (c) 2016-present WeWantToKnow AS
|
3
5
|
#
|
@@ -24,14 +26,14 @@ require 'u3d/utils'
|
|
24
26
|
|
25
27
|
module U3d
|
26
28
|
class UnityVersionNumber
|
27
|
-
attr_reader :unity_version
|
28
|
-
attr_reader :parts
|
29
|
+
attr_reader :unity_version, :parts
|
29
30
|
|
30
31
|
def initialize(version)
|
31
32
|
@unity_version = version
|
32
33
|
parsed = Utils.parse_unity_version(@unity_version)
|
33
34
|
parsed.each_with_index do |val, index|
|
34
35
|
next if val.nil? || (index == 3)
|
36
|
+
|
35
37
|
parsed[index] = val.to_i
|
36
38
|
end
|
37
39
|
@parts = parsed
|
@@ -52,12 +54,16 @@ module U3d
|
|
52
54
|
def <=>(other)
|
53
55
|
comp = @version.parts[0] <=> other.version.parts[0]
|
54
56
|
return comp if comp.nonzero?
|
57
|
+
|
55
58
|
comp = @version.parts[1] <=> other.version.parts[1]
|
56
59
|
return comp if comp.nonzero?
|
60
|
+
|
57
61
|
comp = @version.parts[2] <=> other.version.parts[2]
|
58
62
|
return comp if comp.nonzero?
|
63
|
+
|
59
64
|
comp = RELEASE_LETTER_STRENGTH[@version.parts[3].to_sym] <=> RELEASE_LETTER_STRENGTH[other.version.parts[3].to_sym]
|
60
65
|
return comp if comp.nonzero?
|
66
|
+
|
61
67
|
return @version.parts[4] <=> other.version.parts[4]
|
62
68
|
end
|
63
69
|
|
data/lib/u3d/unity_versions.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
## --- BEGIN LICENSE BLOCK ---
|
2
4
|
# Copyright (c) 2016-present WeWantToKnow AS
|
3
5
|
#
|
@@ -47,6 +49,7 @@ module U3d
|
|
47
49
|
def fetch_cookie
|
48
50
|
UI.verbose "FetchCookie? #{@cookie}"
|
49
51
|
return @cookie if @cookie
|
52
|
+
|
50
53
|
cookie_str = ''
|
51
54
|
url = 'https://forum.unity.com/forums/linux-editor.93/' # a page that triggers cookies
|
52
55
|
uri = URI(url)
|
@@ -56,15 +59,15 @@ module U3d
|
|
56
59
|
response = http.request request
|
57
60
|
|
58
61
|
case response
|
59
|
-
when Net::HTTPSuccess
|
62
|
+
when Net::HTTPSuccess
|
60
63
|
UI.verbose "unexpected result"
|
61
|
-
when Net::HTTPRedirection
|
64
|
+
when Net::HTTPRedirection
|
62
65
|
# A session must be opened with the server before accessing forum
|
63
66
|
res = nil
|
64
67
|
cookie_str = ''
|
65
68
|
# Store the name and value of the cookies returned by the server
|
66
69
|
response['set-cookie'].gsub(/\s+/, '').split(',').each do |c|
|
67
|
-
cookie_str << c.split(';', 2)[0]
|
70
|
+
cookie_str << ("#{c.split(';', 2)[0]}; ")
|
68
71
|
end
|
69
72
|
cookie_str.chomp!('; ')
|
70
73
|
|
@@ -78,6 +81,7 @@ module U3d
|
|
78
81
|
end
|
79
82
|
|
80
83
|
raise 'Unexpected result' unless res.is_a? Net::HTTPRedirection
|
84
|
+
|
81
85
|
# It should be a redirection to the forum to perform authentication
|
82
86
|
uri = URI(res['location'])
|
83
87
|
UI.verbose "Redirecting to #{uri}"
|
@@ -90,50 +94,51 @@ module U3d
|
|
90
94
|
raise 'Unable to establish a session with Unity forum' unless res.is_a? Net::HTTPRedirection
|
91
95
|
|
92
96
|
UI.verbose "Found cookie_str #{cookie_str}"
|
93
|
-
cookie_str <<
|
97
|
+
cookie_str << ("; #{res['set-cookie'].gsub(/\s+/, '').split(';', 2)[0]}")
|
94
98
|
end
|
95
99
|
end
|
96
100
|
UI.verbose "Found @cookie #{cookie_str}"
|
97
101
|
@cookie = cookie_str
|
98
102
|
end
|
99
103
|
end
|
104
|
+
|
100
105
|
# Takes care of fectching versions and version list
|
101
106
|
module UnityVersions
|
102
107
|
#####################################################
|
103
108
|
# @!group URLS: Locations to fetch information from
|
104
109
|
#####################################################
|
105
110
|
# URL for the forum thread listing all the Linux releases
|
106
|
-
UNITY_LINUX_DOWNLOADS = 'https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/'
|
111
|
+
UNITY_LINUX_DOWNLOADS = 'https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/'
|
107
112
|
# URL for the main releases for Windows and Macintosh
|
108
|
-
UNITY_DOWNLOADS = 'https://unity3d.com/get-unity/download/archive'
|
113
|
+
UNITY_DOWNLOADS = 'https://unity3d.com/get-unity/download/archive'
|
109
114
|
# URL for the LTS releases for Windows and Macintosh
|
110
|
-
UNITY_LTSES = 'https://unity3d.com/unity/qa/lts-releases'
|
115
|
+
UNITY_LTSES = 'https://unity3d.com/unity/qa/lts-releases'
|
111
116
|
# URL for the patch releases for Windows and Macintosh
|
112
|
-
UNITY_PATCHES = 'https://unity3d.com/unity/qa/patch-releases'
|
117
|
+
UNITY_PATCHES = 'https://unity3d.com/unity/qa/patch-releases'
|
113
118
|
# URL for the beta releases list, they need to be accessed after
|
114
|
-
UNITY_BETAS = 'https://unity3d.com/unity/beta/archive'
|
119
|
+
UNITY_BETAS = 'https://unity3d.com/unity/beta/archive'
|
115
120
|
# URL for a specific beta, takes into parameter a version string (%s)
|
116
|
-
UNITY_BETA_URL = 'https://unity3d.com/unity/beta/unity%<version>s'
|
121
|
+
UNITY_BETA_URL = 'https://unity3d.com/unity/beta/unity%<version>s'
|
117
122
|
# URL for latest releases listing (since Unity 2017.1.5f1), takes into parameter os (windows => win32, mac => darwin)
|
118
|
-
UNITY_LATEST_JSON_URL = 'https://public-cdn.cloud.unity3d.com/hub/prod/releases-%<os>s.json'
|
123
|
+
UNITY_LATEST_JSON_URL = 'https://public-cdn.cloud.unity3d.com/hub/prod/releases-%<os>s.json'
|
119
124
|
|
120
125
|
#####################################################
|
121
126
|
# @!group REGEX: expressions to interpret data
|
122
127
|
#####################################################
|
123
128
|
# Captures a version and its base url
|
124
|
-
LINUX_DOWNLOAD = %r{['"](https
|
129
|
+
LINUX_DOWNLOAD = %r{['"](https?://[\w/.-]+/[0-9a-f+]{12,13}/)(./)?UnitySetup-(\d+\.\d+\.\d+\w\d+)['"]}.freeze
|
125
130
|
|
126
|
-
MAC_WIN_SHADERS = %r{"(https?://[\w
|
127
|
-
LINUX_INSTALLER = %r{(https?://[\w
|
131
|
+
MAC_WIN_SHADERS = %r{"(https?://[\w/.-]+/[0-9a-f+]{12,13}/)builtin_shaders-(\d+\.\d+\.\d+\w\d+)\.?\w+"}.freeze
|
132
|
+
LINUX_INSTALLER = %r{(https?://[\w/.-]+/[0-9a-f+]{12,13}/)LinuxEditorInstaller/Unity.tar.xz}.freeze
|
128
133
|
|
129
|
-
LINUX_DOWNLOAD_DATED = %r{"(https?://[\w
|
130
|
-
LINUX_DOWNLOAD_RECENT_PAGE = %r{"(https?://beta\.unity3d\.com/download/[a-zA-Z0-9
|
131
|
-
LINUX_DOWNLOAD_RECENT_FILE = %r{'(https?://beta\.unity3d\.com/download/[a-zA-Z0-9
|
134
|
+
LINUX_DOWNLOAD_DATED = %r{"(https?://[\w/._-]+/unity-editor-installer-(\d+\.\d+\.\d+\w\d+).*\.sh)"}.freeze
|
135
|
+
LINUX_DOWNLOAD_RECENT_PAGE = %r{"(https?://beta\.unity3d\.com/download/[a-zA-Z0-9/.+]+/public_download\.html)"}.freeze
|
136
|
+
LINUX_DOWNLOAD_RECENT_FILE = %r{'(https?://beta\.unity3d\.com/download/[a-zA-Z0-9/.+]+/unity-editor-installer-(\d+\.\d+\.\d+(?:x)?\w\d+).*\.sh)'}.freeze
|
132
137
|
# Captures a beta version in html page
|
133
|
-
UNITY_BETAVERSION_REGEX = %r{
|
134
|
-
UNITY_EXTRA_DOWNLOAD_REGEX = %r{"(https
|
138
|
+
UNITY_BETAVERSION_REGEX = %r{/unity/beta/unity(\d+\.\d+\.\d+\w\d+)"}.freeze
|
139
|
+
UNITY_EXTRA_DOWNLOAD_REGEX = %r{"(https?://[\w/.-]+\.unity3d\.com/(\w+))/[a-zA-Z/.-]+/download.html"}.freeze
|
135
140
|
# For the latest releases fetched from json
|
136
|
-
UNITY_LATEST_JSON = %r{(https?://[\w
|
141
|
+
UNITY_LATEST_JSON = %r{(https?://[\w/.-]+/[0-9a-f+]{12,13}/)}.freeze
|
137
142
|
|
138
143
|
class << self
|
139
144
|
def list_available(os: nil)
|
@@ -191,7 +196,7 @@ module U3d
|
|
191
196
|
end
|
192
197
|
|
193
198
|
class LinuxVersions
|
194
|
-
JSON_OS = 'linux'
|
199
|
+
JSON_OS = 'linux'
|
195
200
|
|
196
201
|
@unity_forums = U3d::UnityForums.new
|
197
202
|
class << self
|
@@ -300,7 +305,7 @@ module U3d
|
|
300
305
|
end
|
301
306
|
|
302
307
|
class MacVersions
|
303
|
-
JSON_OS = 'darwin'
|
308
|
+
JSON_OS = 'darwin'
|
304
309
|
|
305
310
|
class << self
|
306
311
|
def list_available
|
@@ -312,7 +317,7 @@ module U3d
|
|
312
317
|
end
|
313
318
|
|
314
319
|
class WindowsVersions
|
315
|
-
JSON_OS = 'win32'
|
320
|
+
JSON_OS = 'win32'
|
316
321
|
|
317
322
|
class << self
|
318
323
|
def list_available
|