bundler 2.1.0.pre.3 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -3
  3. data/lib/bundler.rb +0 -1
  4. data/lib/bundler/build_metadata.rb +2 -2
  5. data/lib/bundler/cli.rb +1 -1
  6. data/lib/bundler/cli/config.rb +1 -1
  7. data/lib/bundler/cli/exec.rb +12 -3
  8. data/lib/bundler/cli/update.rb +1 -1
  9. data/lib/bundler/feature_flag.rb +1 -1
  10. data/lib/bundler/fetcher.rb +2 -2
  11. data/lib/bundler/fetcher/downloader.rb +1 -1
  12. data/lib/bundler/fetcher/index.rb +1 -1
  13. data/lib/bundler/friendly_errors.rb +1 -1
  14. data/lib/bundler/gem_helper.rb +12 -10
  15. data/lib/bundler/inline.rb +36 -31
  16. data/lib/bundler/lazy_specification.rb +0 -1
  17. data/lib/bundler/mirror.rb +3 -3
  18. data/lib/bundler/plugin/api/source.rb +2 -4
  19. data/lib/bundler/remote_specification.rb +0 -2
  20. data/lib/bundler/rubygems_integration.rb +5 -13
  21. data/lib/bundler/settings.rb +7 -4
  22. data/lib/bundler/source/git.rb +5 -5
  23. data/lib/bundler/source/git/git_proxy.rb +3 -2
  24. data/lib/bundler/source/rubygems.rb +3 -3
  25. data/lib/bundler/source/rubygems/remote.rb +1 -1
  26. data/lib/bundler/uri_credentials_filter.rb +7 -3
  27. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +3 -3
  28. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +26 -26
  29. data/lib/bundler/vendor/thor/lib/thor.rb +7 -0
  30. data/lib/bundler/vendor/thor/lib/thor/actions.rb +10 -6
  31. data/lib/bundler/vendor/thor/lib/thor/base.rb +29 -19
  32. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  33. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +1 -1
  34. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +13 -2
  35. data/lib/bundler/vendor/thor/lib/thor/runner.rb +8 -9
  36. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -1
  37. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +2 -2
  38. data/lib/bundler/vendor/thor/lib/thor/util.rb +17 -1
  39. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  40. data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  41. data/lib/bundler/vendor/uri/lib/uri/common.rb +744 -0
  42. data/lib/bundler/vendor/uri/lib/uri/file.rb +94 -0
  43. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  44. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1568 -0
  45. data/lib/bundler/vendor/uri/lib/uri/http.rb +88 -0
  46. data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  47. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  48. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +21 -0
  49. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +294 -0
  50. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  51. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +125 -0
  52. data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  53. data/lib/bundler/vendored_uri.rb +4 -0
  54. data/lib/bundler/version.rb +1 -1
  55. data/man/bundle-add.1 +1 -1
  56. data/man/bundle-add.1.txt +1 -1
  57. data/man/bundle-binstubs.1 +1 -1
  58. data/man/bundle-binstubs.1.txt +1 -1
  59. data/man/bundle-cache.1 +1 -1
  60. data/man/bundle-cache.1.txt +1 -1
  61. data/man/bundle-check.1 +1 -1
  62. data/man/bundle-check.1.txt +1 -1
  63. data/man/bundle-clean.1 +1 -1
  64. data/man/bundle-clean.1.txt +1 -1
  65. data/man/bundle-config.1 +1 -1
  66. data/man/bundle-config.1.txt +1 -1
  67. data/man/bundle-doctor.1 +1 -1
  68. data/man/bundle-doctor.1.txt +1 -1
  69. data/man/bundle-exec.1 +1 -1
  70. data/man/bundle-exec.1.txt +1 -1
  71. data/man/bundle-gem.1 +1 -1
  72. data/man/bundle-gem.1.txt +1 -1
  73. data/man/bundle-info.1 +1 -1
  74. data/man/bundle-info.1.txt +1 -1
  75. data/man/bundle-init.1 +1 -1
  76. data/man/bundle-init.1.txt +1 -1
  77. data/man/bundle-inject.1 +1 -1
  78. data/man/bundle-inject.1.txt +1 -1
  79. data/man/bundle-install.1 +1 -1
  80. data/man/bundle-install.1.txt +1 -1
  81. data/man/bundle-list.1 +1 -1
  82. data/man/bundle-list.1.txt +1 -1
  83. data/man/bundle-lock.1 +1 -1
  84. data/man/bundle-lock.1.txt +1 -1
  85. data/man/bundle-open.1 +1 -1
  86. data/man/bundle-open.1.txt +1 -1
  87. data/man/bundle-outdated.1 +1 -1
  88. data/man/bundle-outdated.1.txt +1 -1
  89. data/man/bundle-platform.1 +1 -1
  90. data/man/bundle-platform.1.txt +1 -1
  91. data/man/bundle-pristine.1 +1 -1
  92. data/man/bundle-pristine.1.txt +1 -1
  93. data/man/bundle-remove.1 +1 -1
  94. data/man/bundle-remove.1.txt +1 -1
  95. data/man/bundle-show.1 +1 -1
  96. data/man/bundle-show.1.txt +1 -1
  97. data/man/bundle-update.1 +1 -1
  98. data/man/bundle-update.1.txt +1 -1
  99. data/man/bundle-viz.1 +1 -1
  100. data/man/bundle-viz.1.txt +1 -1
  101. data/man/bundle.1 +1 -1
  102. data/man/bundle.1.txt +1 -1
  103. data/man/gemfile.5 +1 -1
  104. data/man/gemfile.5.txt +1 -1
  105. metadata +17 -5
  106. data/lib/bundler/gem_remote_fetcher.rb +0 -43
  107. data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +0 -5
  108. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -12
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "uri"
4
-
5
3
  module Bundler
