bundler 1.10.6 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +105 -0
  3. data/.rubocop_todo.yml +120 -0
  4. data/.travis.yml +8 -23
  5. data/CHANGELOG.md +95 -0
  6. data/CODE_OF_CONDUCT.md +6 -4
  7. data/DEVELOPMENT.md +4 -5
  8. data/README.md +2 -2
  9. data/Rakefile +71 -88
  10. data/bin/rake +14 -0
  11. data/bin/rspec +10 -0
  12. data/bin/rubocop +11 -0
  13. data/bundler.gemspec +17 -15
  14. data/exe/bundle +20 -0
  15. data/{bin → exe}/bundle_ruby +6 -4
  16. data/exe/bundler +20 -0
  17. data/lib/bundler/capistrano.rb +2 -2
  18. data/lib/bundler/cli/binstubs.rb +1 -2
  19. data/lib/bundler/cli/cache.rb +0 -1
  20. data/lib/bundler/cli/check.rb +7 -5
  21. data/lib/bundler/cli/clean.rb +0 -1
  22. data/lib/bundler/cli/common.rb +6 -7
  23. data/lib/bundler/cli/config.rb +69 -56
  24. data/lib/bundler/cli/console.rb +8 -8
  25. data/lib/bundler/cli/exec.rb +5 -4
  26. data/lib/bundler/cli/gem.rb +52 -40
  27. data/lib/bundler/cli/init.rb +5 -6
  28. data/lib/bundler/cli/inject.rb +1 -2
  29. data/lib/bundler/cli/install.rb +18 -21
  30. data/lib/bundler/cli/lock.rb +8 -3
  31. data/lib/bundler/cli/open.rb +4 -5
  32. data/lib/bundler/cli/outdated.rb +7 -8
  33. data/lib/bundler/cli/package.rb +1 -1
  34. data/lib/bundler/cli/platform.rb +2 -3
  35. data/lib/bundler/cli/show.rb +9 -9
  36. data/lib/bundler/cli/update.rb +2 -3
  37. data/lib/bundler/cli/viz.rb +1 -2
  38. data/lib/bundler/cli.rb +85 -74
  39. data/lib/bundler/constants.rb +1 -1
  40. data/lib/bundler/current_ruby.rb +38 -3
  41. data/lib/bundler/definition.rb +83 -88
  42. data/lib/bundler/dep_proxy.rb +11 -9
  43. data/lib/bundler/dependency.rb +17 -11
  44. data/lib/bundler/deployment.rb +2 -2
  45. data/lib/bundler/deprecate.rb +3 -3
  46. data/lib/bundler/dsl.rb +62 -43
  47. data/lib/bundler/env.rb +19 -12
  48. data/lib/bundler/environment.rb +1 -2
  49. data/lib/bundler/errors.rb +82 -0
  50. data/lib/bundler/fetcher/base.rb +20 -7
  51. data/lib/bundler/fetcher/dependency.rb +5 -5
  52. data/lib/bundler/fetcher/downloader.rb +1 -2
  53. data/lib/bundler/fetcher/index.rb +4 -7
  54. data/lib/bundler/fetcher.rb +49 -40
  55. data/lib/bundler/friendly_errors.rb +15 -8
  56. data/lib/bundler/gem_helper.rb +44 -35
  57. data/lib/bundler/gem_helpers.rb +7 -8
  58. data/lib/bundler/gem_remote_fetcher.rb +41 -0
  59. data/lib/bundler/gem_tasks.rb +4 -1
  60. data/lib/bundler/graph.rb +25 -24
  61. data/lib/bundler/index.rb +21 -18
  62. data/lib/bundler/injector.rb +2 -4
  63. data/lib/bundler/inline.rb +3 -3
  64. data/lib/bundler/installer/gem_installer.rb +76 -0
  65. data/lib/bundler/installer/parallel_installer.rb +22 -13
  66. data/lib/bundler/installer/standalone.rb +48 -0
  67. data/lib/bundler/installer.rb +57 -144
  68. data/lib/bundler/lazy_specification.rb +4 -5
  69. data/lib/bundler/lockfile_parser.rb +21 -19
  70. data/lib/bundler/man/bundle +2 -2
  71. data/lib/bundler/man/bundle-config +2 -2
  72. data/lib/bundler/man/bundle-config.txt +6 -4
  73. data/lib/bundler/man/bundle-exec +1 -1
  74. data/lib/bundler/man/bundle-exec.txt +1 -1
  75. data/lib/bundler/man/bundle-gem +80 -0
  76. data/lib/bundler/man/bundle-gem.txt +90 -0
  77. data/lib/bundler/man/bundle-install +37 -6
  78. data/lib/bundler/man/bundle-install.txt +68 -44
  79. data/lib/bundler/man/bundle-lock +55 -0
  80. data/lib/bundler/man/bundle-lock.txt +60 -0
  81. data/lib/bundler/man/bundle-package +1 -1
  82. data/lib/bundler/man/bundle-package.txt +1 -1
  83. data/lib/bundler/man/bundle-platform +1 -1
  84. data/lib/bundler/man/bundle-platform.txt +1 -1
  85. data/lib/bundler/man/bundle-update +1 -1
  86. data/lib/bundler/man/bundle-update.txt +1 -1
  87. data/lib/bundler/man/bundle.txt +2 -2
  88. data/lib/bundler/man/gemfile.5 +17 -1
  89. data/lib/bundler/man/gemfile.5.txt +12 -1
  90. data/lib/bundler/match_platform.rb +4 -4
  91. data/lib/bundler/psyched_yaml.rb +5 -5
  92. data/lib/bundler/remote_specification.rb +1 -1
  93. data/lib/bundler/resolver.rb +93 -88
  94. data/lib/bundler/retry.rb +9 -10
  95. data/lib/bundler/ruby_dsl.rb +1 -1
  96. data/lib/bundler/ruby_version.rb +7 -10
  97. data/lib/bundler/rubygems_ext.rb +32 -27
  98. data/lib/bundler/{gem_installer.rb → rubygems_gem_installer.rb} +2 -2
  99. data/lib/bundler/rubygems_integration.rb +85 -70
  100. data/lib/bundler/runtime.rb +65 -61
  101. data/lib/bundler/settings.rb +27 -26
  102. data/lib/bundler/setup.rb +3 -3
  103. data/lib/bundler/shared_helpers.rb +45 -20
  104. data/lib/bundler/similarity_detector.rb +19 -21
  105. data/lib/bundler/source/git/git_proxy.rb +52 -26
  106. data/lib/bundler/source/git.rb +29 -31
  107. data/lib/bundler/source/path/installer.rb +4 -4
  108. data/lib/bundler/source/path.rb +25 -28
  109. data/lib/bundler/source/rubygems/remote.rb +3 -3
  110. data/lib/bundler/source/rubygems.rb +62 -48
  111. data/lib/bundler/source.rb +4 -5
  112. data/lib/bundler/source_list.rb +4 -4
  113. data/lib/bundler/spec_set.rb +17 -15
  114. data/lib/bundler/ssl_certs/certificate_manager.rb +5 -6
  115. data/lib/bundler/stub_specification.rb +2 -2
  116. data/lib/bundler/templates/Executable +5 -5
  117. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +42 -6
  118. data/lib/bundler/templates/newgem/README.md.tt +1 -1
  119. data/lib/bundler/templates/newgem/Rakefile.tt +4 -2
  120. data/lib/bundler/templates/newgem/bin/setup.tt +2 -1
  121. data/lib/bundler/templates/newgem/newgem.gemspec.tt +2 -2
  122. data/lib/bundler/ui/rg_proxy.rb +2 -2
  123. data/lib/bundler/ui/shell.rb +10 -6
  124. data/lib/bundler/ui.rb +3 -3
  125. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +82 -71
  126. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  127. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +9 -0
  128. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +40 -21
  129. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -0
  130. data/lib/bundler/vendored_molinillo.rb +1 -1
  131. data/lib/bundler/vendored_persistent.rb +3 -3
  132. data/lib/bundler/vendored_thor.rb +2 -2
  133. data/lib/bundler/version.rb +1 -1
  134. data/lib/bundler/vlad.rb +1 -1
  135. data/lib/bundler/worker.rb +4 -5
  136. data/lib/bundler.rb +99 -120
  137. data/man/bundle-config.ronn +4 -2
  138. data/man/bundle-gem.ronn +77 -0
  139. data/man/bundle-install.ronn +13 -6
  140. data/man/bundle-lock.ronn +47 -0
  141. data/man/bundle.ronn +1 -1
  142. data/man/gemfile.5.ronn +8 -0
  143. data/man/index.txt +1 -0
  144. metadata +36 -8
  145. data/bin/bundle +0 -21
  146. data/bin/bundler +0 -21
