lib/u3d/installation.rb in u3d-1.0.7 vs lib/u3d/installation.rb in u3d-1.0.8

- old
+ new

@@ -1,167 +1,170 @@ -## --- BEGIN LICENSE BLOCK --- -# Copyright (c) 2016-present WeWantToKnow AS -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -## --- END LICENSE BLOCK --- - -require 'u3d/utils' - -module U3d - UNITY_DIR_CHECK = /Unity_\d+\.\d+\.\d+[a-z]\d+/ - UNITY_DIR_CHECK_LINUX = /unity-editor-\d+\.\d+\.\d+[a-z]\d+\z/ - - class Installation - def self.create(path: nil) - if Helper.mac? - MacInstallation.new path - elsif Helper.linux? - LinuxInstallation.new path - else - WindowsInstallation.new path - end - end - end - - class MacInstallation < Installation - attr_reader :path - - require 'plist' - - def initialize(path: nil) - @path = path - end - - def version - plist['CFBundleVersion'] - end - - def default_log_file - "#{ENV['HOME']}/Library/Logs/Unity/Editor.log" - end - - def exe_path - "#{path}/Contents/MacOS/Unity" - end - - def packages - if Utils.parse_unity_version(version)[0].to_i <= 4 - # Unity < 5 doesn't have packages - return [] - end - fpath = File.expand_path('../PlaybackEngines', path) - return [] unless Dir.exist? fpath # install without package - Dir.entries(fpath).select { |e| File.directory?(File.join(fpath, e)) && !(e == '.' || e == '..') } - end - - def clean_install? - path =~ UNITY_DIR_CHECK - end - - private - - def plist - @plist ||= Plist.parse_xml("#{@path}/Contents/Info.plist") - end - end - - class LinuxInstallation < Installation - attr_reader :path - - def initialize(path: nil) - @path = path - end - - def version - # I don't find an easy way to extract the version on Linux - require 'rexml/document' - fpath = "#{path}/Editor/Data/PlaybackEngines/LinuxStandaloneSupport/ivy.xml" - raise "Couldn't find file #{fpath}" unless File.exist? fpath - doc = REXML::Document.new(File.read(fpath)) - version = REXML::XPath.first(doc, 'ivy-module/info/@e:unityVersion').value - if (m = version.match(/^(.*)x(.*)Linux$/)) - version = "#{m[1]}#{m[2]}" - end - version - end - - def default_log_file - "#{ENV['HOME']}/.config/unity3d/Editor.log" - end - - def exe_path - "#{path}/Editor/Unity" - end - - def packages - false - end - - def clean_install? - path =~ UNITY_DIR_CHECK_LINUX - end - end - - class WindowsInstallation < Installation - attr_reader :path - - def initialize(path: nil) - @path = path - end - - def version - require 'rexml/document' - fpath = "#{path}/Editor/Data/PlaybackEngines/windowsstandalonesupport/ivy.xml" - raise "Couldn't find file #{fpath}" unless File.exist? fpath - doc = REXML::Document.new(File.read(fpath)) - version = REXML::XPath.first(doc, 'ivy-module/info/@e:unityVersion').value - - version - end - - def default_log_file - if @logfile.nil? - begin - loc_appdata = Utils.windows_local_appdata - log_dir = File.expand_path('Unity/Editor/', loc_appdata) - UI.important "Log directory (#{log_dir}) does not exist" unless Dir.exist? log_dir - @logfile = File.expand_path('Editor.log', log_dir) - rescue RuntimeError => ex - UI.error "Unable to retrieve the editor logfile: #{ex}" - end - end - @logfile - end - - def exe_path - File.join(@path, 'Editor', 'Unity.exe') - end - - def packages - # Unity prior to Unity5 did not have package - return [] if Utils.parse_unity_version(version)[0].to_i <= 4 - fpath = "#{path}/Editor/Data/PlaybackEngines/" - return [] unless Dir.exist? fpath # install without package - Dir.entries(fpath).select { |e| File.directory?(File.join(fpath, e)) && !(e == '.' || e == '..') } - end - - def clean_install? - path =~ UNITY_DIR_CHECK - end - end -end +## --- BEGIN LICENSE BLOCK --- +# Copyright (c) 2016-present WeWantToKnow AS +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +## --- END LICENSE BLOCK --- + +require 'u3d/utils' + +module U3d + UNITY_DIR_CHECK = /Unity_\d+\.\d+\.\d+[a-z]\d+/ + UNITY_DIR_CHECK_LINUX = /unity-editor-\d+\.\d+\.\d+[a-z]\d+\z/ + + class Installation + def self.create(path: nil) + if Helper.mac? + MacInstallation.new path + elsif Helper.linux? + LinuxInstallation.new path + else + WindowsInstallation.new path + end + end + end + + class MacInstallation < Installation + attr_reader :path + + require 'plist' + + def initialize(path: nil) + @path = path + end + + def version + plist['CFBundleVersion'] + end + + def default_log_file + "#{ENV['HOME']}/Library/Logs/Unity/Editor.log" + end + + def exe_path + "#{path}/Contents/MacOS/Unity" + end + + def packages + if Utils.parse_unity_version(version)[0].to_i <= 4 + # Unity < 5 doesn't have packages + return [] + end + fpath = File.expand_path('../PlaybackEngines', path) + return [] unless Dir.exist? fpath # install without package + Dir.entries(fpath).select { |e| File.directory?(File.join(fpath, e)) && !(e == '.' || e == '..') } + end + + def clean_install? + path =~ UNITY_DIR_CHECK + end + + private + + def plist + @plist ||= Plist.parse_xml("#{@path}/Contents/Info.plist") + end + end + + class LinuxInstallation < Installation + attr_reader :path + + def initialize(path: nil) + @path = path + end + + def version + # I don't find an easy way to extract the version on Linux + require 'rexml/document' + fpath = "#{path}/Editor/Data/PlaybackEngines/LinuxStandaloneSupport/ivy.xml" + raise "Couldn't find file #{fpath}" unless File.exist? fpath + doc = REXML::Document.new(File.read(fpath)) + version = REXML::XPath.first(doc, 'ivy-module/info/@e:unityVersion').value + if (m = version.match(/^(.*)x(.*)Linux$/)) + version = "#{m[1]}#{m[2]}" + end + version + end + + def default_log_file + "#{ENV['HOME']}/.config/unity3d/Editor.log" + end + + def exe_path + "#{path}/Editor/Unity" + end + + def packages + false + end + + def clean_install? + path =~ UNITY_DIR_CHECK_LINUX + end + end + + class WindowsInstallation < Installation + attr_reader :path + + def initialize(path: nil) + @path = path + end + + def version + require 'rexml/document' + # For versions >= 5 + fpath = "#{path}/Editor/Data/PlaybackEngines/windowsstandalonesupport/ivy.xml" + # For versions < 5 + fpath = "#{path}/Editor/Data/PlaybackEngines/wp8support/ivy.xml" unless File.exist? fpath + raise "Couldn't find file #{fpath}" unless File.exist? fpath + doc = REXML::Document.new(File.read(fpath)) + version = REXML::XPath.first(doc, 'ivy-module/info/@e:unityVersion').value + + version + end + + def default_log_file + if @logfile.nil? + begin + loc_appdata = Utils.windows_local_appdata + log_dir = File.expand_path('Unity/Editor/', loc_appdata) + UI.important "Log directory (#{log_dir}) does not exist" unless Dir.exist? log_dir + @logfile = File.expand_path('Editor.log', log_dir) + rescue RuntimeError => ex + UI.error "Unable to retrieve the editor logfile: #{ex}" + end + end + @logfile + end + + def exe_path + File.join(@path, 'Editor', 'Unity.exe') + end + + def packages + # Unity prior to Unity5 did not have package + return [] if Utils.parse_unity_version(version)[0].to_i <= 4 + fpath = "#{path}/Editor/Data/PlaybackEngines/" + return [] unless Dir.exist? fpath # install without package + Dir.entries(fpath).select { |e| File.directory?(File.join(fpath, e)) && !(e == '.' || e == '..') } + end + + def clean_install? + path =~ UNITY_DIR_CHECK + end + end +end