Object
TODO: Refactor this class
# File lib/bundler/source.rb, line 52 52: def self.from_lock(options) 53: s = new(options) 54: Array(options["remote"]).each { |r| s.add_remote(r) } 55: s 56: end
# File lib/bundler/source.rb, line 14 14: def initialize(options = {}) 15: @options = options 16: @remotes = (options["remotes"] || []).map { |r| normalize_uri(r) } 17: @allow_remote = false 18: @allow_cached = false 19: # Hardcode the paths for now 20: @caches = [ Bundler.app_cache ] + Gem.path.map { |p| File.expand_path("#{p}/cache") } 21: @spec_fetch_map = {} 22: end
# File lib/bundler/source.rb, line 128 128: def add_remote(source) 129: @remotes << normalize_uri(source) 130: end
# File lib/bundler/source.rb, line 120 120: def cache(spec) 121: cached_path = cached_gem(spec) 122: raise GemNotFound, "Missing gem file '#{spec.full_name}.gem'." unless cached_path 123: return if File.dirname(cached_path) == Bundler.app_cache.to_s 124: Bundler.ui.info " * #{File.basename(cached_path)}" 125: FileUtils.cp(cached_path, Bundler.app_cache) 126: end
# File lib/bundler/source.rb, line 28 28: def cached! 29: @allow_cached = true 30: end
# File lib/bundler/source.rb, line 36 36: def eql?(o) 37: Rubygems === o 38: end
# File lib/bundler/source.rb, line 73 73: def fetch(spec) 74: spec, uri = @spec_fetch_map[spec.full_name] 75: if spec 76: path = download_gem_from_uri(spec, uri) 77: s = Gem::Format.from_file_by_path(path).spec 78: spec.__swap__(s) 79: end 80: end
# File lib/bundler/source.rb, line 32 32: def hash 33: Rubygems.hash 34: end
# File lib/bundler/source.rb, line 82 82: def install(spec) 83: path = cached_gem(spec) 84: 85: if installed_specs[spec].any? 86: Bundler.ui.info "Using #{spec.name} (#{spec.version}) " 87: return 88: end 89: 90: Bundler.ui.info "Installing #{spec.name} (#{spec.version}) " 91: 92: install_path = Bundler.requires_sudo? ? Bundler.tmp : Gem.dir 93: options = { :install_dir => install_path, 94: :ignore_dependencies => true, 95: :wrappers => true, 96: :env_shebang => true } 97: options.merge!(:bin_dir => "#{install_path}/bin") unless spec.executables.nil? || spec.executables.empty? 98: 99: installer = Gem::Installer.new path, options 100: installer.install 101: 102: # SUDO HAX 103: if Bundler.requires_sudo? 104: sudo "mkdir -p #{Gem.dir}/gems #{Gem.dir}/specifications" 105: sudo "cp -R #{Bundler.tmp}/gems/#{spec.full_name} #{Gem.dir}/gems/" 106: sudo "cp -R #{Bundler.tmp}/specifications/#{spec.full_name}.gemspec #{Gem.dir}/specifications/" 107: spec.executables.each do |exe| 108: sudo "mkdir -p #{Gem.bindir}" 109: sudo "cp -R #{Bundler.tmp}/bin/#{exe} #{Gem.bindir}" 110: end 111: end 112: 113: spec.loaded_from = "#{Gem.dir}/specifications/#{spec.full_name}.gemspec" 114: end
# File lib/bundler/source.rb, line 132 132: def merge_remotes(source) 133: @remotes = [] 134: source.remotes.each do |r| 135: add_remote r.to_s 136: end 137: end
# File lib/bundler/source.rb, line 48 48: def options 49: { "remotes" => @remotes.map { |r| r.to_s } } 50: end
# File lib/bundler/source.rb, line 24 24: def remote! 25: @allow_remote = true 26: end
# File lib/bundler/source.rb, line 69 69: def specs 70: @specs ||= fetch_specs 71: end
# File lib/bundler/source.rb, line 116 116: def sudo(str) 117: Bundler.sudo(str) 118: end
# File lib/bundler/source.rb, line 141 141: def cached_gem(spec) 142: possibilities = @caches.map { |p| "#{p}/#{spec.full_name}.gem" } 143: possibilities.find { |p| File.exist?(p) } 144: end
# File lib/bundler/source.rb, line 192 192: def cached_specs 193: @cached_specs ||= begin 194: idx = Index.new 195: @caches.each do |path| 196: Dir["#{path}/*.gem"].each do |gemfile| 197: next if name == 'bundler' 198: s = Gem::Format.from_file_by_path(gemfile).spec 199: s.source = self 200: idx << s 201: end 202: end 203: idx 204: end 205: end
# File lib/bundler/source.rb, line 246 246: def download_gem_from_uri(spec, uri) 247: spec.fetch_platform 248: 249: download_path = Bundler.requires_sudo? ? Bundler.tmp : Gem.dir 250: gem_path = "#{Gem.dir}/cache/#{spec.full_name}.gem" 251: 252: FileUtils.mkdir_p("#{download_path}/cache") 253: Gem::RemoteFetcher.fetcher.download(spec, uri, download_path) 254: 255: if Bundler.requires_sudo? 256: sudo "mkdir -p #{Gem.dir}/cache" 257: sudo "mv #{Bundler.tmp}/cache/#{spec.full_name}.gem #{gem_path}" 258: end 259: 260: gem_path 261: end
# File lib/bundler/source.rb, line 231 231: def fetch_all_remote_specs(&blk) 232: begin 233: # Fetch all specs, minus prerelease specs 234: Gem::SpecFetcher.new.list(true, false).each(&blk) 235: # Then fetch the prerelease specs 236: begin 237: Gem::SpecFetcher.new.list(false, true).each(&blk) 238: rescue Gem::RemoteFetcher::FetchError 239: Bundler.ui.warn "Could not fetch prerelease specs from #{self}" 240: end 241: rescue Gem::RemoteFetcher::FetchError 242: Bundler.ui.warn "Could not reach #{self}" 243: end 244: end
# File lib/bundler/source.rb, line 154 154: def fetch_specs 155: Index.build do |idx| 156: idx.use installed_specs 157: idx.use cached_specs if @allow_cached || @allow_remote 158: idx.use remote_specs if @allow_remote 159: end 160: end
# File lib/bundler/source.rb, line 162 162: def installed_specs 163: @installed_specs ||= begin 164: idx = Index.new 165: have_bundler = false 166: Gem::SourceIndex.from_installed_gems.to_a.reverse.each do |dont_use_this_var, spec| 167: next if spec.name == 'bundler' && spec.version.to_s != VERSION 168: have_bundler = true if spec.name == 'bundler' 169: spec.source = self 170: idx << spec 171: end 172: 173: # Always have bundler locally 174: unless have_bundler 175: # We're running bundler directly from the source 176: # so, let's create a fake gemspec for it (it's a path) 177: # gemspec 178: bundler = Gem::Specification.new do |s| 179: s.name = 'bundler' 180: s.version = VERSION 181: s.platform = Gem::Platform::RUBY 182: s.source = self 183: # TODO: Remove this 184: s.loaded_from = 'w0t' 185: end 186: idx << bundler 187: end 188: idx 189: end 190: end
# File lib/bundler/source.rb, line 146 146: def normalize_uri(uri) 147: uri = uri.to_s 148: uri = "#{uri}/" unless uri =~ %/$' 149: uri = URI(uri) 150: raise ArgumentError, "The source must be an absolute URI" unless uri.absolute? 151: uri 152: end
# File lib/bundler/source.rb, line 207 207: def remote_specs 208: @remote_specs ||= begin 209: idx = Index.new 210: old = Gem.sources 211: 212: remotes.each do |uri| 213: Bundler.ui.info "Fetching source index for #{uri}" 214: Gem.sources = ["#{uri}"] 215: fetch_all_remote_specs do |n,v| 216: v.each do |name, version, platform| 217: next if name == 'bundler' 218: spec = RemoteSpecification.new(name, version, platform, uri) 219: spec.source = self 220: @spec_fetch_map[spec.full_name] = [spec, uri] 221: idx << spec 222: end 223: end 224: end 225: idx 226: ensure 227: Gem.sources = old 228: end 229: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.