data/lib/bundler/dsl.rb CHANGED
@@ -1,5 +1,5 @@
1
- require 'bundler/dependency'
2
- require 'bundler/ruby_dsl'
1
+ require "bundler/dependency"
2
+ require "bundler/ruby_dsl"
3
3
 
4
4
  module Bundler
5
5
  class Dsl
@@ -13,6 +13,7 @@ module Bundler
13
13
 
14
14
  VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze
15
15
 
16
+ attr_reader :gemspecs
16
17
  attr_accessor :dependencies
17
18
 
18
19
  def initialize
@@ -26,6 +27,7 @@ module Bundler
26
27
  @platforms = []
27
28
  @env = nil
28
29
  @ruby_version = nil
30
+ @gemspecs = []
29
31
  add_git_sources
30
32
  end
31
33
 
@@ -33,14 +35,17 @@ module Bundler
33
35
  contents ||= Bundler.read_file(gemfile.to_s)
34
36
  instance_eval(contents, gemfile.to_s, 1)
35
37
  rescue Exception => e
36
- message = "There was an error parsing `#{File.basename gemfile.to_s}`: #{e.message}"
38
+ message = "There was an error " \
39
+ "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \
40
+ "`#{File.basename gemfile.to_s}`: #{e.message}"
41
+
37
42
  raise DSLError.new(message, gemfile, e.backtrace, contents)
