## --- 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