u3d 1.0.15 → 1.0.16
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/.github/ISSUE_TEMPLATE.md +18 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +20 -0
- data/.github_changelog_generator +1 -1
- data/CHANGELOG.md +27 -1
- data/Gemfile.lock +2 -2
- data/config/log_rules.json +44 -7
- data/lib/u3d/cache.rb +1 -0
- data/lib/u3d/commands.rb +2 -6
- data/lib/u3d/downloader.rb +1 -1
- data/lib/u3d/iniparser.rb +29 -11
- data/lib/u3d/installation.rb +26 -0
- data/lib/u3d/installer.rb +24 -7
- data/lib/u3d/unity_version_definition.rb +0 -4
- data/lib/u3d/unity_versions.rb +103 -101
- data/lib/u3d/utils.rb +12 -4
- data/lib/u3d/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f7fc56b235f6627c0f4e44e12dddb35e1f22b9ef
|
|
4
|
+
data.tar.gz: e6dbe1daf2d3ca3e1dcf6956e39541fb0d15fff6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d4ca5e97456b6d6a2769ca8d8cfe57fb3122b88a0a769a965eb5eb2b72bdcf1d7d379fd996b93480e0580e847c7c15af1a2326f80aaddb12258cc0b50d34e453
|
|
7
|
+
data.tar.gz: d58536ae973dfbd0261f97671472c8ae425277c9d5e61c5a7e022e8ef8c444573bd1f53eb0e485d011458b3d2ed81d23900a72d94f3e4ee6d22ef8a160236f96
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Thank you for helping u3d to get better!
|
|
3
|
+
Before you post your issue, please make sure that you checked the boxes! (put an x in the [ ] without spaces)
|
|
4
|
+
If possible, try to indicate what type of issue you are facing with the tags!
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
### Issue Checklist
|
|
8
|
+
|
|
9
|
+
- [ ] I'm using the latest u3d version
|
|
10
|
+
- [ ] I ran `u3d --help`
|
|
11
|
+
- [ ] I read the [README](https://github.com/DragonBox/u3d/blob/master/README.md)
|
|
12
|
+
- [ ] I made sure that a similar [issue](https://github.com/DragonBox/u3d/issues) doesn't exit
|
|
13
|
+
|
|
14
|
+
### Issue Description
|
|
15
|
+
|
|
16
|
+
<!-- Please describe your issue with as much precision as possible. Write there the command you ran, its output, the behaviour you expect... -->
|
|
17
|
+
|
|
18
|
+
[DESCRIBE YOUR ISSUE HERE]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Thank you for contributing to u3d!
|
|
3
|
+
Before you post your pull request, please make sure that you checked the boxes! (put an x in the [ ] without spaces)
|
|
4
|
+
If possible, try to name your pull request by prefixing it with <SUBJECT>. For instance, if you're modifying the downloading, you could prefix it with u3d/download:
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
### Pull Request Checklist
|
|
8
|
+
|
|
9
|
+
- [ ] My pull request has been rebased on master
|
|
10
|
+
- [ ] I ran `bundle exec rspec` to make sure that my PR didn't break any test
|
|
11
|
+
- [ ] I ran `bundle exec rubocop` to make sure that my PR is inline with our code style
|
|
12
|
+
- [ ] I have read the [code of conduct](https://github.com/DragonBox/u3d/blob/master/CODE_OF_CONDUCT.md)
|
|
13
|
+
|
|
14
|
+
### Pull Request Description
|
|
15
|
+
|
|
16
|
+
<!-- If this pull request is related to a specific issue, please specify here "Fixes #ISSUE_NO" -->
|
|
17
|
+
<!-- Please describe your pull request with as much precision as possible. Write here why you think this change is required, what problem it solves, how it solves it... -->
|
|
18
|
+
<!-- Please describe to what extent you tested your modifications -->
|
|
19
|
+
|
|
20
|
+
[DESCRIBE YOUR PULL REQUEST HERE]
|
data/.github_changelog_generator
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,35 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## [v1.0.16](https://github.com/DragonBox/u3d/tree/v1.0.16) (2018-02-04)
|
|
4
|
+
[Full Changelog](https://github.com/DragonBox/u3d/compare/v1.0.15...v1.0.16)
|
|
5
|
+
|
|
6
|
+
**Implemented enhancements:**
|
|
7
|
+
|
|
8
|
+
- support install of .xz files [\#251](https://github.com/DragonBox/u3d/issues/251)
|
|
9
|
+
- Linux ini partial support exists now [\#244](https://github.com/DragonBox/u3d/issues/244)
|
|
10
|
+
|
|
11
|
+
**Fixed bugs:**
|
|
12
|
+
|
|
13
|
+
- u3d/install & u3d/available no INI file error on Linux [\#242](https://github.com/DragonBox/u3d/issues/242)
|
|
14
|
+
- u3d/prettify: Fix rule termination when there are special characters in the file name [\#246](https://github.com/DragonBox/u3d/pull/246) ([niezbop](https://github.com/niezbop))
|
|
15
|
+
|
|
16
|
+
**Closed issues:**
|
|
17
|
+
|
|
18
|
+
- u3d/available missing latest versions on Linux [\#241](https://github.com/DragonBox/u3d/issues/241)
|
|
19
|
+
- u3d/install fails to install Linux dependencies inside docker [\#240](https://github.com/DragonBox/u3d/issues/240)
|
|
20
|
+
|
|
21
|
+
**Merged pull requests:**
|
|
22
|
+
|
|
23
|
+
- u3d/install linux xz format \(fixes \#251\) [\#252](https://github.com/DragonBox/u3d/pull/252) ([lacostej](https://github.com/lacostej))
|
|
24
|
+
- u3d/available: support broken parts of Linux INI \(\#244\) [\#248](https://github.com/DragonBox/u3d/pull/248) ([lacostej](https://github.com/lacostej))
|
|
25
|
+
- u3d/available: fix forums parsing and move ini faking/downloading at available time, to support package based Linux versions [\#247](https://github.com/DragonBox/u3d/pull/247) ([lacostej](https://github.com/lacostej))
|
|
26
|
+
- u3d/prettify: Parse Android command invocation failure [\#245](https://github.com/DragonBox/u3d/pull/245) ([niezbop](https://github.com/niezbop))
|
|
27
|
+
- Support linux forums pagination [\#243](https://github.com/DragonBox/u3d/pull/243) ([lacostej](https://github.com/lacostej))
|
|
28
|
+
|
|
3
29
|
## [v1.0.15](https://github.com/DragonBox/u3d/tree/v1.0.15) (2018-01-16)
|
|
4
30
|
[Full Changelog](https://github.com/DragonBox/u3d/compare/v1.0.14...v1.0.15)
|
|
5
31
|
|
|
6
|
-
**
|
|
32
|
+
**Fixed bugs:**
|
|
7
33
|
|
|
8
34
|
- u3d/install: download beta for mac also needs to discard checking md5s on Windows packages [\#234](https://github.com/DragonBox/u3d/pull/234) ([lacostej](https://github.com/lacostej))
|
|
9
35
|
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
u3d (1.0.
|
|
4
|
+
u3d (1.0.16)
|
|
5
5
|
colored (>= 1.2, < 2.0.0)
|
|
6
6
|
commander (>= 4.4.0, < 5.0.0)
|
|
7
7
|
file-tail (>= 1.2.0)
|
|
@@ -24,7 +24,7 @@ GEM
|
|
|
24
24
|
builder (3.2.3)
|
|
25
25
|
coderay (1.1.1)
|
|
26
26
|
colored (1.2)
|
|
27
|
-
commander (4.4.
|
|
27
|
+
commander (4.4.4)
|
|
28
28
|
highline (~> 1.7.2)
|
|
29
29
|
concurrent-ruby (1.0.5)
|
|
30
30
|
coveralls (0.8.21)
|
data/config/log_rules.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"fail": {
|
|
12
12
|
"active": true,
|
|
13
13
|
"start_pattern": "^(?<fail>Failed to .+)\\n",
|
|
14
|
-
"end_pattern": "Filename: (
|
|
14
|
+
"end_pattern": "Filename: (?:.+/(?<file>\\w+\\.\\w+))? Line: (?<line>-?\\d+)",
|
|
15
15
|
"start_message": false,
|
|
16
16
|
"end_message": "%{file}(line %{line}): %{fail}",
|
|
17
17
|
"store_lines": false,
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"exception_report": {
|
|
40
40
|
"active": true,
|
|
41
41
|
"start_pattern": "^(?<message>.*threw exception\\.)\\n",
|
|
42
|
-
"end_pattern": "Filename: (
|
|
42
|
+
"end_pattern": "Filename: (?:.+/(?<file>\\w+\\.\\w+))? Line: (?<line>-?\\d+)",
|
|
43
43
|
"start_message": false,
|
|
44
44
|
"end_message": "%{file}(line %{line}): %{message}",
|
|
45
45
|
"store_lines": false,
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"fetched_line_pattern": "(?<message>.*)\\n",
|
|
75
75
|
"fetched_line_message": false,
|
|
76
76
|
"start_message": false,
|
|
77
|
-
"end_pattern": "Filename: (
|
|
77
|
+
"end_pattern": "Filename: (?:.+/(?<file>\\w+\\.\\w+))? Line: (?<line>-?\\d+)",
|
|
78
78
|
"end_message": "[LOG] %{file}(line %{line}): %{message}",
|
|
79
79
|
"type": "warning"
|
|
80
80
|
},
|
|
@@ -83,12 +83,13 @@
|
|
|
83
83
|
"start_pattern": "UnityEngine\\.Debug:LogWarning\\(Object\\)",
|
|
84
84
|
"fetch_first_line_not_matching": [
|
|
85
85
|
"UnityEngine\\.",
|
|
86
|
-
"^\\n"
|
|
86
|
+
"^\\n",
|
|
87
|
+
"^\\s+"
|
|
87
88
|
],
|
|
88
89
|
"fetched_line_pattern": "(?<message>.*)\\n",
|
|
89
90
|
"fetched_line_message": false,
|
|
90
91
|
"start_message": false,
|
|
91
|
-
"end_pattern": "Filename: (
|
|
92
|
+
"end_pattern": "Filename: (?:.+/(?<file>\\w+\\.\\w+))? Line: (?<line>-?\\d+)",
|
|
92
93
|
"end_message": "[LOG] %{file}(line %{line}): %{message}",
|
|
93
94
|
"type": "warning"
|
|
94
95
|
},
|
|
@@ -104,7 +105,7 @@
|
|
|
104
105
|
"fetched_line_pattern": "(?<message>.*)\\n",
|
|
105
106
|
"fetched_line_message": false,
|
|
106
107
|
"start_message": false,
|
|
107
|
-
"end_pattern": "Filename: (
|
|
108
|
+
"end_pattern": "Filename: (?:.+/(?<file>\\w+\\.\\w+))? Line: (?<line>-?\\d+)",
|
|
108
109
|
"end_message": "[LOG] %{file}(line %{line}): %{message}",
|
|
109
110
|
"type": "error"
|
|
110
111
|
},
|
|
@@ -120,7 +121,7 @@
|
|
|
120
121
|
"fetched_line_pattern": "(?<message>.*)\\n",
|
|
121
122
|
"fetched_line_message": false,
|
|
122
123
|
"start_message": false,
|
|
123
|
-
"end_pattern": "Filename: (
|
|
124
|
+
"end_pattern": "Filename: (?:.+/(?<file>\\w+\\.\\w+))? Line: (?<line>-?\\d+)",
|
|
124
125
|
"end_message": "[LOG] %{file}(line %{line}): %{message}",
|
|
125
126
|
"type": "error"
|
|
126
127
|
},
|
|
@@ -307,6 +308,42 @@
|
|
|
307
308
|
"start_pattern": "Textures\\s+\\d+\\.?\\d* .b\\s+\\d{1,3}\\.?\\d*%",
|
|
308
309
|
"end_pattern": "Complete size\\s+\\d+\\.?\\d* .b\\s+\\d{1,3}\\.?\\d*%",
|
|
309
310
|
"store_lines": true
|
|
311
|
+
},
|
|
312
|
+
"command_invocation_failure": {
|
|
313
|
+
"active": true,
|
|
314
|
+
"start_pattern": "CommandInvokationFailure: (?<message>.+\\.)",
|
|
315
|
+
"store_lines": true,
|
|
316
|
+
"end_pattern": "^\\n",
|
|
317
|
+
"start_message": "[ANDROID] Command invocation failure: %{message}",
|
|
318
|
+
"end_message": false,
|
|
319
|
+
"type": "error"
|
|
320
|
+
},
|
|
321
|
+
"command_invocation_failure_stderr": {
|
|
322
|
+
"active": true,
|
|
323
|
+
"start_pattern": "stderr\\[",
|
|
324
|
+
"store_lines": true,
|
|
325
|
+
"ignore_lines": ["^\\n"],
|
|
326
|
+
"end_pattern": "\\]\\n",
|
|
327
|
+
"start_message": "[ANDROID] Errors:",
|
|
328
|
+
"end_message": false,
|
|
329
|
+
"type": "error"
|
|
330
|
+
},
|
|
331
|
+
"command_invocation_failure_stdout": {
|
|
332
|
+
"active": true,
|
|
333
|
+
"start_pattern": "stdout\\[",
|
|
334
|
+
"store_lines": true,
|
|
335
|
+
"ignore_lines": ["^\\n"],
|
|
336
|
+
"end_pattern": "\\]\\n",
|
|
337
|
+
"start_message": "[ANDROID] Warnings:",
|
|
338
|
+
"end_message": false,
|
|
339
|
+
"type": "warning"
|
|
340
|
+
},
|
|
341
|
+
"command_invocation_failure_stack": {
|
|
342
|
+
"active": true,
|
|
343
|
+
"start_pattern": "[Ee]xit code: (?<code>\\d+)",
|
|
344
|
+
"end_pattern": "Filename: (?:.+/(?<file>\\w+\\.\\w+))? Line: (?<line>-?\\d+)",
|
|
345
|
+
"start_message": false,
|
|
346
|
+
"end_message": "[ANDROID] %{file}(line %{line}) Exit code %{code}"
|
|
310
347
|
}
|
|
311
348
|
}
|
|
312
349
|
}
|
data/lib/u3d/cache.rb
CHANGED
data/lib/u3d/commands.rb
CHANGED
|
@@ -106,7 +106,7 @@ module U3d
|
|
|
106
106
|
UI.user_error!("You cannot use the --operating_system and the --install options together") if options[:install] && options[:operating_system]
|
|
107
107
|
os = valid_os_or_current(options[:operating_system])
|
|
108
108
|
|
|
109
|
-
packages = packages_with_unity_first(
|
|
109
|
+
packages = packages_with_unity_first(options)
|
|
110
110
|
|
|
111
111
|
cache_versions = cache_versions(os, offline: !options[:download])
|
|
112
112
|
version = interpret_latest(version, cache_versions)
|
|
@@ -286,11 +286,7 @@ module U3d
|
|
|
286
286
|
iversion
|
|
287
287
|
end
|
|
288
288
|
|
|
289
|
-
def packages_with_unity_first(
|
|
290
|
-
if os == :linux
|
|
291
|
-
UI.important 'Option -a | --all currently meaningless for Linux (only one package available)' if options[:all]
|
|
292
|
-
UI.important 'Option -p | --packages currently meaningless for Linux (only one package available)' if options[:packages]
|
|
293
|
-
end
|
|
289
|
+
def packages_with_unity_first(options)
|
|
294
290
|
temp = options[:packages] || ['Unity']
|
|
295
291
|
temp.insert(0, 'Unity') if temp.delete('Unity')
|
|
296
292
|
temp
|
data/lib/u3d/downloader.rb
CHANGED
|
@@ -31,7 +31,7 @@ module U3d
|
|
|
31
31
|
# Path to the directory for the package downloading
|
|
32
32
|
DOWNLOAD_PATH = "#{ENV['HOME']}/Downloads".freeze
|
|
33
33
|
# Regex to get the name of a package out of its file name
|
|
34
|
-
UNITY_MODULE_FILE_REGEX = %r{\/([\w\-_\.\+]+\.(?:pkg|exe|zip|sh|deb|msi))[^\/]*$}
|
|
34
|
+
UNITY_MODULE_FILE_REGEX = %r{\/([\w\-_\.\+]+\.(?:pkg|exe|zip|sh|deb|msi|xz))[^\/]*$}
|
|
35
35
|
|
|
36
36
|
class << self
|
|
37
37
|
def download_directory
|
data/lib/u3d/iniparser.rb
CHANGED
|
@@ -46,21 +46,12 @@ module U3d
|
|
|
46
46
|
Utils.ensure_dir(default_ini_path)
|
|
47
47
|
ini_path = File.expand_path(ini_name, default_ini_path)
|
|
48
48
|
unless File.file?(ini_path)
|
|
49
|
-
if os == 'linux'
|
|
50
|
-
UI.error "No INI file for version #{version}. Try discovering the available versions with 'u3d available -f'" unless offline
|
|
51
|
-
return nil
|
|
52
|
-
end
|
|
53
49
|
raise "INI file does not exist at #{ini_path}" if offline
|
|
54
|
-
|
|
55
|
-
File.open(ini_path, 'wb') do |f|
|
|
56
|
-
data = Net::HTTP.get(uri)
|
|
57
|
-
data.tr!("\"", '')
|
|
58
|
-
data.gsub!(/Note:.+\n/, '')
|
|
59
|
-
f.write(data)
|
|
60
|
-
end
|
|
50
|
+
download_ini(version, cached_versions, os, ini_name, ini_path)
|
|
61
51
|
end
|
|
62
52
|
begin
|
|
63
53
|
result = IniFile.load(ini_path).to_h
|
|
54
|
+
result = filter_broken_linux(result) if os == 'linux'
|
|
64
55
|
rescue StandardError => e
|
|
65
56
|
raise "Could not parse INI data (#{e})"
|
|
66
57
|
end
|
|
@@ -87,6 +78,33 @@ url=#{url}
|
|
|
87
78
|
|
|
88
79
|
private
|
|
89
80
|
|
|
81
|
+
def download_ini(version, cached_versions, os, ini_name, ini_path)
|
|
82
|
+
# former urls for Linux pointed to unity-editor-installer.sh directlry
|
|
83
|
+
if os == 'linux' && cached_versions[version] =~ /.*.sh$/
|
|
84
|
+
UI.verbose "No INI on server. Faking one by finding out package size for version #{version}"
|
|
85
|
+
url = cached_versions[version]
|
|
86
|
+
size = Utils.get_url_content_length(url)
|
|
87
|
+
if size
|
|
88
|
+
create_linux_ini(version, size, url)
|
|
89
|
+
else
|
|
90
|
+
UI.important "u3d tried to get the size of the installer for version #{version}, but wasn't able to"
|
|
91
|
+
end
|
|
92
|
+
return
|
|
93
|
+
end
|
|
94
|
+
uri = URI(cached_versions[version] + ini_name)
|
|
95
|
+
UI.verbose("Searching for ini file at #{uri}")
|
|
96
|
+
File.open(ini_path, 'wb') do |f|
|
|
97
|
+
data = Net::HTTP.get(uri)
|
|
98
|
+
data.tr!("\"", '')
|
|
99
|
+
data.gsub!(/Note:.+\n/, '')
|
|
100
|
+
f.write(data)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def filter_broken_linux(ini_hash)
|
|
105
|
+
ini_hash.select { |_k, v| v['url'] && !v['url'].end_with?('.pkg') }
|
|
106
|
+
end
|
|
107
|
+
|
|
90
108
|
def default_ini_path
|
|
91
109
|
case U3dCore::Helper.operating_system
|
|
92
110
|
when :linux
|
data/lib/u3d/installation.rb
CHANGED
|
@@ -189,6 +189,32 @@ module U3d
|
|
|
189
189
|
@root_path || @path
|
|
190
190
|
end
|
|
191
191
|
|
|
192
|
+
def packages
|
|
193
|
+
path = "#{root_path}/Editor/Data/"
|
|
194
|
+
pack = []
|
|
195
|
+
PlaybackEngineUtils.list_module_configs(path).each do |mpath|
|
|
196
|
+
pack << PlaybackEngineUtils.module_name(mpath)
|
|
197
|
+
end
|
|
198
|
+
NOT_PLAYBACKENGINE_PACKAGES.each do |module_name|
|
|
199
|
+
pack << module_name unless Dir[module_name_pattern(module_name)].empty?
|
|
200
|
+
end
|
|
201
|
+
pack
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def module_name_pattern(module_name)
|
|
205
|
+
# FIXME: we are not yet sure where these modules will end up yet
|
|
206
|
+
case module_name
|
|
207
|
+
when 'Documentation'
|
|
208
|
+
return "#{root_path}/Editor/Data/Documentation/"
|
|
209
|
+
when 'StandardAssets'
|
|
210
|
+
return "#{root_path}/Editor/Standard Assets/"
|
|
211
|
+
when 'MonoDevelop'
|
|
212
|
+
return "#{root_path}/MonoDevelop/"
|
|
213
|
+
else
|
|
214
|
+
UI.crash! "No pattern is known for #{module_name} on Linux"
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
192
218
|
def clean_install?
|
|
193
219
|
!(root_path =~ UNITY_DIR_CHECK_LINUX).nil?
|
|
194
220
|
end
|
data/lib/u3d/installer.rb
CHANGED
|
@@ -212,12 +212,17 @@ module U3d
|
|
|
212
212
|
def install(file_path, version, installation_path: nil, info: {})
|
|
213
213
|
# rubocop:enable UnusedMethodArgument
|
|
214
214
|
extension = File.extname(file_path)
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
installation_path: path
|
|
220
|
-
|
|
215
|
+
|
|
216
|
+
raise "Installation of #{extension} files is not supported on Linux" unless ['.sh', '.xz'].include? extension
|
|
217
|
+
if extension == '.sh'
|
|
218
|
+
path = installation_path || DEFAULT_LINUX_INSTALL
|
|
219
|
+
install_sh(file_path, installation_path: path)
|
|
220
|
+
elsif extension == '.xz'
|
|
221
|
+
new_path = File.join(DEFAULT_LINUX_INSTALL, format(UNITY_DIR_LINUX, version: version))
|
|
222
|
+
path = installation_path || new_path
|
|
223
|
+
install_xz(file_path, installation_path: path)
|
|
224
|
+
end
|
|
225
|
+
|
|
221
226
|
# Forces sanitation for installation of 'weird' versions eg 5.6.1xf1Linux
|
|
222
227
|
unity = installed.select { |u| u.version == version }.first
|
|
223
228
|
if unity
|
|
@@ -240,7 +245,19 @@ module U3d
|
|
|
240
245
|
U3dCore::CommandExecutor.execute(command: cmd, admin: true)
|
|
241
246
|
end
|
|
242
247
|
rescue StandardError => e
|
|
243
|
-
UI.error "Failed to install
|
|
248
|
+
UI.error "Failed to install sh file #{file} at #{installation_path}: #{e}"
|
|
249
|
+
else
|
|
250
|
+
UI.success 'Installation successful'
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def install_xz(file, installation_path: nil)
|
|
254
|
+
raise 'Missing installation_path' unless installation_path
|
|
255
|
+
|
|
256
|
+
command = "cd #{installation_path.shellescape}; tar xf #{file.shellescape}"
|
|
257
|
+
command = "mkdir -p #{installation_path.shellescape}; #{command}" unless File.directory? installation_path
|
|
258
|
+
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
|
259
|
+
rescue StandardError => e
|
|
260
|
+
UI.error "Failed to install xz file #{file} at #{installation_path}: #{e}"
|
|
244
261
|
else
|
|
245
262
|
UI.success 'Installation successful'
|
|
246
263
|
end
|
|
@@ -58,9 +58,5 @@ module U3d
|
|
|
58
58
|
return -1 unless @ini[package] && @ini[package]['size']
|
|
59
59
|
@os == :win ? @ini[package]['size'] * 1024 : @ini[package]['size']
|
|
60
60
|
end
|
|
61
|
-
|
|
62
|
-
def self.create_fake(version, size, url)
|
|
63
|
-
INIparser.create_linux_ini(version, size, url)
|
|
64
|
-
end
|
|
65
61
|
end
|
|
66
62
|
end
|
data/lib/u3d/unity_versions.rb
CHANGED
|
@@ -25,6 +25,78 @@ require 'u3d_core/helper'
|
|
|
25
25
|
require 'net/http'
|
|
26
26
|
|
|
27
27
|
module U3d
|
|
28
|
+
class UnityForums
|
|
29
|
+
def pagination_urls(url)
|
|
30
|
+
# hardcoded for now
|
|
31
|
+
# otherwise maybe
|
|
32
|
+
# # <div class="PageNav" data-page="7" data-range="2" data-start="5" data-end="9" data-last="10" data-sentinel="{{sentinel}}" data-baseurl="threads/twitter.12003/page-{{sentinel}}"
|
|
33
|
+
# <span class="pageNavHeader">Page 7 of 10</span>
|
|
34
|
+
[url,
|
|
35
|
+
"#{url}page-2"]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def page_content(url)
|
|
39
|
+
fetch_cookie
|
|
40
|
+
request_headers = { 'Connection' => 'keep-alive', 'Cookie' => @cookie }
|
|
41
|
+
UI.verbose "Fetching from #{url}"
|
|
42
|
+
Utils.page_content(url, request_headers: request_headers)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def fetch_cookie
|
|
48
|
+
UI.verbose "FetchCookie? #{@cookie}"
|
|
49
|
+
return @cookie if @cookie
|
|
50
|
+
cookie_str = ''
|
|
51
|
+
url = 'https://forum.unity.com/forums/linux-editor.93/' # a page that triggers cookies
|
|
52
|
+
uri = URI(url)
|
|
53
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
|
|
54
|
+
request = Net::HTTP::Get.new uri
|
|
55
|
+
request['Connection'] = 'keep-alive'
|
|
56
|
+
response = http.request request
|
|
57
|
+
|
|
58
|
+
case response
|
|
59
|
+
when Net::HTTPSuccess then
|
|
60
|
+
UI.verbose "unexpected result"
|
|
61
|
+
when Net::HTTPRedirection then
|
|
62
|
+
# A session must be opened with the server before accessing forum
|
|
63
|
+
res = nil
|
|
64
|
+
cookie_str = ''
|
|
65
|
+
# Store the name and value of the cookies returned by the server
|
|
66
|
+
response['set-cookie'].gsub(/\s+/, '').split(',').each do |c|
|
|
67
|
+
cookie_str << c.split(';', 2)[0] + '; '
|
|
68
|
+
end
|
|
69
|
+
cookie_str.chomp!('; ')
|
|
70
|
+
|
|
71
|
+
# It should be the Unity register API
|
|
72
|
+
uri = URI(response['location'])
|
|
73
|
+
UI.verbose "Redirecting to #{uri}"
|
|
74
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http_api|
|
|
75
|
+
request = Net::HTTP::Get.new uri
|
|
76
|
+
request['Connection'] = 'keep-alive'
|
|
77
|
+
res = http_api.request request
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
raise 'Unexpected result' unless res.is_a? Net::HTTPRedirection
|
|
81
|
+
# It should be a redirection to the forum to perform authentication
|
|
82
|
+
uri = URI(res['location'])
|
|
83
|
+
UI.verbose "Redirecting to #{uri}"
|
|
84
|
+
request = Net::HTTP::Get.new uri
|
|
85
|
+
request['Connection'] = 'keep-alive'
|
|
86
|
+
request['Cookie'] = cookie_str
|
|
87
|
+
|
|
88
|
+
res = http.request request
|
|
89
|
+
|
|
90
|
+
raise 'Unable to establish a session with Unity forum' unless res.is_a? Net::HTTPRedirection
|
|
91
|
+
|
|
92
|
+
UI.verbose "Found cookie_str #{cookie_str}"
|
|
93
|
+
cookie_str << '; ' + res['set-cookie'].gsub(/\s+/, '').split(';', 2)[0]
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
UI.verbose "Found @cookie #{cookie_str}"
|
|
97
|
+
@cookie = cookie_str
|
|
98
|
+
end
|
|
99
|
+
end
|
|
28
100
|
# Takes care of fectching versions and version list
|
|
29
101
|
module UnityVersions
|
|
30
102
|
#####################################################
|
|
@@ -45,6 +117,7 @@ module U3d
|
|
|
45
117
|
# @!group REGEX: expressions to interpret data
|
|
46
118
|
#####################################################
|
|
47
119
|
# Captures a version and its base url
|
|
120
|
+
LINUX_DOWNLOAD = %r{'(https?://[\w/\.-]+/[0-9a-f]{12}/)(./)?UnitySetup-(\d+\.\d+\.\d+\w\d+)'}
|
|
48
121
|
MAC_DOWNLOAD = %r{"(https?://[\w/\.-]+/[0-9a-f]{12}/)MacEditorInstaller/[a-zA-Z0-9/\.]+-(\d+\.\d+\.\d+\w\d+)\.?\w+"}
|
|
49
122
|
WIN_DOWNLOAD = %r{"(https?://[\w/\.-]+/[0-9a-f]{12}/)Windows..EditorInstaller/[a-zA-Z0-9/\.]+-(\d+\.\d+\.\d+\w\d+)\.?\w+"}
|
|
50
123
|
LINUX_DOWNLOAD_DATED = %r{"(https?://[\w/\._-]+/unity\-editor\-installer\-(\d+\.\d+\.\d+\w\d+).*\.sh)"}
|
|
@@ -94,127 +167,56 @@ module U3d
|
|
|
94
167
|
end
|
|
95
168
|
|
|
96
169
|
class LinuxVersions
|
|
170
|
+
@unity_forums = U3d::UnityForums.new
|
|
97
171
|
class << self
|
|
172
|
+
attr_accessor :unity_forums
|
|
173
|
+
|
|
98
174
|
def list_available
|
|
99
175
|
UI.message 'Loading Unity releases'
|
|
176
|
+
versions = @unity_forums.pagination_urls(UNITY_LINUX_DOWNLOADS).map do |page_url|
|
|
177
|
+
list_available_from_page(@unity_forums, unity_forums.page_content(page_url))
|
|
178
|
+
end.reduce({}, :merge)
|
|
179
|
+
if versions.count.zero?
|
|
180
|
+
UI.important 'Found no releases'
|
|
181
|
+
else
|
|
182
|
+
UI.success "Found #{versions.count} releases."
|
|
183
|
+
end
|
|
184
|
+
versions
|
|
185
|
+
end
|
|
100
186
|
|
|
101
|
-
|
|
187
|
+
private
|
|
102
188
|
|
|
189
|
+
def list_available_from_page(unity_forums, data)
|
|
103
190
|
versions = {}
|
|
104
191
|
results = data.scan(LINUX_DOWNLOAD_DATED)
|
|
105
192
|
results.each do |capt|
|
|
106
|
-
save_package_size(capt[1], capt[0])
|
|
107
193
|
versions[capt[1]] = capt[0]
|
|
108
194
|
end
|
|
109
195
|
|
|
110
|
-
response = nil
|
|
111
196
|
results = data.scan(LINUX_DOWNLOAD_RECENT_PAGE)
|
|
112
197
|
results.each do |page|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
198
|
+
url = page[0]
|
|
199
|
+
page_body = unity_forums.page_content(url)
|
|
200
|
+
capt = page_body.match(LINUX_DOWNLOAD_RECENT_FILE)
|
|
201
|
+
if capt && capt[1] && capt[2]
|
|
202
|
+
ver = capt[2].delete('x')
|
|
203
|
+
UI.important "Version #{ver} does not match standard Unity versions" unless ver =~ Utils::UNITY_VERSION_REGEX
|
|
204
|
+
versions[ver] = capt[1]
|
|
205
|
+
else
|
|
206
|
+
capt = page_body.match(LINUX_DOWNLOAD)
|
|
207
|
+
# newer version of unity on linux support ini files
|
|
208
|
+
# http://beta.unity3d.com/download/3c89f8d277f5/unity-2017.3.0f1-linux.ini
|
|
209
|
+
if capt && capt[1] && capt[3]
|
|
210
|
+
ver = capt[3]
|
|
211
|
+
UI.verbose("Linux version #{ver}. Could not retrieve a fitting file from #{url}. Assuming ini file present")
|
|
120
212
|
versions[ver] = capt[1]
|
|
121
213
|
else
|
|
122
|
-
UI.
|
|
214
|
+
UI.important("Could not retrieve a fitting file from #{url}.")
|
|
123
215
|
end
|
|
124
|
-
else
|
|
125
|
-
UI.error("Could not access #{url}")
|
|
126
216
|
end
|
|
127
217
|
end
|
|
128
|
-
if versions.count.zero?
|
|
129
|
-
UI.important 'Found no releases'
|
|
130
|
-
else
|
|
131
|
-
UI.success "Found #{versions.count} releases."
|
|
132
|
-
end
|
|
133
218
|
versions
|
|
134
219
|
end
|
|
135
|
-
|
|
136
|
-
def save_package_size(version, url)
|
|
137
|
-
uvd = UnityVersionDefinition.new(version, :linux, nil, offline: true)
|
|
138
|
-
if (size = uvd.size_in_bytes('Unity'))
|
|
139
|
-
UI.verbose "Package size for version #{version} already cached: #{size}"
|
|
140
|
-
return
|
|
141
|
-
end
|
|
142
|
-
UI.verbose "Finding out package size for version #{version}"
|
|
143
|
-
size = Utils.get_url_content_length(url)
|
|
144
|
-
if size
|
|
145
|
-
UnityVersionDefinition.create_fake(version, size, url)
|
|
146
|
-
else
|
|
147
|
-
UI.important "u3d tried to get the size of the installer for version #{version}, but wasn't able to"
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def linux_forum_page_content
|
|
152
|
-
response = nil
|
|
153
|
-
data = ''
|
|
154
|
-
uri = URI(UNITY_LINUX_DOWNLOADS)
|
|
155
|
-
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
|
|
156
|
-
request = Net::HTTP::Get.new uri
|
|
157
|
-
request['Connection'] = 'keep-alive'
|
|
158
|
-
response = http.request request
|
|
159
|
-
|
|
160
|
-
case response
|
|
161
|
-
when Net::HTTPSuccess then
|
|
162
|
-
# Successfully retrieved forum content
|
|
163
|
-
data = response.body
|
|
164
|
-
when Net::HTTPRedirection then
|
|
165
|
-
# A session must be opened with the server before accessing forum
|
|
166
|
-
res = nil
|
|
167
|
-
cookie_str = ''
|
|
168
|
-
# Store the name and value of the cookies returned by the server
|
|
169
|
-
response['set-cookie'].gsub(/\s+/, '').split(',').each do |c|
|
|
170
|
-
cookie_str << c.split(';', 2)[0] + '; '
|
|
171
|
-
end
|
|
172
|
-
cookie_str.chomp!('; ')
|
|
173
|
-
|
|
174
|
-
# It should be the Unity register API
|
|
175
|
-
uri = URI(response['location'])
|
|
176
|
-
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http_api|
|
|
177
|
-
request = Net::HTTP::Get.new uri
|
|
178
|
-
request['Connection'] = 'keep-alive'
|
|
179
|
-
res = http_api.request request
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
raise 'Unexpected result' unless res.is_a? Net::HTTPRedirection
|
|
183
|
-
# It should be a redirection to the forum to perform authentication
|
|
184
|
-
uri = URI(res['location'])
|
|
185
|
-
|
|
186
|
-
request = Net::HTTP::Get.new uri
|
|
187
|
-
request['Connection'] = 'keep-alive'
|
|
188
|
-
request['Cookie'] = cookie_str
|
|
189
|
-
|
|
190
|
-
res = http.request request
|
|
191
|
-
|
|
192
|
-
raise 'Unable to establish a session with Unity forum' unless res.is_a? Net::HTTPRedirection
|
|
193
|
-
|
|
194
|
-
cookie_str << '; ' + res['set-cookie'].gsub(/\s+/, '').split(';', 2)[0]
|
|
195
|
-
|
|
196
|
-
uri = URI(res['location'])
|
|
197
|
-
|
|
198
|
-
request = Net::HTTP::Get.new uri
|
|
199
|
-
request['Connection'] = 'keep-alive'
|
|
200
|
-
request['Cookie'] = cookie_str
|
|
201
|
-
|
|
202
|
-
res = http.request request
|
|
203
|
-
|
|
204
|
-
data = res.body if res.is_a? Net::HTTPSuccess
|
|
205
|
-
else raise "Request failed with status #{response.code}"
|
|
206
|
-
end
|
|
207
|
-
end
|
|
208
|
-
data
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
def linux_forum_version_page_content(url)
|
|
212
|
-
uri = URI(url)
|
|
213
|
-
Net::HTTP.start(uri.host, uri.port) do |http|
|
|
214
|
-
request = Net::HTTP::Get.new uri
|
|
215
|
-
return http.request request
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
220
|
end
|
|
219
221
|
end
|
|
220
222
|
|
data/lib/u3d/utils.rb
CHANGED
|
@@ -40,13 +40,18 @@ module U3d
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
# FIXME: alias deprecated
|
|
44
|
+
def get_ssl(url, redirect_limit: 10, request_headers: {})
|
|
45
|
+
page_content(url, redirect_limit: redirect_limit, request_headers: request_headers)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def page_content(url, redirect_limit: 10, request_headers: {})
|
|
49
|
+
follow_redirects(url, redirect_limit: redirect_limit, request_headers: request_headers) do |_request, response|
|
|
45
50
|
response.body
|
|
46
51
|
end
|
|
47
52
|
end
|
|
48
53
|
|
|
49
|
-
def follow_redirects(url, redirect_limit: 10, http_method: :get, &block)
|
|
54
|
+
def follow_redirects(url, redirect_limit: 10, http_method: :get, request_headers: {}, &block)
|
|
50
55
|
raise 'Too many redirections' if redirect_limit.zero?
|
|
51
56
|
response = nil
|
|
52
57
|
request = nil
|
|
@@ -55,6 +60,9 @@ module U3d
|
|
|
55
60
|
use_ssl = /^https/.match(url)
|
|
56
61
|
Net::HTTP.start(uri.host, uri.port, use_ssl: use_ssl) do |http|
|
|
57
62
|
request = http_request_class http_method, uri
|
|
63
|
+
request_headers.each do |k, v|
|
|
64
|
+
request[k] = v
|
|
65
|
+
end
|
|
58
66
|
response = http.request request
|
|
59
67
|
end
|
|
60
68
|
rescue OpenSSL::OpenSSLError => ssl_error
|
|
@@ -67,7 +75,7 @@ module U3d
|
|
|
67
75
|
yield(request, response)
|
|
68
76
|
when Net::HTTPRedirection then
|
|
69
77
|
UI.verbose "Redirected to #{response['location']}"
|
|
70
|
-
follow_redirects(response['location'], redirect_limit: redirect_limit - 1, http_method: http_method, &block)
|
|
78
|
+
follow_redirects(response['location'], redirect_limit: redirect_limit - 1, http_method: http_method, request_headers: request_headers, &block)
|
|
71
79
|
else raise "Request failed with status #{response.code}"
|
|
72
80
|
end
|
|
73
81
|
end
|
data/lib/u3d/version.rb
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
## --- END LICENSE BLOCK ---
|
|
22
22
|
|
|
23
23
|
module U3d
|
|
24
|
-
VERSION = '1.0.
|
|
24
|
+
VERSION = '1.0.16'.freeze
|
|
25
25
|
DESCRIPTION = 'Provides numerous tools for installing, managing and running the Unity3D game engine from command line.'.freeze
|
|
26
26
|
UNITY_VERSIONS_NOTE = "Unity3d uses the following version formatting: 0.0.0x0. The \'x\' can takes different values:\n"\
|
|
27
27
|
"\t. 'f' are the main release candidates for Unity3d\n"\
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: u3d
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.16
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jerome Lacoste
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2018-
|
|
12
|
+
date: 2018-02-04 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: colored
|
|
@@ -254,6 +254,8 @@ extensions: []
|
|
|
254
254
|
extra_rdoc_files: []
|
|
255
255
|
files:
|
|
256
256
|
- ".circleci/config.yml"
|
|
257
|
+
- ".github/ISSUE_TEMPLATE.md"
|
|
258
|
+
- ".github/PULL_REQUEST_TEMPLATE.md"
|
|
257
259
|
- ".github_changelog_generator"
|
|
258
260
|
- ".gitignore"
|
|
259
261
|
- ".licenses.json"
|