lib/calabash-android/env.rb in calabash-android-0.4.11 vs lib/calabash-android/env.rb in calabash-android-0.4.12

- old
+ new

@@ -1,23 +1,91 @@ + class Env + require 'win32/registry' if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/ + def self.exit_if_env_not_set_up + exit_unless_jdk_is_available + exit_unless_android_sdk_is_available + end + + def self.exit_unless_android_sdk_is_available + if android_home_path + log "Android SDK found at: #{android_home_path}" + return + end + puts "Could not find an Android SDK please make sure it is installed." + puts "You can read about how Calabash-Android is searching for an Android SDK and how you can help here:" + puts "https://github.com/calabash/calabash-android/blob/master/documentation/installation.md#prerequisites" + exit 1 + end + def self.keytool_path + find_executable_on_path(keytool_executable) || + "\"#{jdk_path}/bin/#{keytool_executable}\"" + end + + def self.exit_unless_jdk_is_available + jdk = jdk_path + if find_executable_on_path(keytool_executable) || jdk + log "JDK found on PATH." if find_executable_on_path(keytool_executable) + log "JDK found at: #{jdk}" if jdk + return + end + puts "Could not find Java Development Kit please make sure it is installed." + puts "You can read about how Calabash-Android is searching for a JDK and how you can help here:" + puts "https://github.com/calabash/calabash-android/blob/master/documentation/installation.md#prerequisites" + exit 1 + end + + def self.jarsigner_path + find_executable_on_path(jarsigner_executable) || + "\"#{jdk_path}/bin/#{jarsigner_executable}\"" + end + + def self.jdk_path + path_if_jdk(ENV['JAVA_HOME']) || if is_windows? - "\"#{ENV["JAVA_HOME"]}/bin/keytool.exe\"" + path_if_jdk(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\JavaSoft\\Java Development Kit\\1.7', 'JavaHome')) || + path_if_jdk(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\JavaSoft\\Java Development Kit\\1.6', 'JavaHome')) else - "keytool" + path_if_android_home(read_attribute_from_monodroid_config('java-sdk', 'path')) end end - def self.jarsigner_path + def self.android_home_path + path_if_android_home(ENV["ANDROID_HOME"]) || if is_windows? - "\"#{ENV["JAVA_HOME"]}/bin/jarsigner.exe\"" + path_if_android_home(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\Android SDK Tools', 'Path')) || + path_if_android_home("C:\\Android\\android-sdk") else - "jarsigner" + path_if_android_home(read_attribute_from_monodroid_config('android-sdk', 'path')) end end + def self.find_executable_on_path(executable) + path = path_elements.each do |x| + f = File.join(x, executable) + return "\"#{f}\"" if File.exists?(f) + end + end + + def self.path_if_jdk(path) + path if path && File.exists?(File.join(path, 'bin', jarsigner_executable)) + end + + def self.jarsigner_executable + is_windows? ? 'jarsigner.exe' : 'jarsigner' + end + + def self.keytool_executable + is_windows? ? 'keytool.exe' : 'keytool' + end + + def self.adb_executable + is_windows? ? 'adb.exe' : 'adb' + end + def self.ant_path is_windows? ? "ant.bat" : "ant" end def self.is_windows? @@ -30,31 +98,46 @@ raise "Could not find tools directory in #{android_home_path}" if dirs.empty? File.expand_path(dirs.first) end end - def self.adb - %Q("#{android_home_path}/platform-tools/adb") + def self.adb_path + %Q("#{android_home_path}/platform-tools/#{adb_executable}") + end + + def self.path_if_android_home(path) + path if path && File.exists?(File.join(path, 'platform-tools', adb_executable)) end - def self.android_home_path - return ENV["ANDROID_HOME"] if ENV["ANDROID_HOME"] + def self.path_elements + return [] unless ENV['PATH'] + ENV['PATH'].split (/[:;]/) + end + + def self.read_attribute_from_monodroid_config(element, attribute) monodroid_config_file = File.expand_path("~/.config/xbuild/monodroid-config.xml") if File.exists?(monodroid_config_file) require 'rexml/document' begin - return REXML::Document.new(IO.read(monodroid_config_file)).elements["//android-sdk"].attributes["path"] + return REXML::Document.new(IO.read(monodroid_config_file)).elements["//#{element}"].attributes[attribute] rescue end end - nil end def self.android_platform_path Dir.chdir(android_home_path) do platforms = Dir["platforms/android-*"].sort_by { |item| '%08s' % item.split('-').last } raise "No Android SDK found in #{android_home_path}/platforms/" if platforms.empty? File.expand_path(platforms.last) + end + end + + def self.read_registry(root_key, key, value) + begin + root_key.open(key)[value] + rescue + nil end end end \ No newline at end of file