6
4
  class Settings
7
5
  autoload :Mirror, File.expand_path("mirror", __dir__)
@@ -152,7 +150,11 @@ module Bundler
152
150
  end
153
151
 
154
152
  def mirror_for(uri)
155
- uri = URI(uri.to_s) unless uri.is_a?(URI)
153
+ if uri.is_a?(String)
154
+ require_relative "vendored_uri"
155
+ uri = Bundler::URI(uri)
156
+ end
157
+
156
158
  gem_mirrors.for(uri.to_s).uri
157
159
  end
158
160
 
@@ -421,7 +423,8 @@ module Bundler
421
423
  suffix = $3
422
424
  end
423
425
  uri = "#{uri}/" unless uri.end_with?("/")
424
- uri = URI(uri)
426
+ require_relative "vendored_uri"
427
+ uri = Bundler::URI(uri)
425
428
  unless uri.absolute?
426
429
  raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
427
430
  end
@@ -1,14 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../vendored_fileutils"
4
- require "uri"
5
4
 
6
5
  module Bundler
7
6
  class Source
8
7
  class Git < Path
9
8
  autoload :GitProxy, File.expand_path("git/git_proxy", __dir__)
10
9
 
11
- attr_reader :uri, :ref, :branch, :options, :submodules
10
+ attr_reader :uri, :ref, :branch, :options, :glob, :submodules
12
11
 
13
12
  def initialize(options)
14
13
  @options = options
@@ -48,13 +47,14 @@ module Bundler
48
47
  end
49
48
 
50
49
  def hash
51
- [self.class, uri, ref, branch, name, version, submodules].hash
50
+ [self.class, uri, ref, branch, name, version, glob, submodules].hash
52
51
  end
53
52
 
54
53
  def eql?(other)
55
54
  other.is_a?(Git) && uri == other.uri && ref == other.ref &&
56
55
  branch == other.branch && name == other.name &&
57
- version == other.version && submodules == other.submodules
56
+ version == other.version && glob == other.glob &&
57
+ submodules == other.submodules
58
58
  end