38
43
  end
39
44
 
40
45
  def gemspec(opts = nil)
41
- path = opts && opts[:path] || '.'
46
+ path = opts && opts[:path] || "."
42
47
  glob = opts && opts[:glob]
43
- name = opts && opts[:name] || '{,*}'
48
+ name = opts && opts[:name] || "{,*}"
44
49
  development_group = opts && opts[:development_group] || :development
45
50
  expanded_path = File.expand_path(path, Bundler.default_gemfile.dirname)
46
51
 
@@ -52,7 +57,7 @@ module Bundler
52
57
 
53
58
  unless spec
54
59
  raise InvalidOption, "There was an error loading the gemspec at " \
55
- "#{file}. Make sure you can build the gem, then try again."
60
+ "#{file}. Make sure you can build the gem, then try again"
56
61
  end
57
62
 
58
63
  gem spec.name, :path => path, :glob => glob
@@ -62,11 +67,13 @@ module Bundler
62
67
  gem dep.name, *(dep.requirement.as_list + [:type => :development])
63
68
  end
64
69
  end
70
+
71
+ @gemspecs << gemspecs.first
65
72
  when 0
66
- raise InvalidOption, "There are no gemspecs at #{expanded_path}."
73
+ raise InvalidOption, "There are no gemspecs at #{expanded_path}"
67
74
  else
68
75
  raise InvalidOption, "There are multiple gemspecs at #{expanded_path}. " \
69
- "Please use the :name option to specify which one should be used."
76
+ "Please use the :name option to specify which one should be used"
70
77
  end
71
78
  end
72
79
 
@@ -79,7 +86,7 @@ module Bundler
79
86
  dep = Dependency.new(name, version, options)
80
87
 
81
88
  # if there's already a dependency with this name we try to prefer one
82
- if current = @dependencies.find { |d| d.name == dep.name }
89
+ if current = @dependencies.find {|d| d.name == dep.name }
83
90
  if current.requirement != dep.requirement
84
91
  if current.type == :development
85
92
  @dependencies.delete current
@@ -104,7 +111,7 @@ module Bundler
104
111
  else
105
112
  raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
106
113
  "You specified that #{dep.name} (#{dep.requirement}) should come from " \
