Class: XcodeInstall::Installer
- Inherits:
-
Object
- Object
- XcodeInstall::Installer
- Defined in:
- lib/xcode/install.rb
Instance Attribute Summary collapse
-
#xcodes ⇒ Object
readonly
Returns the value of attribute xcodes.
Instance Method Summary collapse
- #cache_dir ⇒ Object
- #current_symlink ⇒ Object
- #download(version, progress, url = nil) ⇒ Object
- #exist?(version) ⇒ Boolean
-
#initialize ⇒ Installer
constructor
A new instance of Installer.
- #install_dmg(dmg_path, suffix = '', switch = true, clean = true) ⇒ Object
- #install_version(version, switch = true, clean = true, install = true, progress = true, url = nil) ⇒ Object
- #installed?(version) ⇒ Boolean
- #installed_versions ⇒ Object
- #list ⇒ Object
- #list_annotated(xcodes_list) ⇒ Object
- #list_current ⇒ Object
- #mount(dmg_path) ⇒ Object
- #open_release_notes_url(version) ⇒ Object
- #rm_list_cache ⇒ Object
- #symlink(version) ⇒ Object
- #symlinks_to ⇒ Object
Constructor Details
Instance Attribute Details
#xcodes ⇒ Object (readonly)
Returns the value of attribute xcodes.
37 38 39 |
# File 'lib/xcode/install.rb', line 37 def xcodes @xcodes end |
Instance Method Details
#cache_dir ⇒ Object
43 44 45 |
# File 'lib/xcode/install.rb', line 43 def cache_dir CACHE_DIR end |
#current_symlink ⇒ Object
47 48 49 |
# File 'lib/xcode/install.rb', line 47 def current_symlink File.symlink?(SYMLINK_PATH) ? SYMLINK_PATH : nil end |
#download(version, progress, url = nil) ⇒ Object
51 52 53 54 55 56 57 58 |
# File 'lib/xcode/install.rb', line 51 def download(version, progress, url = nil) return unless url || exist?(version) xcode = seedlist.find { |x| x.name == version } unless url dmg_file = Pathname.new(File.basename(url || xcode.path)) result = Curl.new.fetch(url || xcode.url, CACHE_DIR, url ? nil : spaceship., dmg_file, progress) result ? CACHE_DIR + dmg_file : nil end |
#exist?(version) ⇒ Boolean
60 61 62 |
# File 'lib/xcode/install.rb', line 60 def exist?(version) list_versions.include?(version) end |
#install_dmg(dmg_path, suffix = '', switch = true, clean = true) ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/xcode/install.rb', line 74 def install_dmg(dmg_path, suffix = '', switch = true, clean = true) archive_util = '/System/Library/CoreServices/Applications/Archive Utility.app/Contents/MacOS/Archive Utility' prompt = "Please authenticate for Xcode installation.\nPassword: " xcode_path = "/Applications/Xcode#{suffix}.app" if dmg_path.extname == '.xip' `'#{archive_util}' #{dmg_path}` xcode_orig_path = dmg_path.dirname + 'Xcode.app' xcode_beta_path = dmg_path.dirname + 'Xcode-beta.app' if Pathname.new(xcode_orig_path).exist? `sudo -p "#{prompt}" mv "#{xcode_orig_path}" "#{xcode_path}"` elsif Pathname.new(xcode_beta_path).exist? `sudo -p "#{prompt}" mv "#{xcode_beta_path}" "#{xcode_path}"` else out = <<-HELP No `Xcode.app(or Xcode-beta.app)` found in XIP. Please remove #{dmg_path} if you suspect a corrupted download or run `xcversion update` to see if the version you tried to install has been pulled by Apple. If none of this is true, please open a new GH issue. HELP $stderr.puts out.tr("\n", ' ') return end else mount_dir = mount(dmg_path) source = Dir.glob(File.join(mount_dir, 'Xcode*.app')).first if source.nil? out = <<-HELP No `Xcode.app` found in DMG. Please remove #{dmg_path} if you suspect a corrupted download or run `xcversion update` to see if the version you tried to install has been pulled by Apple. If none of this is true, please open a new GH issue. HELP $stderr.puts out.tr("\n", ' ') return end `sudo -p "#{prompt}" ditto "#{source}" "#{xcode_path}"` `umount "/Volumes/Xcode"` end unless verify_integrity(xcode_path) `sudo rm -f #{xcode_path}` return end enable_developer_mode xcode = InstalledXcode.new(xcode_path) xcode.approve_license xcode.install_components if switch `sudo rm -f #{SYMLINK_PATH}` unless current_symlink.nil? `sudo ln -sf #{xcode_path} #{SYMLINK_PATH}` unless SYMLINK_PATH.exist? `sudo xcode-select --switch #{xcode_path}` puts `xcodebuild -version` end FileUtils.rm_f(dmg_path) if clean end |
#install_version(version, switch = true, clean = true, install = true, progress = true, url = nil) ⇒ Object
136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/xcode/install.rb', line 136 def install_version(version, switch = true, clean = true, install = true, progress = true, url = nil) dmg_path = get_dmg(version, progress, url) fail Informative, "Failed to download Xcode #{version}." if dmg_path.nil? if install install_dmg(dmg_path, "-#{version.split(' ')[0]}", switch, clean) else puts "Downloaded Xcode #{version} to '#{dmg_path}'" end open_release_notes_url(version) unless url end |
#installed?(version) ⇒ Boolean
64 65 66 |
# File 'lib/xcode/install.rb', line 64 def installed?(version) installed_versions.map(&:version).include?(version) end |
#installed_versions ⇒ Object
68 69 70 71 72 |
# File 'lib/xcode/install.rb', line 68 def installed_versions installed.map { |x| InstalledXcode.new(x) }.sort do |a, b| Gem::Version.new(a.version) <=> Gem::Version.new(b.version) end end |
#list ⇒ Object
167 168 169 |
# File 'lib/xcode/install.rb', line 167 def list list_annotated(list_versions.sort) end |
#list_annotated(xcodes_list) ⇒ Object
155 156 157 158 |
# File 'lib/xcode/install.rb', line 155 def list_annotated(xcodes_list) installed = installed_versions.map(&:version) xcodes_list.map { |x| installed.include?(x) ? "#{x} (installed)" : x }.join("\n") end |
#list_current ⇒ Object
160 161 162 163 164 165 |
# File 'lib/xcode/install.rb', line 160 def list_current stable_majors = list_versions.reject { |v| /beta/i =~ v }.map { |v| v.split('.')[0] }.map { |v| v.split(' ')[0] } latest_stable_major = stable_majors.select { |v| v.length == 1 }.uniq.sort.last.to_i current_versions = list_versions.select { |v| v.split('.')[0].to_i >= latest_stable_major }.sort list_annotated(current_versions) end |
#mount(dmg_path) ⇒ Object
185 186 187 188 189 190 191 |
# File 'lib/xcode/install.rb', line 185 def mount(dmg_path) plist = hdiutil('mount', '-plist', '-nobrowse', '-noverify', dmg_path.to_s) document = REXML::Document.new(plist) node = REXML::XPath.first(document, "//key[.='mount-point']/following-sibling::*[1]") fail Informative, 'Failed to mount image.' unless node node.text end |
#open_release_notes_url(version) ⇒ Object
149 150 151 152 153 |
# File 'lib/xcode/install.rb', line 149 def open_release_notes_url(version) return if version.nil? xcode = seedlist.find { |x| x.name == version } `open #{xcode.release_notes_url}` unless xcode.nil? || xcode.release_notes_url.nil? end |
#rm_list_cache ⇒ Object
171 172 173 |
# File 'lib/xcode/install.rb', line 171 def rm_list_cache FileUtils.rm_f(LIST_FILE) end |
#symlink(version) ⇒ Object
175 176 177 178 179 |
# File 'lib/xcode/install.rb', line 175 def symlink(version) xcode = installed_versions.find { |x| x.version == version } `sudo rm -f #{SYMLINK_PATH}` unless current_symlink.nil? `sudo ln -sf #{xcode.path} #{SYMLINK_PATH}` unless xcode.nil? || SYMLINK_PATH.exist? end |
#symlinks_to ⇒ Object
181 182 183 |
# File 'lib/xcode/install.rb', line 181 def symlinks_to File.absolute_path(File.readlink(current_symlink), SYMLINK_PATH.dirname) if current_symlink end |