59
59
 
60
60
  alias_method :==, :eql?
@@ -284,7 +284,7 @@ module Bundler
284
284
  if uri =~ %r{^\w+://(\w+@)?}
285
285
  # Downcase the domain component of the URI
286
286
  # and strip off a trailing slash, if one is present
287
- input = URI.parse(uri).normalize.to_s.sub(%r{/$}, "")
287
+ input = Bundler::URI.parse(uri).normalize.to_s.sub(%r{/$}, "")
288
288
  else
289
289
  # If there is no URI scheme, assume it is an ssh/git URI
290
290
  input = uri
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "open3"
4
3
  require "shellwords"
5
4
 
6
5
  module Bundler
@@ -218,7 +217,7 @@ module Bundler
218
217
  # Adds credentials to the URI as Fetcher#configured_uri_for does
219
218
  def configured_uri_for(uri)
220
219
  if /https?:/ =~ uri
221
- remote = URI(uri)
220
+ remote = Bundler::URI(uri)
222
221
  config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
223
222
  remote.userinfo ||= config_auth
224
223
  remote.to_s
@@ -243,12 +242,14 @@ module Bundler
243
242
  end
244
243
 
245
244
  def capture_and_filter_stderr(uri, cmd)
245
+ require "open3"
246
246
  return_value, captured_err, status = Open3.capture3(cmd)
247
247
  Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
248
248
  [return_value, status]
249
249
  end
250
250
 
251
251
  def capture_and_ignore_stderr(cmd)
252
+ require "open3"
252
253
  return_value, _, status = Open3.capture3(cmd)
253
254
  [return_value, status]
254
255
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "uri"
4
3
  require "rubygems/user_interaction"
5
4
 
6
5
  module Bundler
@@ -328,9 +327,10 @@ module Bundler
328
327
  def normalize_uri(uri)
329
328
  uri = uri.to_s
330
329
  uri = "#{uri}/" unless uri =~ %r{/$}
331
- uri = URI(uri)
330
+ require_relative "../vendored_uri"
331
+ uri = Bundler::URI(uri)
332
332
  raise ArgumentError, "The source must be an absolute URI. For example:\n" \
333
- "source 'https://rubygems.org'" if !uri.absolute? || (uri.is_a?(URI::HTTP) && uri.host.nil?)
333
+ "source 'https://rubygems.org'" if !uri.absolute? || (uri.is_a?(Bundler::URI::HTTP) && uri.host.nil?)
334
334
  uri
335
335
  end
336
336
 
@@ -48,7 +48,7 @@ module Bundler
48
48
  end
49
49
 
50
50
  uri
51
- rescue URI::InvalidComponentError
51
+ rescue Bundler::URI::InvalidComponentError
52
52
  error_message = "Please CGI escape your usernames and passwords before " \
53
53
  "setting them for authentication."
54
54
  raise HTTPError.new(error_message)
@@ -7,7 +7,11 @@ module Bundler
7
7
  def credential_filtered_uri(uri_to_anonymize)
8
8
  return uri_to_anonymize if uri_to_anonymize.nil?
9
9
  uri = uri_to_anonymize.dup
10
- uri = URI(uri.to_s) unless uri.is_a?(URI)
10
+ if uri.is_a?(String)
11
+ require_relative "vendored_uri"
12
+ uri = Bundler::URI(uri)
13
+ end
14
+
11
15
  if uri.userinfo
12
16
  # oauth authentication
13
17
  if uri.password == "x-oauth-basic" || uri.password == "x"
@@ -17,9 +21,9 @@ module Bundler
17
21
  end
18
22
  uri.password = nil
19
23
  end
20
- return uri if uri_to_anonymize.is_a?(URI)
21
24
  return uri.to_s if uri_to_anonymize.is_a?(String)
22
- rescue URI::InvalidURIError # uri is not canonical uri scheme
25
+ uri
26
+ rescue Bundler::URI::InvalidURIError # uri is not canonical uri scheme
23
27
  uri
24
28
  end
25
29
 
@@ -6,8 +6,6 @@ rescue LoadError
6
6
  # for make mjit-headers
7
7
  end
8
8
 
9
- require_relative "fileutils/version"
10
-
11
9
  #
12
10
  # = fileutils.rb
13
11
  #
@@ -104,6 +102,7 @@ require_relative "fileutils/version"
104
102
  # <tt>:verbose</tt> flags to methods in Bundler::FileUtils.
105
103
  #
106
104
  module Bundler::FileUtils
105
+ VERSION = "1.4.1"
107
106
 
108
107
  def self.private_module_function(name) #:nodoc:
109
108
  module_function name
@@ -1300,7 +1299,8 @@ module Bundler::FileUtils
1300
1299
  .reject {|n| n == '.' or n == '..' }
1301
1300
  end
1302
1301
 
1303
- files.map {|n| Entry_.new(prefix(), join(rel(), n.tap{|x| x.untaint if RUBY_VERSION < "2.7" })) }
1302
+ untaint = RUBY_VERSION < '2.7'
1303
+ files.map {|n| Entry_.new(prefix(), join(rel(), untaint ? n.untaint : n)) }
1304
1304
  end
1305
1305
 
1306
1306
  def stat
@@ -1,5 +1,5 @@
1
1
  require 'net/http'
2
- require 'uri'
2
+ require_relative '../../../../uri/lib/uri'
3
3
  require 'cgi' # for escaping
4
4
  require_relative '../../../../connection_pool/lib/connection_pool'
5
5
 
@@ -31,7 +31,7 @@ autoload :OpenSSL, 'openssl'
31
31
  #
32
32
  # require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
33
33
  #
34
- # uri = URI 'http://example.com/awesome/web/service'
34
+ # uri = Bundler::URI 'http://example.com/awesome/web/service'
35
35
  #
36
36
  # http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
37
37
  #
@@ -48,17 +48,17 @@ autoload :OpenSSL, 'openssl'
48
48
  # post = Net::HTTP::Post.new post_uri.path
49
49
  # post.set_form_data 'some' => 'cool data'
50
50
  #
51
- # # perform the POST, the URI is always required
51
+ # # perform the POST, the Bundler::URI is always required
52
52
  # response http.request post_uri, post
53
53
  #
54
54
  # Note that for GET, HEAD and other requests that do not have a body you want
55
- # to use URI#request_uri not URI#path. The request_uri contains the query
55
+ # to use Bundler::URI#request_uri not Bundler::URI#path. The request_uri contains the query
56
56
  # params which are sent in the body for other requests.
57
57
  #
58
58
  # == SSL
59
59
  #
60
60
  # SSL connections are automatically created depending upon the scheme of the
61
- # URI. SSL connections are automatically verified against the default
61
+ # Bundler::URI. SSL connections are automatically verified against the default
62
62
  # certificate store for your computer. You can override this by changing
63
63
  # verify_mode or by specifying an alternate cert_store.
64
64
  #
@@ -81,7 +81,7 @@ autoload :OpenSSL, 'openssl'
81
81
  # == Proxies
82
82
  #
83
83
  # A proxy can be set through #proxy= or at initialization time by providing a
84
- # second argument to ::new. The proxy may be the URI of the proxy server or
84
+ # second argument to ::new. The proxy may be the Bundler::URI of the proxy server or
85
85
  # <code>:ENV</code> which will consult environment variables.
86
86
  #
87
87
  # See #proxy= and #proxy_from_env for details.
@@ -150,7 +150,7 @@ autoload :OpenSSL, 'openssl'
150
150
  #
151
151
  # require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
152
152
  #
153
- # uri = URI 'http://example.com/awesome/web/service'
153
+ # uri = Bundler::URI 'http://example.com/awesome/web/service'
154
154
  # post_uri = uri + 'create'
155
155
  #
156
156
  # http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
@@ -249,7 +249,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
249
249
  # NOTE: This may not work on ruby > 1.9.
250
250
 
251
251
  def self.detect_idle_timeout uri, max = 10
252
- uri = URI uri unless URI::Generic === uri
252
+ uri = Bundler::URI uri unless Bundler::URI::Generic === uri
253
253
  uri += '/'
254
254
 
255
255
  req = Net::HTTP::Head.new uri.request_uri
@@ -513,13 +513,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
513
513
  # required currently, but highly recommended. Your library name should be
514
514
  # good enough. This parameter will be required in a future version.
515
515
  #
516
- # +proxy+ may be set to a URI::HTTP or :ENV to pick up proxy options from
516
+ # +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
517
517
  # the environment. See proxy_from_env for details.
518
518
  #
519
- # In order to use a URI for the proxy you may need to do some extra work
520
- # beyond URI parsing if the proxy requires a password:
519
+ # In order to use a Bundler::URI for the proxy you may need to do some extra work
520
+ # beyond Bundler::URI parsing if the proxy requires a password:
521
521
  #
522
- # proxy = URI 'http://proxy.example'
522
+ # proxy = Bundler::URI 'http://proxy.example'
523
523
  # proxy.user = 'AzureDiamond'
524
524
  # proxy.password = 'hunter2'
525
525
  #
@@ -566,7 +566,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
566
566
  @verify_mode = nil
567
567
  @cert_store = nil
568
568
 
569
- @generation = 0 # incremented when proxy URI changes
569
+ @generation = 0 # incremented when proxy Bundler::URI changes
570
570
 
571
571
  if HAVE_OPENSSL then
572
572
  @verify_mode = OpenSSL::SSL::VERIFY_PEER
@@ -688,14 +688,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
688
688
  end
689
689
 
690
690
  ##
691
- # URI::escape wrapper
691
+ # Bundler::URI::escape wrapper
692
692
 
693
693
  def escape str
694
694
  CGI.escape str if str
695
695
  end
696
696
 
697
697
  ##
698
- # URI::unescape wrapper
698
+ # Bundler::URI::unescape wrapper
699
699
 
700
700
  def unescape str
701
701
  CGI.unescape str if str
@@ -803,12 +803,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
803
803
  alias key= private_key=
804
804
 
805
805
  ##
806
- # Sets the proxy server. The +proxy+ may be the URI of the proxy server,
806
+ # Sets the proxy server. The +proxy+ may be the Bundler::URI of the proxy server,
807
807
  # the symbol +:ENV+ which will read the proxy from the environment or nil to
808
808
  # disable use of a proxy. See #proxy_from_env for details on setting the
809
809
  # proxy from the environment.
810
810
  #
811
- # If the proxy URI is set after requests have been made, the next request
811
+ # If the proxy Bundler::URI is set after requests have been made, the next request
812
812
  # will shut-down and re-open all connections.
813
813
  #
814
814
  # The +no_proxy+ query parameter can be used to specify hosts which shouldn't
@@ -819,9 +819,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
819
819
  def proxy= proxy
820
820
  @proxy_uri = case proxy
821
821
  when :ENV then proxy_from_env
822
- when URI::HTTP then proxy
822
+ when Bundler::URI::HTTP then proxy
823
823
  when nil then # ignore
824
- else raise ArgumentError, 'proxy must be :ENV or a URI::HTTP'
824
+ else raise ArgumentError, 'proxy must be :ENV or a Bundler::URI::HTTP'
825
825
  end
826
826
 
827
827
  @no_proxy.clear
@@ -846,13 +846,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
846
846
  end
847
847
 
848
848
  ##
849
- # Creates a URI for an HTTP proxy server from ENV variables.
849
+ # Creates a Bundler::URI for an HTTP proxy server from ENV variables.
850
850
  #
851
851
  # If +HTTP_PROXY+ is set a proxy will be returned.
852
852
  #
853
- # If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the URI is given the
853
+ # If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the Bundler::URI is given the
854
854
  # indicated user and password unless HTTP_PROXY contains either of these in
855
- # the URI.
855
+ # the Bundler::URI.
856
856
  #
857
857
  # The +NO_PROXY+ ENV variable can be used to specify hosts which shouldn't
858
858
  # be reached via proxy; if set it should be a comma separated list of
@@ -868,7 +868,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
868
868
 
869
869
  return nil if env_proxy.nil? or env_proxy.empty?
870
870
 
871
- uri = URI normalize_uri env_proxy
871
+ uri = Bundler::URI normalize_uri env_proxy
872
872
 
873
873
  env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
874
874
 
@@ -951,7 +951,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
951
951
  retried = false
952
952
  bad_response = false
953
953
 
954
- uri = URI uri
954
+ uri = Bundler::URI uri
955
955
  req = request_setup req || uri
956
956
  response = nil
957
957
 
@@ -1024,13 +1024,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
1024
1024
  end
1025
1025
 
1026
1026
  ##
1027
- # Creates a GET request if +req_or_uri+ is a URI and adds headers to the
1027
+ # Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
1028
1028
  # request.
1029
1029
  #
1030
1030
  # Returns the request.
1031
1031
 
1032
1032
  def request_setup req_or_uri # :nodoc:
1033
- req = if URI === req_or_uri then
1033
+ req = if Bundler::URI === req_or_uri then
1034
1034
  Net::HTTP::Get.new req_or_uri.request_uri
1035
1035
  else
1036
1036
  req_or_uri
@@ -344,6 +344,13 @@ class Bundler::Thor
344
344
  command && disable_required_check.include?(command.name.to_sym)
345
345
  end
346
346
 
347
+ def deprecation_warning(message) #:nodoc:
348
+ unless ENV['THOR_SILENCE_DEPRECATION']
349
+ warn "Deprecation warning: #{message}\n" +
350
+ 'You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.'
351
+ end
352
+ end
353
+
347
354
  protected
348
355
 
349
356
  def stop_on_unknown_option #:nodoc:
@@ -1,5 +1,3 @@
1
- require "uri"
2
- require_relative "core_ext/io_binary_read"
3
1
  require_relative "actions/create_file"
4
2
  require_relative "actions/create_link"
5
3
  require_relative "actions/directory"
@@ -258,13 +256,19 @@ class Bundler::Thor
258
256
 
259
257
  return if options[:pretend]
260
258
 
261
- result = config[:capture] ? `#{command}` : system(command.to_s)
259
+ env_splat = [config[:env]] if config[:env]
262
260
 
263
- if config[:abort_on_failure]
264
- success = config[:capture] ? $?.success? : result
265
- abort unless success
261
+ if config[:capture]
262
+ require "open3"
263
+ result, status = Open3.capture2e(*env_splat, command.to_s)
264
+ success = status.success?
265
+ else
266
+ result = system(*env_splat, command.to_s)
267
+ success = result
266
268
  end
267
269
 
270
+ abort if !success && config.fetch(:abort_on_failure, self.class.exit_on_failure?)
271
+
268
272
  result
269
273
  end
270
274
 
@@ -2,6 +2,7 @@ require_relative "command"
2
2
  require_relative "core_ext/hash_with_indifferent_access"
3
3
  require_relative "error"
4
4
  require_relative "invocation"
5
+ require_relative "nested_context"
5
6
  require_relative "parser"
6
7
  require_relative "shell"
7
8
  require_relative "line_editor"
@@ -153,17 +154,20 @@ class Bundler::Thor
153
154
 
154
155
  # If you want to raise an error when the default value of an option does not match
155
156
  # the type call check_default_type!
156
- # This is disabled by default for compatibility.
157
+ # This will be the default; for compatibility a deprecation warning is issued if necessary.
157
158
  def check_default_type!
158
159
  @check_default_type = true
159
160
  end
160
161
 
161
- def check_default_type #:nodoc:
162
- @check_default_type ||= from_superclass(:check_default_type, false)
162
+ # If you want to use defaults that don't match the type of an option,
163
+ # either specify `check_default_type: false` or call `allow_incompatible_default_type!`
164
+ def allow_incompatible_default_type!
165
+ @check_default_type = false
163
166
  end
164
167
 
165
- def check_default_type? #:nodoc:
166
- !!check_default_type
168
+ def check_default_type #:nodoc:
169
+ @check_default_type = from_superclass(:check_default_type, nil) unless defined?(@check_default_type)
170
+ @check_default_type
167
171
  end
168
172
 
169
173
  # If true, option parsing is suspended as soon as an unknown option or a
@@ -415,14 +419,20 @@ class Bundler::Thor
415
419
  # remove_command :this_is_not_a_command
416
420
  # end
417
421
  #
418
- def no_commands
419
- @no_commands = true
420
- yield
421
- ensure
422
- @no_commands = false
422
+ def no_commands(&block)
423
+ no_commands_context.enter(&block)
423
424
  end
425
+
424
426
  alias_method :no_tasks, :no_commands
425
427
 
428
+ def no_commands_context
429
+ @no_commands_context ||= NestedContext.new
430
+ end
431
+
432
+ def no_commands?
433
+ no_commands_context.entered?
434
+ end
435
+
426
436
  # Sets the namespace for the Bundler::Thor or Bundler::Thor::Group class. By default the
427
437
  # namespace is retrieved from the class name. If your Bundler::Thor class is named
428
438
  # Scripts::MyScript, the help method, for example, will be called as:
@@ -506,6 +516,12 @@ class Bundler::Thor
506
516
  raise InvocationError, msg
507
517
  end
508
518
 
519
+ # A flag that makes the process exit with status 1 if any error happens.
520
+ def exit_on_failure?
521
+ Bundler::Thor.deprecation_warning "Bundler::Thor exit with status 0 on errors. To keep this behavior, you must define `exit_on_failure?` in `#{self.name}`"
522
+ false
523
+ end
524
+
509
525
  protected
510
526
 
511
527
  # Prints the class options per group. If an option does not belong to
@@ -563,7 +579,7 @@ class Bundler::Thor
563
579
  # options<Hash>:: Described in both class_option and method_option.
564
580
  # scope<Hash>:: Options hash that is being built up
565
581
  def build_option(name, options, scope) #:nodoc:
566
- scope[name] = Bundler::Thor::Option.new(name, options.merge(:check_default_type => check_default_type?))
582
+ scope[name] = Bundler::Thor::Option.new(name, {:check_default_type => check_default_type}.merge!(options))
567
583
  end
568
584
 
569
585
  # Receives a hash of options, parse them and add to the scope. This is a
@@ -598,7 +614,7 @@ class Bundler::Thor
598
614
  def inherited(klass)
599
615
  super(klass)
600
616
  Bundler::Thor::Base.register_klass_file(klass)
601
- klass.instance_variable_set(:@no_commands, false)
617
+ klass.instance_variable_set(:@no_commands, 0)
602
618
  end
603
619
 
604
620
  # Fire this callback whenever a method is added. Added methods are
@@ -615,8 +631,7 @@ class Bundler::Thor
615
631
  # Return if it's not a public instance method
616
632
  return unless public_method_defined?(meth.to_sym)
617
633
 
618
- @no_commands ||= false
619
- return if @no_commands || !create_command(meth)
634
+ return if no_commands? || !create_command(meth)
620
635
 
621
636
  is_thor_reserved_word?(meth, :command)
622
637
  Bundler::Thor::Base.register_klass_file(self)
@@ -643,11 +658,6 @@ class Bundler::Thor
643
658
  end
644
659
  end
645
660
 
646
- # A flag that makes the process exit with status 1 if any error happens.
647
- def exit_on_failure?
648
- false
649
- end
650
-
651
661
  #
652
662
  # The basename of the program invoking the thor class.
653
663
  #