107
- "#{current.source || 'an unspecified source'} and #{dep.source}\n"
114
+ "#{current.source || "an unspecified source"} and #{dep.source}\n"
108
115
  end
109
116
  end
110
117
  end
@@ -198,7 +205,8 @@ module Bundler
198
205
  alias_method :platform, :platforms
199
206
 
200
207
  def env(name)
201
- @env, old = name, @env
208
+ old = @env
209
+ @env = name
202
210
  yield
203
211
  ensure
204
212
  @env = old
@@ -212,27 +220,41 @@ module Bundler
212
220
 
213
221
  def add_git_sources
214
222
  git_source(:github) do |repo_name|
223
+ # It would be better to use https instead of the git protocol, but this
224
+ # can break deployment of existing locked bundles when switching between
225
+ # different versions of Bundler. The change will be made in 2.0, which
226
+ # does not guarantee compatibility with the 1.x series.
227
+ #
228
+ # See https://github.com/bundler/bundler/pull/2569 for discussion
229
+ #
230
+ # This can be overridden by adding this code to your Gemfiles:
231
+ #
232
+ # git_source(:github) do |repo_name|
233
+ # repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
234
+ # "https://github.com/#{repo_name}.git"
235
+ # end
215
236
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
216
237
  "git://github.com/#{repo_name}.git"
217
238
  end
218
239
 
219
- git_source(:gist){ |repo_name| "https://gist.github.com/#{repo_name}.git" }
240
+ git_source(:gist) {|repo_name| "https://gist.github.com/#{repo_name}.git" }
220
241
 
221
242
  git_source(:bitbucket) do |repo_name|
222
- user_name, repo_name = repo_name.split '/'
243
+ user_name, repo_name = repo_name.split "/"
223
244
  repo_name ||= user_name
224
245
  "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
225
246
  end
226
247
  end
227
248
 
228
249
  def with_source(source)
250
+ old_source = @source
229
251
  if block_given?
230
252
  @source = source
231
253
  yield
232
254
  end
233
255
  source
234
256
  ensure
235
- @source = nil
257
+ @source = old_source
236
258
  end
237
259
 
238
260
  def normalize_hash(opts)
@@ -248,10 +270,10 @@ module Bundler
248
270
 
249
271
  def normalize_options(name, version, opts)
250
272
  if name.is_a?(Symbol)
251
- raise GemfileError, %{You need to specify gem names as Strings. Use 'gem "#{name}"' instead.}
273
+ raise GemfileError, %(You need to specify gem names as Strings. Use 'gem "#{name}"' instead)
252
274
  end
253
275
  if name =~ /\s/
254
- raise GemfileError, %{'#{name}' is not a valid gem name because it contains whitespace.}
276
+ raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
255
277
  end
256
278
 
257
279
  normalize_hash(opts)
@@ -273,14 +295,14 @@ module Bundler
273
295
  platforms = @platforms.dup
274
296
  opts["platforms"] = opts["platform"] || opts["platforms"]
275
297
  platforms.concat Array(opts.delete("platforms"))
276
- platforms.map! { |p| p.to_sym }
298
+ platforms.map!(&:to_sym)
277
299
  platforms.each do |p|
278
300
  next if VALID_PLATFORMS.include?(p)
279
301
  raise GemfileError, "`#{p}` is not a valid platform. The available options are: #{VALID_PLATFORMS.inspect}"
280
302
  end
281
303
 
282
304
  # Save sources passed in a key
283
- if opts.has_key?("source")
305
+ if opts.key?("source")
284
306
  source = normalize_source(opts["source"])
285
307
  opts["source"] = @sources.add_rubygems_source("remotes" => source)
286
308
  end
@@ -290,20 +312,19 @@ module Bundler
290
312
  opts["git"] = @git_sources[git_name].call(opts[git_name])
291
313
  end
292
314
 
293
- ["git", "path"].each do |type|
294
- if param = opts[type]
295
- if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/
296
- options = opts.merge("name" => name, "version" => $1)
297
- else
298
- options = opts.dup
299
- end
300
- source = send(type, param, options) {}
301
- opts["source"] = source
315
+ %w(git path).each do |type|
316
+ next unless param = opts[type]
317
+ if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/
318
+ options = opts.merge("name" => name, "version" => $1)
319
+ else
320
+ options = opts.dup
302
321
  end
322
+ source = send(type, param, options) {}
323
+ opts["source"] = source
303
324
  end
304
325
 
305
- opts["source"] ||= @source
306
- opts["env"] ||= @env
326
+ opts["source"] ||= @source
327
+ opts["env"] ||= @env
307
328
  opts["platforms"] = platforms.dup
308
329
  opts["group"] = groups
309
330
  opts["should_include"] = install_if
@@ -321,7 +342,7 @@ module Bundler
321
342
  def validate_keys(command, opts, valid_keys)
322
343
  invalid_keys = opts.keys - valid_keys
323
344
  if invalid_keys.any?
324
- message = "You passed #{invalid_keys.map{|k| ':'+k }.join(", ")} "
345
+ message = "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} "
325
346
  message << if invalid_keys.size > 1
326
347
  "as options for #{command}, but they are invalid."
327
348
  else
@@ -354,7 +375,7 @@ module Bundler
354
375
  raise GemspecError, "Warning: this Gemfile contains multiple primary sources. " \
355
376
  "Each source after the first must include a block to indicate which gems " \
356
377
  "should come from that source. To downgrade this error to a warning, run " \
357
- "`bundle config --delete disable_multisource`."
378
+ "`bundle config --delete disable_multisource`"
358
379
  else
359
380
  Bundler.ui.warn "Warning: this Gemfile contains multiple primary sources. " \
360
381
  "Using `source` more than once without a block is a security risk, and " \
@@ -432,40 +453,38 @@ module Bundler
432
453
 
433
454
  return m unless backtrace && dsl_path && contents
434
455
 
435
- trace_line = backtrace.find { |l| l.include?(dsl_path.to_s) } || trace_line
456
+ trace_line = backtrace.find {|l| l.include?(dsl_path.to_s) } || trace_line
436
457
  return m unless trace_line
437
- line_numer = trace_line.split(':')[1].to_i - 1
458
+ line_numer = trace_line.split(":")[1].to_i - 1
438
459
  return m unless line_numer
439
460
 
440
461
  lines = contents.lines.to_a
441
- indent = ' # '
442
- indicator = indent.gsub('#', '>')
462
+ indent = " # "
463
+ indicator = indent.tr('#', ">")
443
464
  first_line = (line_numer.zero?)
444
465
  last_line = (line_numer == (lines.count - 1))
445
466
 
446
467
  m << "\n"
447
- m << "#{indent}from #{trace_line.gsub(/:in.*$/, '')}\n"
468
+ m << "#{indent}from #{trace_line.gsub(/:in.*$/, "")}\n"
448
469
  m << "#{indent}-------------------------------------------\n"
449
- m << "#{indent}#{ lines[line_numer - 1] }" unless first_line
450
- m << "#{indicator}#{ lines[line_numer] }"
451
- m << "#{indent}#{ lines[line_numer + 1] }" unless last_line
470
+ m << "#{indent}#{lines[line_numer - 1]}" unless first_line
471
+ m << "#{indicator}#{lines[line_numer]}"
472
+ m << "#{indent}#{lines[line_numer + 1]}" unless last_line
452
473
  m << "\n" unless m.end_with?("\n")
453
474
  m << "#{indent}-------------------------------------------\n"
454
475
  end
455
476
  end
456
477
 
457
- private
478
+ private
458
479
 
459
480
  def parse_line_number_from_description
460
481
  description = self.description
461
482
  if dsl_path && description =~ /((#{Regexp.quote File.expand_path(dsl_path)}|#{Regexp.quote dsl_path.to_s}):\d+)/
462
483
  trace_line = Regexp.last_match[1]
463
- description = description.sub(/#{Regexp.quote trace_line}:\s*/, '').sub("\n", ' - ')
484
+ description = description.sub(/#{Regexp.quote trace_line}:\s*/, "").sub("\n", " - ")
464
485
  end
465
486
  [trace_line, description]
466
487
  end
467
488
  end
468
-
469
489
  end
470
-
471
490
  end
data/lib/bundler/env.rb CHANGED
@@ -1,27 +1,27 @@
1
- require 'bundler/rubygems_integration'
2
- require 'bundler/source/git/git_proxy'
1
+ require "bundler/rubygems_integration"
2
+ require "bundler/source/git/git_proxy"
3
3
 
4
4
  module Bundler
5
5
  class Env
6
-
7
6
  def write(io)
8
- io.write report(:print_gemfile => true)
7
+ io.write report(:print_gemfile => true, :print_gemspecs => true)
9
8
  end
10
9
 
11
10
  def report(options = {})
12
11
  print_gemfile = options.delete(:print_gemfile)
12
+ print_gemspecs = options.delete(:print_gemspecs)
13
13
 
14
14
  out = "Environment\n\n"
15
15
  out << " Bundler #{Bundler::VERSION}\n"
16
16
  out << " Rubygems #{Gem::VERSION}\n"
17
17
  out << " Ruby #{ruby_version}"
18
- out << " GEM_HOME #{ENV['GEM_HOME']}\n" unless ENV['GEM_HOME'].nil? || ENV['GEM_HOME'].empty?
19
- out << " GEM_PATH #{ENV['GEM_PATH']}\n" unless ENV['GEM_PATH'] == ENV['GEM_HOME']
20
- out << " RVM #{ENV['rvm_version']}\n" if ENV['rvm_version']
18
+ out << " GEM_HOME #{ENV["GEM_HOME"]}\n" unless ENV["GEM_HOME"].nil? || ENV["GEM_HOME"].empty?
19
+ out << " GEM_PATH #{ENV["GEM_PATH"]}\n" unless ENV["GEM_PATH"] == ENV["GEM_HOME"]
20
+ out << " RVM #{ENV["rvm_version"]}\n" if ENV["rvm_version"]
21
21
  out << " Git #{git_version}\n"
22
22
  %w(rubygems-bundler open_gem).each do |name|
23
23
  specs = Bundler.rubygems.find_name(name)
24
- out << " #{name} (#{specs.map(&:version).join(',')})\n" unless specs.empty?
24
+ out << " #{name} (#{specs.map(&:version).join(",")})\n" unless specs.empty?
25
25
  end
26
26
 
27
27
  out << "\nBundler settings\n\n" unless Bundler.settings.all.empty?
@@ -33,13 +33,21 @@ module Bundler
33
33
  end
34
34
 
35
35
  if print_gemfile
36
- out << "\nGemfile\n\n"
36
+ out << "\n#{Bundler.default_gemfile.relative_path_from(SharedHelpers.pwd)}\n\n"
37
37
  out << " " << read_file(Bundler.default_gemfile).gsub(/\n/, "\n ") << "\n"
38
38
 
39
- out << "\n" << "Gemfile.lock\n\n"
39
+ out << "\n#{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n"
40
40
  out << " " << read_file(Bundler.default_lockfile).gsub(/\n/, "\n ") << "\n"
41
41
  end
42
42
 
43
+ if print_gemspecs
44
+ dsl = Dsl.new.tap {|d| d.eval_gemfile(Bundler.default_gemfile) }
45
+ dsl.gemspecs.each do |gs|
46
+ out << "\n#{Pathname.new(gs).basename}:"
47
+ out << "\n\n " << read_file(gs).gsub(/\n/, "\n ") << "\n"
48
+ end
49
+ end
50
+
43
51
  out
44
52
  end
45
53
 
@@ -55,7 +63,7 @@ module Bundler
55
63
 
56
64
  def ruby_version
57
65
  str = "#{RUBY_VERSION}"
58
- if RUBY_VERSION < '1.9'
66
+ if RUBY_VERSION < "1.9"
59
67
  str << " (#{RUBY_RELEASE_DATE}"
60
68
  str << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
61
69
  str << ") [#{RUBY_PLATFORM}]\n"
@@ -70,6 +78,5 @@ module Bundler
70
78
  rescue Bundler::Source::Git::GitNotInstalledError
71
79
  "not installed"
72
80
  end
73
-
74
81
  end
75
82
  end
@@ -6,7 +6,7 @@ module Bundler
6
6
  @root = root
7
7
  @definition = definition
8
8
 
9
- env_file = Bundler.app_config_path.join('environment.rb')
9
+ env_file = Bundler.app_config_path.join("environment.rb")
10
10
  env_file.rmtree if env_file.exist?
11
11
  end
12
12
 
@@ -37,6 +37,5 @@ module Bundler
37
37
  def update(*gems)
38
38
  # Nothing
39
39
  end
40
-
41
40
  end
42
41
  end
@@ -0,0 +1,82 @@
1
+ module Bundler
2
+ class BundlerError < StandardError
3
+ def self.status_code(code)
4
+ define_method(:status_code) { code }
5
+ end
6
+ end
7
+
8
+ class GemfileNotFound < BundlerError; status_code(10); end
9
+ class GemNotFound < BundlerError; status_code(7); end
10
+ class GemfileError < BundlerError; status_code(4); end
11
+ class InstallError < BundlerError; status_code(5); end
12
+ class InstallHookError < BundlerError; status_code(8); end
13
+ class PathError < BundlerError; status_code(13); end
14
+ class GitError < BundlerError; status_code(11); end
15
+ class DeprecatedError < BundlerError; status_code(12); end
16
+ class GemspecError < BundlerError; status_code(14); end
17
+ class InvalidOption < BundlerError; status_code(15); end
18
+ class ProductionError < BundlerError; status_code(16); end
19
+ class HTTPError < BundlerError; status_code(17); end
20
+ class RubyVersionMismatch < BundlerError; status_code(18); end
21
+ class SecurityError < BundlerError; status_code(19); end
22
+ class LockfileError < BundlerError; status_code(20); end
23
+ class CyclicDependencyError < BundlerError; status_code(21); end
24
+ class GemfileLockNotFound < BundlerError; status_code(22); end
25
+ class GemfileEvalError < GemfileError; end
26
+ class MarshalError < StandardError; end
27
+
28
+ # Internal errors, should be rescued
29
+ class VersionConflict < BundlerError
30
+ attr_reader :conflicts
31
+
32
+ def initialize(conflicts, msg = nil)
33
+ super(msg)
34
+ @conflicts = conflicts
35
+ end
36
+
37
+ status_code(6)
38
+ end
39
+
40
+ class GemRequireError < BundlerError
41
+ attr_reader :orig_exception
42
+
43
+ def initialize(orig_exception, msg)
44
+ super(msg)
45
+ @orig_exception = orig_exception
46
+ end
47
+
48
+ status_code(24)
49
+ end
50
+
51
+ class PermissionError < BundlerError
52
+ def initialize(path, permission_type = :write)
53
+ @path = path
54
+ @permission_type = permission_type
55
+ end
56
+
57
+ def message
58
+ action = case @permission_type
59
+ when :read then "read from"
60
+ when :write then "write to"
61
+ when :executable, :exec then "execute"
62
+ else @permission_type.to_s
63
+ end
64
+ "There was an error while trying to #{action} `#{@path}`. " \
65
+ "It is likely that you need to grant #{@permission_type} permissions " \
66
+ "for that path."
67
+ end
68
+
69
+ status_code(23)
70
+ end
71
+
72
+ class YamlSyntaxError < BundlerError
73
+ attr_reader :orig_exception
74
+
75
+ def initialize(orig_exception, msg)
76
+ super(msg)
77
+ @orig_exception = orig_exception
78
+ end
79
+
80
+ status_code(25)
81
+ end
82
+ end
@@ -2,18 +2,32 @@ module Bundler
2
2
  class Fetcher
3
3
  class Base
4
4
  attr_reader :downloader
5
- attr_reader :remote_uri
6
- attr_reader :fetch_uri
7
5
  attr_reader :display_uri
6
+ attr_reader :remote
8
7
 
9
- def initialize(downloader, remote_uri, fetch_uri, display_uri)
10
- raise 'Abstract class' if self.class == Base
8
+ def initialize(downloader, remote, display_uri)
9
+ raise "Abstract class" if self.class == Base
11
10
  @downloader = downloader
12
- @remote_uri = remote_uri
13
- @fetch_uri = fetch_uri
11
+ @remote = remote
14
12
  @display_uri = display_uri
15
13
  end
16
14
 
15
+ def remote_uri
16
+ @remote.uri
17
+ end
18
+
19
+ def fetch_uri
20
+ @fetch_uri ||= begin
21
+ if remote_uri.host == "rubygems.org"
22
+ uri = remote_uri.dup
23
+ uri.host = "bundler.rubygems.org"
24
+ uri
25
+ else
26
+ remote_uri
27
+ end
28
+ end
29
+ end
30
+
17
31
  def api_available?
18
32
  api_fetcher?
19
33
  end
@@ -21,7 +35,6 @@ module Bundler
21
35
  def api_fetcher?
22
36
  false
23
37
  end
24
-
25
38
  end
26
39
  end
27
40
  end
@@ -1,4 +1,5 @@
1
- require 'bundler/fetcher/base'
1
+ require "bundler/fetcher/base"
2
+ require "cgi"
2
3
 
3
4
  module Bundler
4
5
  class Fetcher
@@ -27,7 +28,7 @@ module Bundler
27
28
  Bundler.ui.info ".", false
28
29
  end
29
30
 
30
- return {remote_uri => last_spec_list} if query_list.empty?
31
+ return { remote_uri => last_spec_list } if query_list.empty?
31
32
 
32
33
  remote_specs = Bundler::Retry.new("dependency api", AUTH_ERRORS).attempts do
33
34
  dependency_specs(query_list)
@@ -43,7 +44,7 @@ module Bundler
43
44
  end
44
45
 
45
46
  def dependency_specs(gem_names)
46
- Bundler.ui.debug "Query Gemcutter Dependency Endpoint API: #{gem_names.join(',')}"
47
+ Bundler.ui.debug "Query Gemcutter Dependency Endpoint API: #{gem_names.join(",")}"
47
48
  gem_list = []
48
49
  deps_list = []
49
50
 
@@ -67,7 +68,7 @@ module Bundler
67
68
 
68
69
  def dependency_api_uri(gem_names = [])
69
70
  uri = fetch_uri + "api/v1/dependencies"
70
- uri.query = "gems=#{URI.encode(gem_names.join(","))}" if gem_names.any?
71
+ uri.query = "gems=#{CGI.escape(gem_names.join(","))}" if gem_names.any?
71
72
  uri
72
73
  end
73
74
 
@@ -82,7 +83,6 @@ module Bundler
82
83
  "gemspec. \nPlease ask the gem author to yank the bad version to fix " \
83
84
  "this issue. For more information, see http://bit.ly/syck-defaultkey."
84
85
  end
85
-
86
86
  end
87
87
  end
88
88
  end
@@ -55,7 +55,6 @@ module Bundler
55
55
  raise HTTPError, "Network error while fetching #{uri}"
56
56
  end
57
57
  end
58
-
59
58
  end
60
59
  end
61
- end
60
+ end
@@ -1,13 +1,12 @@
1
- require 'bundler/fetcher/base'
1
+ require "bundler/fetcher/base"
2
+ require "rubygems/remote_fetcher"
2
3
 
3
4
  module Bundler
4
5
  class Fetcher
5
6
  class Index < Base
6
7
  def specs(_gem_names)
7
- old_sources = Bundler.rubygems.sources
8
- Bundler.rubygems.sources = [remote_uri.to_s]
9
- Bundler.rubygems.fetch_all_remote_specs
10
- rescue Gem::RemoteFetcher::FetchError, OpenSSL::SSL::SSLError => e
8
+ Bundler.rubygems.fetch_all_remote_specs(remote)
9
+ rescue Gem::RemoteFetcher::FetchError, OpenSSL::SSL::SSLError, Net::HTTPFatalError => e
11
10
  case e.message
12
11
  when /certificate verify failed/
13
12
  raise CertificateFailureError.new(display_uri)
@@ -23,8 +22,6 @@ module Bundler
23
22
  Bundler.ui.trace e
24
23
  raise HTTPError, "Could not fetch specs from #{display_uri}"
25
24
  end
26
- ensure
27
- Bundler.rubygems.sources = old_sources
28
25
  end
29
26
  end
30
27
  end