From 715757ee53513c4c51ac0b3bff5b5e044cd2e9aa Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Mon, 9 Sep 2019 11:42:18 +0000 Subject: [PATCH 01/31] Merge #7342 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7342: Start using automatiek 0.3.0 r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that I added a feature to automatiek to vendor subdependencies, but we were not using it because it had not yet been released. ### What is your fix for the problem, implemented in this PR? My fix is to start using the feature now that it has been released. ### Why did you choose this fix out of the possible options? I chose this fix because it allows us to manage the `net-http-persistent` dependency in an easier way. Co-authored-by: David Rodríguez (cherry picked from commit 48cb4eca964dc05b68f1c8fa2d83838da21ca182) --- Rakefile | 28 +++++++++------------------- spec/support/rubygems_ext.rb | 2 +- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/Rakefile b/Rakefile index 4b16794a10b..5fe293a8633 100644 --- a/Rakefile +++ b/Rakefile @@ -222,9 +222,6 @@ rescue Gem::LoadError => e desc "Vendor a specific version of net-http-persistent" task(:"net-http-persistent") { abort msg } - - desc "Vendor a specific version of connection_pool" - task(:connection_pool) { abort msg } end else desc "Vendor a specific version of molinillo" @@ -254,15 +251,8 @@ else lib.vendor_lib = "lib/bundler/vendor/fileutils" end - # Currently `net-http-persistent` and it's dependency `connection_pool` are - # vendored separately, but `connection_pool` references inside the vendored - # copy of `net-http-persistent` are not properly updated to refer to the - # vendored copy of `connection_pool`, so they need to be manually updated. - # This will be automated once https://github.com/segiddins/automatiek/pull/3 - # is included in `automatiek` and we start using the new API for vendoring - # subdependencies. - # Besides that, we currently cherry-pick changes to use `require_relative` - # internally instead of regular `require`. They are pending review at + # We currently cherry-pick changes to use `require_relative` internally + # instead of regular `require`. They are pending review at # https://github.com/drbrain/net-http-persistent/pull/106 desc "Vendor a specific version of net-http-persistent" Automatiek::RakeTask.new("net-http-persistent") do |lib| @@ -270,14 +260,14 @@ else lib.namespace = "Net::HTTP::Persistent" lib.prefix = "Bundler::Persistent" lib.vendor_lib = "lib/bundler/vendor/net-http-persistent" - end - desc "Vendor a specific version of connection_pool" - Automatiek::RakeTask.new("connection_pool") do |lib| - lib.download = { :github => "https://github.com/mperham/connection_pool" } - lib.namespace = "ConnectionPool" - lib.prefix = "Bundler" - lib.vendor_lib = "lib/bundler/vendor/connection_pool" + lib.dependency("connection_pool") do |sublib| + sublib.version = "v2.2.2" + sublib.download = { :github => "https://github.com/mperham/connection_pool" } + sublib.namespace = "ConnectionPool" + sublib.prefix = "Bundler" + sublib.vendor_lib = "lib/bundler/vendor/connection_pool" + end end end diff --git a/spec/support/rubygems_ext.rb b/spec/support/rubygems_ext.rb index d237897b676..1d41807cc89 100644 --- a/spec/support/rubygems_ext.rb +++ b/spec/support/rubygems_ext.rb @@ -5,7 +5,7 @@ module Spec module Rubygems DEV_DEPS = { - "automatiek" => "~> 0.2.0", + "automatiek" => "~> 0.3.0", "parallel_tests" => "~> 2.29", "rake" => "~> 12.0", "ronn" => "~> 0.7.3", From daff1cc98cc1dbd39063b71f1636c863c4f8dcb5 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Tue, 12 Nov 2019 14:04:06 +0000 Subject: [PATCH 02/31] Merge #7422 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7422: Turn on warning mode for specs r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that we're missing verbose warnings like the one fixed by #7417. ### What was your diagnosis of the problem? My diagnosis was that our specs should let us know about this. ### What is your fix for the problem, implemented in this PR? My fix is to enable warnings from our helpers that shell out, and fix the warnings they print. There's also some unrelated changes here that I'll try to split out once I get this green. ### Why did you choose this fix out of the possible options? I chose this fix because it makes it so that our specs help us catching these warnings earlier. Co-authored-by: David Rodríguez (cherry picked from commit 4244534ee9acb6e345fb9066df568f50419ef8f7) --- spec/runtime/inline_spec.rb | 5 ++--- spec/runtime/setup_spec.rb | 2 ++ spec/support/helpers.rb | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/spec/runtime/inline_spec.rb b/spec/runtime/inline_spec.rb index 06be2ef83d5..afb9c3d180c 100644 --- a/spec/runtime/inline_spec.rb +++ b/spec/runtime/inline_spec.rb @@ -5,7 +5,7 @@ def script(code, options = {}) requires = ["#{lib_dir}/bundler/inline"] requires.unshift "#{spec_dir}/support/artifice/" + options.delete(:artifice) if options.key?(:artifice) requires = requires.map {|r| "require '#{r}'" }.join("\n") - @out = ruby("#{requires}\n\n" + code, options) + ruby("#{requires}\n\n" + code, options) end before :each do @@ -88,9 +88,8 @@ def script(code, options = {}) RUBY expect(out).to include("Installing activesupport") - err.gsub! %r{(.*lib/sinatra/base\.rb:\d+: warning: constant ::Fixnum is deprecated$)}, "" err_lines = err.split("\n") - err_lines.reject!{|line| line =~ /\.rb:\d+: warning: / } + err_lines.reject!{|line| line =~ /\.rb:\d+: warning: / } unless RUBY_VERSION < "2.7" expect(err_lines).to be_empty expect(exitstatus).to be_zero if exitstatus end diff --git a/spec/runtime/setup_spec.rb b/spec/runtime/setup_spec.rb index 4a754945b75..d86d1320eab 100644 --- a/spec/runtime/setup_spec.rb +++ b/spec/runtime/setup_spec.rb @@ -1027,6 +1027,8 @@ def clean_load_path(lp) ruby <<-RUBY require '#{lib_dir}/bundler' + bundler_module = class << Bundler; self; end + bundler_module.send(:remove_method, :require) def Bundler.require(path) raise "LOSE" end diff --git a/spec/support/helpers.rb b/spec/support/helpers.rb index 911f734d8b4..d085b769d73 100644 --- a/spec/support/helpers.rb +++ b/spec/support/helpers.rb @@ -174,7 +174,7 @@ def ruby(ruby, options = {}) env = options.delete(:env) || {} ruby = ruby.gsub(/["`\$]/) {|m| "\\#{m}" } lib_option = options[:no_lib] ? "" : " -I#{lib_dir}" - sys_exec(%(#{Gem.ruby}#{lib_option} -e "#{ruby}"), env) + sys_exec(%(#{Gem.ruby}#{lib_option} -w -e "#{ruby}"), env) end bang :ruby From d8db313c98b7d3733b9ac5764fdad0eed5d0c08e Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Tue, 12 Nov 2019 18:25:06 +0000 Subject: [PATCH 03/31] Merge #7439 7439: Fix typo's in Changelog r=deivid-rodriguez a=p8 ### What was the end-user problem that led to this PR? The problems were typos in the Changelog ### What is your fix for the problem, implemented in this PR? Fix the typos Co-authored-by: Petrik de Heus (cherry picked from commit f6045fcf93cd3076cdd3d5e15622927c87df2db5) --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a366fdd7917..24e2daa913b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,13 +20,13 @@ Bugfixes: Bugfixes: - Fix `bundle clean` trying to delete non-existent directory ([#7340](https://github.com/bundler/bundler/pull/7340)) - - Fix warnings about keywork argument separation on ruby 2.7 ([#7337](https://github.com/bundler/bundler/pull/7337)) + - Fix warnings about keyword argument separation on ruby 2.7 ([#7337](https://github.com/bundler/bundler/pull/7337)) ## 2.1.0.pre.1 (August 28, 2019) One of the biggest changes in bundler 2.1.0 is that deprecations for upcoming breaking changes in bundler 3 will be turned on by default. We do this to grab -feedback and comunicate early to our users the kind of changes we're intending +feedback and communicate early to our users the kind of changes we're intending to ship with bundler 3. See [#6965](https://github.com/bundler/bundler/pull/6965). @@ -89,7 +89,7 @@ Bugfixes: - Warn about situations where multiple gems provide the same executable ([#7075](https://github.com/bundler/bundler/pull/7075)) - Ignore `frozen` setting in inline mode ([#7125](https://github.com/bundler/bundler/pull/7125)) - Fix incorrect "bundler attempted to update GEM but version stayed the same" message when updating git sourced gems ([#6325](https://github.com/bundler/bundler/pull/6325)) - - Don't check for existance of a writable home directory if `BUNDLE_USER_HOME` is set ([#6885](https://github.com/bundler/bundler/pull/6885)) + - Don't check for existence of a writable home directory if `BUNDLE_USER_HOME` is set ([#6885](https://github.com/bundler/bundler/pull/6885)) - Fix error message when server would respond to a bad username/password requiest with a 401 ([#6928](https://github.com/bundler/bundler/pull/6928)) - Fix `bundle outdated` pluralization when multiple groups are requested ([#7063](https://github.com/bundler/bundler/pull/7063)) - Fix `bundle install` not updating conservatively when gemspec is changed ([#7143](https://github.com/bundler/bundler/pull/7143)) From fabf317e41c5998dca4ebf475101cd3eec177e5f Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Thu, 21 Nov 2019 11:25:57 +0000 Subject: [PATCH 04/31] Merge #7442 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7442: Fix `bundle exec`'ing to rubygems being silent r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that #7401 caused a regression where `bundle exec`'ing to rubygems would silence rubygems output. ### What was your diagnosis of the problem? My diagnosis was that the removal of: * Code where `Bundler::RGProxy` would be only set conditionally on `Bundler.ui =` not being passed `nil`. * Code setting `Bundler.ui` to `nil` right before shelling during `bundle exec`. caused rubygems UI to be silent during `bundle exec gem`. ### What is your fix for the problem, implemented in this PR? My fix is to explictly "unsilence" rubygems UI before `bundle exec` calls. ### Why did you choose this fix out of the possible options? I chose this fix because it's more explicit than the previous one. Fixes #7441. Co-authored-by: David Rodríguez (cherry picked from commit a11c104c5b6222c018248b585cca2a4f340a9a71) --- lib/bundler/cli/exec.rb | 15 ++++++++++++--- spec/commands/exec_spec.rb | 6 ++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/bundler/cli/exec.rb b/lib/bundler/cli/exec.rb index 0a1edbdbbdf..2bace6e77df 100644 --- a/lib/bundler/cli/exec.rb +++ b/lib/bundler/cli/exec.rb @@ -25,12 +25,12 @@ def run SharedHelpers.set_bundle_environment if bin_path = Bundler.which(cmd) if !Bundler.settings[:disable_exec_load] && ruby_shebang?(bin_path) - return kernel_load(bin_path, *args) + return with_verbose_rubygems { kernel_load(bin_path, *args) } end - kernel_exec(bin_path, *args) + with_verbose_rubygems { kernel_exec(bin_path, *args) } else # exec using the given command - kernel_exec(cmd, *args) + with_verbose_rubygems { kernel_exec(cmd, *args) } end end @@ -89,5 +89,14 @@ def ruby_shebang?(file) first_line = File.open(file, "rb") {|f| f.read(possibilities.map(&:size).max) } possibilities.any? {|shebang| first_line.start_with?(shebang) } end + + def with_verbose_rubygems + old_ui = Gem::DefaultUserInteraction.ui + Gem::DefaultUserInteraction.ui = nil + + yield + ensure + Gem::DefaultUserInteraction.ui = old_ui + end end end diff --git a/spec/commands/exec_spec.rb b/spec/commands/exec_spec.rb index 7ae504d3608..d2e85a289bf 100644 --- a/spec/commands/exec_spec.rb +++ b/spec/commands/exec_spec.rb @@ -55,6 +55,12 @@ expect(out).to eq("hi") end + it "works when exec'ing to rubygems" do + install_gemfile 'gem "rack"' + bundle "exec gem --version" + expect(out).to eq(Gem::VERSION) + end + it "respects custom process title when loading through ruby" do script_that_changes_its_own_title_and_checks_if_picked_up_by_ps_unix_utility = <<~'RUBY' Process.setproctitle("1-2-3-4-5-6-7-8-9-10-11-12-13-14-15") From fdc0c230541883270d0c842222f802c478f32707 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 22 Nov 2019 19:24:53 +0000 Subject: [PATCH 05/31] Merge #7450 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7450: Backport ruby-core changes r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that we haven't incorporated recent fixes for integration in ruby-core. ### What is your fix for the problem, implemented in this PR? My fix is to cherry-pick the fixes. Co-authored-by: Kazuhiro NISHIYAMA Co-authored-by: David Rodríguez (cherry picked from commit dbcfed3fe08a6d38455d01a6783fffa0e13edf94) --- spec/commands/version_spec.rb | 12 ++++++++++-- spec/support/path.rb | 12 +++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/spec/commands/version_spec.rb b/spec/commands/version_spec.rb index 66c79303974..8eecd9c53e3 100644 --- a/spec/commands/version_spec.rb +++ b/spec/commands/version_spec.rb @@ -1,6 +1,14 @@ # frozen_string_literal: true +require_relative "../support/path" + RSpec.describe "bundle version" do + if Spec::Path.ruby_core? + COMMIT_HASH = /unknown|[a-fA-F0-9]{7,}/.freeze + else + COMMIT_HASH = /[a-fA-F0-9]{7,}/.freeze + end + context "with -v" do it "outputs the version", :bundler => "< 3" do bundle! "-v" @@ -28,12 +36,12 @@ context "with version" do it "outputs the version with build metadata", :bundler => "< 3" do bundle! "version" - expect(out).to match(/\ABundler version #{Regexp.escape(Bundler::VERSION)} \(\d{4}-\d{2}-\d{2} commit [a-fA-F0-9]{7,}\)\z/) + expect(out).to match(/\ABundler version #{Regexp.escape(Bundler::VERSION)} \(\d{4}-\d{2}-\d{2} commit #{COMMIT_HASH}\)\z/) end it "outputs the version with build metadata", :bundler => "3" do bundle! "version" - expect(out).to match(/\A#{Regexp.escape(Bundler::VERSION)} \(\d{4}-\d{2}-\d{2} commit [a-fA-F0-9]{7,}\)\z/) + expect(out).to match(/\A#{Regexp.escape(Bundler::VERSION)} \(\d{4}-\d{2}-\d{2} commit #{COMMIT_HASH}\)\z/) end end end diff --git a/spec/support/path.rb b/spec/support/path.rb index cc5aebb01bf..4b3941b70fc 100644 --- a/spec/support/path.rb +++ b/spec/support/path.rb @@ -30,14 +30,23 @@ def spec_dir end def tracked_files + if root != `git rev-parse --show-toplevel` + skip "not in git working directory" + end @tracked_files ||= ruby_core? ? `git ls-files -z -- lib/bundler lib/bundler.rb spec/bundler man/bundler*` : `git ls-files -z` end def shipped_files + if root != `git rev-parse --show-toplevel` + skip "not in git working directory" + end @shipped_files ||= ruby_core? ? `git ls-files -z -- lib/bundler lib/bundler.rb man/bundler* libexec/bundle*` : `git ls-files -z -- lib man exe CHANGELOG.md LICENSE.md README.md bundler.gemspec` end def lib_tracked_files + if root != `git rev-parse --show-toplevel` + skip "not in git working directory" + end @lib_tracked_files ||= ruby_core? ? `git ls-files -z -- lib/bundler lib/bundler.rb` : `git ls-files -z -- lib` end @@ -150,7 +159,8 @@ def tmpdir(*args) def with_root_gemspec if ruby_core? root_gemspec = root.join("bundler.gemspec") - spec = Gem::Specification.load(gemspec.to_s) + # Dir.chdir(root) for Dir.glob in gemspec + spec = Dir.chdir(root) { Gem::Specification.load(gemspec.to_s) } spec.bindir = "libexec" File.open(root_gemspec.to_s, "w") {|f| f.write spec.to_ruby } yield(root_gemspec) From d2a122de2fbde44cc3e7774535c3bc641aaffdf7 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Sat, 23 Nov 2019 09:33:40 +0000 Subject: [PATCH 06/31] Merge #7451 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7451: Windows spec fixes r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that we have a bunch of spec failures on Windows (~315). ### What is your fix for the problem, implemented in this PR? My fix is to improve some stuff to be more OS-independent. This should bring the failures down to ~305. Co-authored-by: David Rodríguez (cherry picked from commit 0a866d013fcd1b81917d2c353fef1186d7aff153) --- azure-pipelines.yml | 9 +++++++++ spec/bundler/env_spec.rb | 4 ++-- spec/install/gems/resolving_spec.rb | 2 +- spec/install/redownload_spec.rb | 2 +- spec/runtime/setup_spec.rb | 8 +++++++- spec/support/artifice/compact_index.rb | 2 +- spec/support/artifice/compact_index_api_missing.rb | 2 +- spec/support/artifice/compact_index_extra_api_missing.rb | 2 +- spec/support/artifice/compact_index_extra_missing.rb | 2 +- spec/support/artifice/endpoint.rb | 2 +- spec/support/artifice/endpoint_api_missing.rb | 2 +- spec/support/artifice/endpoint_extra_missing.rb | 2 +- spec/support/artifice/windows.rb | 2 +- spec/support/builders.rb | 2 +- spec/support/rubygems_ext.rb | 2 +- 15 files changed, 30 insertions(+), 15 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d9544828409..309e6444870 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,3 +1,12 @@ +trigger: + branches: + include: + - master + - staging + - trying + - /.+-dev$/ + - /.+-stable$/ + jobs: - job: Windows pool: diff --git a/spec/bundler/env_spec.rb b/spec/bundler/env_spec.rb index f0ab5d5f35a..7686fe386a8 100644 --- a/spec/bundler/env_spec.rb +++ b/spec/bundler/env_spec.rb @@ -27,9 +27,9 @@ end it "prints gem path" do - with_clear_paths("GEM_PATH", "/a/b/c:/d/e/f") do + with_clear_paths("GEM_PATH", "/a/b/c#{File::PATH_SEPARATOR}d/e/f") do out = described_class.report - expect(out).to include("Gem Path /a/b/c:/d/e/f") + expect(out).to include("Gem Path /a/b/c#{File::PATH_SEPARATOR}d/e/f") end end diff --git a/spec/install/gems/resolving_spec.rb b/spec/install/gems/resolving_spec.rb index 26ff40f7aa1..f7c72d7e319 100644 --- a/spec/install/gems/resolving_spec.rb +++ b/spec/install/gems/resolving_spec.rb @@ -22,7 +22,7 @@ build_repo2 path = "#{gem_repo2}/#{Gem::MARSHAL_SPEC_DIR}/actionpack-2.3.2.gemspec.rz" - spec = Marshal.load(Bundler.rubygems.inflate(File.read(path))) + spec = Marshal.load(Bundler.rubygems.inflate(File.binread(path))) spec.dependencies.each do |d| d.instance_variable_set(:@type, :fail) end diff --git a/spec/install/redownload_spec.rb b/spec/install/redownload_spec.rb index 818c33bd613..c880b8bb150 100644 --- a/spec/install/redownload_spec.rb +++ b/spec/install/redownload_spec.rb @@ -17,7 +17,7 @@ bundle! :install, flag => true expect(out).to include "Installing rack 1.0.0" - expect(rack_lib.open(&:read)).to eq("RACK = '1.0.0'\n") + expect(rack_lib.binread).to eq("RACK = '1.0.0'\n") expect(the_bundle).to include_gems "rack 1.0.0" end diff --git a/spec/runtime/setup_spec.rb b/spec/runtime/setup_spec.rb index d86d1320eab..e247feb8044 100644 --- a/spec/runtime/setup_spec.rb +++ b/spec/runtime/setup_spec.rb @@ -845,6 +845,12 @@ def clean_load_path(lp) end describe "when a vendored gem specification uses the :path option" do + let(:filesystem_root) do + current = Pathname.new(Dir.pwd) + current = current.parent until current == current.parent + current + end + it "should resolve paths relative to the Gemfile" do path = bundled_app(File.join("vendor", "foo")) build_lib "foo", :path => path @@ -866,7 +872,7 @@ def clean_load_path(lp) end it "should make sure the Bundler.root is really included in the path relative to the Gemfile" do - relative_path = File.join("vendor", Dir.pwd[1..-1], "foo") + relative_path = File.join("vendor", Dir.pwd.gsub(/^#{filesystem_root}/, "")) absolute_path = bundled_app(relative_path) FileUtils.mkdir_p(absolute_path) build_lib "foo", :path => absolute_path diff --git a/spec/support/artifice/compact_index.rb b/spec/support/artifice/compact_index.rb index 89362c4dbc2..72abf26224f 100644 --- a/spec/support/artifice/compact_index.rb +++ b/spec/support/artifice/compact_index.rb @@ -10,7 +10,7 @@ class CompactIndexAPI < Endpoint def load_spec(name, version, platform, gem_repo) full_name = "#{name}-#{version}" full_name += "-#{platform}" if platform != "ruby" - Marshal.load(Bundler.rubygems.inflate(File.open(gem_repo.join("quick/Marshal.4.8/#{full_name}.gemspec.rz")).read)) + Marshal.load(Bundler.rubygems.inflate(File.binread(gem_repo.join("quick/Marshal.4.8/#{full_name}.gemspec.rz")))) end def etag_response diff --git a/spec/support/artifice/compact_index_api_missing.rb b/spec/support/artifice/compact_index_api_missing.rb index fdd342bc08a..6514fde01e4 100644 --- a/spec/support/artifice/compact_index_api_missing.rb +++ b/spec/support/artifice/compact_index_api_missing.rb @@ -10,7 +10,7 @@ class CompactIndexApiMissing < CompactIndexAPI if params[:id] == "rack-1.0.gemspec.rz" halt 404 else - File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") + File.binread("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") end end end diff --git a/spec/support/artifice/compact_index_extra_api_missing.rb b/spec/support/artifice/compact_index_extra_api_missing.rb index 6bd24ddbb4d..b9d757c2665 100644 --- a/spec/support/artifice/compact_index_extra_api_missing.rb +++ b/spec/support/artifice/compact_index_extra_api_missing.rb @@ -9,7 +9,7 @@ class CompactIndexExtraAPIMissing < CompactIndexExtraApi if params[:id] == "missing-1.0.gemspec.rz" halt 404 else - File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") + File.binread("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") end end end diff --git a/spec/support/artifice/compact_index_extra_missing.rb b/spec/support/artifice/compact_index_extra_missing.rb index 4758b785ac8..ff1e47a1bb7 100644 --- a/spec/support/artifice/compact_index_extra_missing.rb +++ b/spec/support/artifice/compact_index_extra_missing.rb @@ -9,7 +9,7 @@ class CompactIndexExtraMissing < CompactIndexExtra if params[:id] == "missing-1.0.gemspec.rz" halt 404 else - File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") + File.binread("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") end end end diff --git a/spec/support/artifice/endpoint.rb b/spec/support/artifice/endpoint.rb index bf26c565032..7bca681e700 100644 --- a/spec/support/artifice/endpoint.rb +++ b/spec/support/artifice/endpoint.rb @@ -68,7 +68,7 @@ def dependencies_for(gem_names, gem_repo = GEM_REPO) def load_spec(name, version, platform, gem_repo) full_name = "#{name}-#{version}" full_name += "-#{platform}" if platform != "ruby" - Marshal.load(Bundler.rubygems.inflate(File.open(gem_repo.join("quick/Marshal.4.8/#{full_name}.gemspec.rz")).read)) + Marshal.load(Bundler.rubygems.inflate(File.binread(gem_repo.join("quick/Marshal.4.8/#{full_name}.gemspec.rz")))) end end diff --git a/spec/support/artifice/endpoint_api_missing.rb b/spec/support/artifice/endpoint_api_missing.rb index 8dafde73622..755c42e8369 100644 --- a/spec/support/artifice/endpoint_api_missing.rb +++ b/spec/support/artifice/endpoint_api_missing.rb @@ -10,7 +10,7 @@ class EndpointApiMissing < Endpoint if params[:id] == "rack-1.0.gemspec.rz" halt 404 else - File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") + File.binread("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") end end end diff --git a/spec/support/artifice/endpoint_extra_missing.rb b/spec/support/artifice/endpoint_extra_missing.rb index ee129025ffa..5fd9238207c 100644 --- a/spec/support/artifice/endpoint_extra_missing.rb +++ b/spec/support/artifice/endpoint_extra_missing.rb @@ -9,7 +9,7 @@ class EndpointExtraMissing < EndpointExtra if params[:id] == "missing-1.0.gemspec.rz" halt 404 else - File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") + File.binread("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}") end end end diff --git a/spec/support/artifice/windows.rb b/spec/support/artifice/windows.rb index ce7455b86c4..21170c81d9c 100644 --- a/spec/support/artifice/windows.rb +++ b/spec/support/artifice/windows.rb @@ -27,7 +27,7 @@ def gem_repo files.each do |file| get "/#{file}" do - File.read gem_repo.join(file) + File.binread gem_repo.join(file) end end diff --git a/spec/support/builders.rb b/spec/support/builders.rb index c7f299487c1..331c0d11d2f 100644 --- a/spec/support/builders.rb +++ b/spec/support/builders.rb @@ -620,7 +620,7 @@ def @spec.validate(*); end @files.each do |file, source| file = Pathname.new(path).join(file) FileUtils.mkdir_p(file.dirname) - File.open(file, "w") {|f| f.puts source } + File.open(file, "wb") {|f| f.puts source } end @spec.files = @files.keys path diff --git a/spec/support/rubygems_ext.rb b/spec/support/rubygems_ext.rb index 1d41807cc89..74ac7f50c56 100644 --- a/spec/support/rubygems_ext.rb +++ b/spec/support/rubygems_ext.rb @@ -65,7 +65,7 @@ def setup FileUtils.mkdir_p(Path.base_system_gems) puts "installing gems for the tests to use..." install_gems(DEPS) - manifest_path.open("w") {|f| f << manifest.join } + manifest_path.open("wb") {|f| f << manifest.join } end FileUtils.mkdir_p(Path.home) From 098d6d961f9828c099b40a7e31d8de653a16c44b Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Sat, 23 Nov 2019 10:52:14 +0000 Subject: [PATCH 07/31] Merge #7452 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7452: Bump rubocop and rubocop-performance r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was not really a problem, but it's good to keep our dependencies up to date. ### What is your fix for the problem, implemented in this PR? My fix is to bump rubocop and rubocop-performance. Co-authored-by: David Rodríguez (cherry picked from commit 3e54fbc7b1e28e25eaac465a825cdd16facfe999) --- .rubocop.yml | 24 ++++++++++++------------ spec/bundler/fetcher_spec.rb | 4 ++-- spec/support/rubygems_ext.rb | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b43ff6dd88f..99f84d8ef02 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -183,15 +183,6 @@ Lint/UnderscorePrefixedVariableName: Lint/UnifiedInteger: Enabled: true -Lint/UnneededCopDisableDirective: - Enabled: true - -Lint/UnneededCopEnableDirective: - Enabled: true - -Lint/UnneededSplatExpansion: - Enabled: true - Lint/UnreachableCode: Enabled: true @@ -705,9 +696,18 @@ Style/RedundantBegin: Style/RedundantConditional: Enabled: true +Lint/RedundantCopDisableDirective: + Enabled: true + +Lint/RedundantCopEnableDirective: + Enabled: true + Style/RedundantException: Enabled: true +Style/RedundantInterpolation: + Enabled: true + Style/RedundantParentheses: Enabled: true @@ -717,6 +717,9 @@ Style/RedundantSelf: Style/RedundantSortBy: Enabled: true +Lint/RedundantSplatExpansion: + Enabled: true + Style/RegexpLiteral: Enabled: true @@ -798,9 +801,6 @@ Style/TrailingCommaInHashLiteral: Style/TrailingMethodEndStatement: Enabled: true -Style/UnneededInterpolation: - Enabled: true - Style/UnlessElse: Enabled: true diff --git a/spec/bundler/fetcher_spec.rb b/spec/bundler/fetcher_spec.rb index 184b9efa646..9176eb32f0d 100644 --- a/spec/bundler/fetcher_spec.rb +++ b/spec/bundler/fetcher_spec.rb @@ -144,14 +144,14 @@ describe "include CI information" do it "from one CI" do with_env_vars("JENKINS_URL" => "foo") do - ci_part = fetcher.user_agent.split(" ").find {|x| x.match(%r{\Aci/}) } + ci_part = fetcher.user_agent.split(" ").find {|x| x.start_with?("ci/") } expect(ci_part).to match("jenkins") end end it "from many CI" do with_env_vars("TRAVIS" => "foo", "CI_NAME" => "my_ci") do - ci_part = fetcher.user_agent.split(" ").find {|x| x.match(%r{\Aci/}) } + ci_part = fetcher.user_agent.split(" ").find {|x| x.start_with?("ci/") } expect(ci_part).to match("travis") expect(ci_part).to match("my_ci") end diff --git a/spec/support/rubygems_ext.rb b/spec/support/rubygems_ext.rb index 74ac7f50c56..5bfcac5ac40 100644 --- a/spec/support/rubygems_ext.rb +++ b/spec/support/rubygems_ext.rb @@ -10,8 +10,8 @@ module Rubygems "rake" => "~> 12.0", "ronn" => "~> 0.7.3", "rspec" => "~> 3.8", - "rubocop" => "= 0.74.0", - "rubocop-performance" => "= 1.4.0", + "rubocop" => "= 0.76.0", + "rubocop-performance" => "= 1.5.1", }.freeze DEPS = { From a137b11f1b727cfa0d4e3e92c72592181eb8645d Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Tue, 26 Nov 2019 21:53:48 +0000 Subject: [PATCH 08/31] Merge #7419 7419: Add :glob to git source uniqueness r=deivid-rodriguez a=fatkodima Closes #7346 Co-authored-by: fatkodima (cherry picked from commit 87449d535a731b818411523e34468f1f548adca9) --- lib/bundler/source/git.rb | 7 ++++--- spec/install/git_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index 736f5bb5465..fcb0ce8e0e1 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -8,7 +8,7 @@ class Source class Git < Path autoload :GitProxy, File.expand_path("git/git_proxy", __dir__) - attr_reader :uri, :ref, :branch, :options, :submodules + attr_reader :uri, :ref, :branch, :options, :glob, :submodules def initialize(options) @options = options @@ -48,13 +48,14 @@ def to_lock end def hash - [self.class, uri, ref, branch, name, version, submodules].hash + [self.class, uri, ref, branch, name, version, glob, submodules].hash end def eql?(other) other.is_a?(Git) && uri == other.uri && ref == other.ref && branch == other.branch && name == other.name && - version == other.version && submodules == other.submodules + version == other.version && glob == other.glob && + submodules == other.submodules end alias_method :==, :eql? diff --git a/spec/install/git_spec.rb b/spec/install/git_spec.rb index c16285241fa..cc8bf70b036 100644 --- a/spec/install/git_spec.rb +++ b/spec/install/git_spec.rb @@ -61,5 +61,25 @@ expect(out).to include("Bundle complete!") end + + it "allows multiple gems from the same git source" do + build_repo2 do + build_lib "foo", "1.0", :path => lib_path("gems/foo") + build_lib "zebra", "2.0", :path => lib_path("gems/zebra") + build_git "gems", :path => lib_path("gems"), :gemspec => false + end + + install_gemfile <<-G + source "#{file_uri_for(gem_repo2)}" + gem "foo", :git => "#{lib_path("gems")}", :glob => "foo/*.gemspec" + gem "zebra", :git => "#{lib_path("gems")}", :glob => "zebra/*.gemspec" + G + + bundle "info foo" + expect(out).to include("* foo (1.0 #{revision_for(lib_path("gems"))[0..6]})") + + bundle "info zebra" + expect(out).to include("* zebra (2.0 #{revision_for(lib_path("gems"))[0..6]})") + end end end From 6d30dcc88e144b63be3c6d00ba7def8967200991 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Tue, 26 Nov 2019 23:18:38 +0000 Subject: [PATCH 09/31] Merge #7455 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7455: Lazily load `open3` r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was `open3` will be gemified in ruby 2.7, and since we use it inside `bundler`, we might activate a version causing a conflict with the user's choice. ### What was your diagnosis of the problem? My diagnosis was that only loading it when needed should be better. ### What is your fix for the problem, implemented in this PR? My fix is to lazily load it. I expect this PR to fix [some of the errors](https://travis-ci.org/bundler/bundler/jobs/615940817) currently happening in our CI against ruby-head. Co-authored-by: David Rodríguez (cherry picked from commit 2a5378c8c50773b6f8974eb4914894c7c5bd766b) --- lib/bundler/source/git/git_proxy.rb | 3 ++- spec/support/helpers.rb | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/bundler/source/git/git_proxy.rb b/lib/bundler/source/git/git_proxy.rb index 2a4d7138a41..671610e7c1b 100644 --- a/lib/bundler/source/git/git_proxy.rb +++ b/lib/bundler/source/git/git_proxy.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "open3" require "shellwords" module Bundler @@ -243,12 +242,14 @@ def allowed_in_path end def capture_and_filter_stderr(uri, cmd) + require "open3" return_value, captured_err, status = Open3.capture3(cmd) Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty? [return_value, status] end def capture_and_ignore_stderr(cmd) + require "open3" return_value, _, status = Open3.capture3(cmd) [return_value, status] end diff --git a/spec/support/helpers.rb b/spec/support/helpers.rb index d085b769d73..95c2d60d563 100644 --- a/spec/support/helpers.rb +++ b/spec/support/helpers.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "open3" - require_relative "command_execution" require_relative "the_bundle" @@ -211,6 +209,7 @@ def sys_exec(cmd, env = {}) env = env.map {|k, v| [k.to_s, v.to_s] }.to_h # convert env keys and values to string + require "open3" Open3.popen3(env, cmd.to_s) do |stdin, stdout, stderr, wait_thr| yield stdin, stdout, wait_thr if block_given? stdin.close From 245b4f0ed1f346312781d7e9d2a87d0ecc5c5202 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Wed, 27 Nov 2019 09:34:36 +0000 Subject: [PATCH 10/31] Merge #7456 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7456: Lazily load CGI r=deivid-rodriguez a=deivid-rodriguez Thanks so much for the contribution! To make reviewing this PR a bit easier, please fill out answers to the following questions. ### What was the end-user problem that led to this PR? The problem was that our ruby-head build is failing in CI. ### What was your diagnosis of the problem? My diagnosis was that since `cgi` is now a default gem on ruby 2.7, we're getting someunintended activations of the new default gem inside our specs. ### What is your fix for the problem, implemented in this PR? My fix is to lazily load CGI. Co-authored-by: David Rodríguez (cherry picked from commit c3eae8ea436af06ab2c3f4bdd25bd9dd6e7c9eef) --- lib/bundler/friendly_errors.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bundler/friendly_errors.rb b/lib/bundler/friendly_errors.rb index 273573e8206..080697b02c0 100644 --- a/lib/bundler/friendly_errors.rb +++ b/lib/bundler/friendly_errors.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "cgi" require_relative "vendored_thor" module Bundler @@ -114,6 +113,7 @@ def request_issue_report_for(e) def issues_url(exception) message = exception.message.lines.first.tr(":", " ").chomp message = message.split("-").first if exception.is_a?(Errno) + require "cgi" "https://github.com/bundler/bundler/search?q=" \ "#{CGI.escape(message)}&type=Issues" end From 8b11b7b961ffee99754265ea0a55916e65951115 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 29 Nov 2019 10:44:56 +0000 Subject: [PATCH 11/31] Merge #7458 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7458: Improve default gem activation specs r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The original problem was that currently we are having some issues because ruby-core gemified some libraries that we use inside bundler. We shouldn't use default gems during `bundler/setup` because activating them might cause activation conflicts later on if the user has chosen a different version of the default gem from the one that's selected by default. The good news is that we have some nice specs that check that we never activate default gems, and they've been very useful lately for detecting this kind of breakage. The bad news is that some of these specs usually fail with really verbose error messages that make it difficult to find the root cause of the problems. ### What was your diagnosis of the problem? My diagnosis was that we could improve these specs to give better errors. ### What is your fix for the problem, implemented in this PR? My fix is to improve the specs with several tweaks, the main ones being: * Split them into one spec per default gem, so that when a default gem is unintentionally activated by bundler, only that spec fails, and with a reasonably concise error message. * Add a "gem activation hack" to the specs so that when a default gem is activated by `bundler/setup`, we get the exact location of where the activation happened. As an example, up to know, running `bin/rspec ./spec/runtime/setup_spec.rb -e "activates older versions"` against current ruby-head (ruby/ruby@4325f080862b36a3e3ddee472169f65758612ad3) and current rubygems (rubygems/rubygems@15ac911c686f68e1985bf700a053a84c46443e1d) leads to:
The following error message before this patch (1664 lines) ``` Randomized with seed 15961 F Retried examples: 0 Failures: 1) Bundler.setup with gemified standard libraries default gem activation activates older versions of default gems Failure/Error: expect(the_bundle).to include_gems(*default_gems.map {|g| "#{g} 0.0.0.a" }) expected the bundle to include gems "benchmark 0.0.0.a", "bigdecimal 0.0.0.a", "cgi 0.0.0.a", "csv 0.0.0.a", "date 0.0.0.a", "delegate 0.0.0.a", "e2mmap 0.0.0.a", "etc 0.0.0.a", "fcntl 0.0.0.a", "fiddle 0.0.0.a", "fileutils 0.0.0.a", "forwardable 0.0.0.a", "gdbm 0.0.0.a", "getoptlong 0.0.0.a", "io-console 0.0.0.a", "ipaddr 0.0.0.a", "irb 0.0.0.a", "json 0.0.0.a", "logger 0.0.0.a", "matrix 0.0.0.a", "mutex_m 0.0.0.a", "net-pop 0.0.0.a", "net-smtp 0.0.0.a", "observer 0.0.0.a", "open3 0.0.0.a", "openssl 0.0.0.a", "ostruct 0.0.0.a", "prime 0.0.0.a", "pstore 0.0.0.a", "psych 0.0.0.a", "racc 0.0.0.a", "rdoc 0.0.0.a", "readline 0.0.0.a", "readline-ext 0.0.0.a", "reline 0.0.0.a", "rexml 0.0.0.a", "rss 0.0.0.a", "sdbm 0.0.0.a", "singleton 0.0.0.a", "stringio 0.0.0.a", "strscan 0.0.0.a", "timeout 0.0.0.a", "tracer 0.0.0.a", "uri 0.0.0.a", "webrick 0.0.0.a", "yaml 0.0.0.a", and "zlib 0.0.0.a" but: benchmark is not installed: Invoking run!("require 'benchmark.rb'; puts BENCHMARK", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' bigdecimal is not installed: Invoking run!("require 'bigdecimal.rb'; puts BIGDECIMAL", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' cgi is not installed: Invoking run!("require 'cgi.rb'; puts CGI", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' csv is not installed: Invoking run!("require 'csv.rb'; puts CSV", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' date is not installed: Invoking run!("require 'date.rb'; puts DATE", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' delegate is not installed: Invoking run!("require 'delegate.rb'; puts DELEGATE", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' e2mmap is not installed: Invoking run!("require 'e2mmap.rb'; puts E2MMAP", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' etc is not installed: Invoking run!("require 'etc.rb'; puts ETC", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' fcntl is not installed: Invoking run!("require 'fcntl.rb'; puts FCNTL", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' fiddle is not installed: Invoking run!("require 'fiddle.rb'; puts FIDDLE", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' fileutils is not installed: Invoking run!("require 'fileutils.rb'; puts FILEUTILS", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' forwardable is not installed: Invoking run!("require 'forwardable.rb'; puts FORWARDABLE", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' gdbm is not installed: Invoking run!("require 'gdbm.rb'; puts GDBM", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' getoptlong is not installed: Invoking run!("require 'getoptlong.rb'; puts GETOPTLONG", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' io-console is not installed: Invoking run!("require 'io-console.rb'; puts IOCONSOLE", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' ipaddr is not installed: Invoking run!("require 'ipaddr.rb'; puts IPADDR", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' irb is not installed: Invoking run!("require 'irb.rb'; puts IRB", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' json is not installed: Invoking run!("require 'json.rb'; puts JSON", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' logger is not installed: Invoking run!("require 'logger.rb'; puts LOGGER", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' matrix is not installed: Invoking run!("require 'matrix.rb'; puts MATRIX", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' mutex_m is not installed: Invoking run!("require 'mutex_m.rb'; puts MUTEX_M", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' net-pop is not installed: Invoking run!("require 'net-pop.rb'; puts NETPOP", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' net-smtp is not installed: Invoking run!("require 'net-smtp.rb'; puts NETSMTP", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' observer is not installed: Invoking run!("require 'observer.rb'; puts OBSERVER", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' open3 is not installed: Invoking run!("require 'open3.rb'; puts OPEN3", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' openssl is not installed: Invoking run!("require 'openssl.rb'; puts OPENSSL", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' ostruct is not installed: Invoking run!("require 'ostruct.rb'; puts OSTRUCT", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' prime is not installed: Invoking run!("require 'prime.rb'; puts PRIME", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' pstore is not installed: Invoking run!("require 'pstore.rb'; puts PSTORE", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' psych is not installed: Invoking run!("require 'psych.rb'; puts PSYCH", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' racc is not installed: Invoking run!("require 'racc.rb'; puts RACC", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' rdoc is not installed: Invoking run!("require 'rdoc.rb'; puts RDOC", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' readline is not installed: Invoking run!("require 'readline.rb'; puts READLINE", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' readline-ext is not installed: Invoking run!("require 'readline-ext.rb'; puts READLINEEXT", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' reline is not installed: Invoking run!("require 'reline.rb'; puts RELINE", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' rexml is not installed: Invoking run!("require 'rexml.rb'; puts REXML", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' rss is not installed: Invoking run!("require 'rss.rb'; puts RSS", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' sdbm is not installed: Invoking run!("require 'sdbm.rb'; puts SDBM", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' singleton is not installed: Invoking run!("require 'singleton.rb'; puts SINGLETON", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' stringio is not installed: Invoking run!("require 'stringio.rb'; puts STRINGIO", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' strscan is not installed: Invoking run!("require 'strscan.rb'; puts STRSCAN", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' timeout is not installed: Invoking run!("require 'timeout.rb'; puts TIMEOUT", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' tracer is not installed: Invoking run!("require 'tracer.rb'; puts TRACER", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' uri is not installed: Invoking run!("require 'uri.rb'; puts URI", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' webrick is not installed: Invoking run!("require 'webrick.rb'; puts WEBRICK", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' yaml is not installed: Invoking run!("require 'yaml.rb'; puts YAML", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' zlib is not installed: Invoking run!("require 'zlib.rb'; puts ZLIB", {}) failed: /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' Commands: $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ < 0 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/spec/rubygems -S gem \ --backtrace generate_index Generating Marshal quick index gemspecs for 49 gems ................................................. Complete Generated Marshal quick index gemspecs: 0.009s Generating specs index Generated specs index: 0.000s Generating latest specs index Generated latest specs index: 0.000s Generating prerelease specs index Generated prerelease specs index: 0.000s Compressing indices Compressed indices: 0.000s # $? => 0 $ /home/deivid/.rbenv/versions/master/bin/ruby \ -I/home/deivid/Code/bundler/lib:/home/deivid/Code/bundler/spec -rsupport/hax \ -rsupport/artifice/fail /home/deivid/Code/bundler/exe/bundle install --retry 0 Fetching source index from file:///home/deivid/Code/bundler/tmp/1/gems/remote4/ Resolving dependencies... Fetching benchmark 0.0.0.a Installing benchmark 0.0.0.a Fetching bigdecimal 0.0.0.a Installing bigdecimal 0.0.0.a Using bundler 2.1.0.pre.3 Fetching cgi 0.0.0.a Installing cgi 0.0.0.a Fetching csv 0.0.0.a Installing csv 0.0.0.a Fetching date 0.0.0.a Installing date 0.0.0.a Fetching delegate 0.0.0.a Installing delegate 0.0.0.a Fetching e2mmap 0.0.0.a Installing e2mmap 0.0.0.a Fetching etc 0.0.0.a Installing etc 0.0.0.a Fetching fcntl 0.0.0.a Installing fcntl 0.0.0.a Fetching fiddle 0.0.0.a Installing fiddle 0.0.0.a Fetching fileutils 0.0.0.a Installing fileutils 0.0.0.a Fetching forwardable 0.0.0.a Installing forwardable 0.0.0.a Fetching gdbm 0.0.0.a Installing gdbm 0.0.0.a Fetching getoptlong 0.0.0.a Installing getoptlong 0.0.0.a Fetching io-console 0.0.0.a Installing io-console 0.0.0.a Fetching ipaddr 0.0.0.a Installing ipaddr 0.0.0.a Fetching irb 0.0.0.a Installing irb 0.0.0.a Fetching json 0.0.0.a Installing json 0.0.0.a Fetching logger 0.0.0.a Installing logger 0.0.0.a Fetching matrix 0.0.0.a Installing matrix 0.0.0.a Fetching mutex_m 0.0.0.a Installing mutex_m 0.0.0.a Fetching net-pop 0.0.0.a Installing net-pop 0.0.0.a Fetching net-smtp 0.0.0.a Installing net-smtp 0.0.0.a Fetching observer 0.0.0.a Installing observer 0.0.0.a Fetching open3 0.0.0.a Installing open3 0.0.0.a Fetching openssl 0.0.0.a Installing openssl 0.0.0.a Fetching ostruct 0.0.0.a Installing ostruct 0.0.0.a Fetching prime 0.0.0.a Installing prime 0.0.0.a Fetching pstore 0.0.0.a Installing pstore 0.0.0.a Fetching psych 0.0.0.a Installing psych 0.0.0.a Fetching racc 0.0.0.a Installing racc 0.0.0.a Fetching rdoc 0.0.0.a Installing rdoc 0.0.0.a Fetching readline 0.0.0.a Installing readline 0.0.0.a Fetching readline-ext 0.0.0.a Installing readline-ext 0.0.0.a Fetching reline 0.0.0.a Installing reline 0.0.0.a Fetching rexml 0.0.0.a Installing rexml 0.0.0.a Fetching rss 0.0.0.a Installing rss 0.0.0.a Fetching sdbm 0.0.0.a Installing sdbm 0.0.0.a Fetching singleton 0.0.0.a Installing singleton 0.0.0.a Fetching stringio 0.0.0.a Installing stringio 0.0.0.a Fetching strscan 0.0.0.a Installing strscan 0.0.0.a Fetching timeout 0.0.0.a Installing timeout 0.0.0.a Fetching tracer 0.0.0.a Installing tracer 0.0.0.a Fetching uri 0.0.0.a Installing uri 0.0.0.a Fetching webrick 0.0.0.a Installing webrick 0.0.0.a Fetching yaml 0.0.0.a Installing yaml 0.0.0.a Fetching zlib 0.0.0.a Installing zlib 0.0.0.a Bundle complete! 47 Gemfile dependencies, 48 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. # $? => 0 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 # ./spec/runtime/setup_spec.rb:1311:in `block (4 levels) in ' # ./spec/spec_helper.rb:111:in `block (3 levels) in ' # ./spec/spec_helper.rb:111:in `block (2 levels) in ' # ./spec/spec_helper.rb:78:in `block (2 levels) in ' # ./spec/support/rubygems_ext.rb:85:in `load' # ./spec/support/rubygems_ext.rb:85:in `gem_load_and_activate' # ./spec/support/rubygems_ext.rb:43:in `gem_load' Finished in 8.37 seconds (files took 0.15614 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/runtime/setup_spec.rb:1295 # Bundler.setup with gemified standard libraries default gem activation activates older versions of default gems Randomized with seed 15961 ```
A much more concise output after this patch (232 lines), without duplicate errors, with the location of the uri activation, and also surfacing another problem with the "delegate" default gem ``` Randomized with seed 50536 ..........................F.............F...... Retried examples: 0 Failures: 1) Bundler.setup with gemified standard libraries default gem activation activates older versions of uri Failure/Error: expect(the_bundle).to include_gem("#{g} 0.0.0.a", :env => { "RUBYOPT" => activation_warning_hack_rubyopt }) expected the bundle to include gem "uri 0.0.0.a" and {} but: uri is not installed: Invoking run!("require 'uri.rb'; puts URI", {}) failed: -------------------------------------------------------------------------------- activating uri-0.10.0 /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_gem.rb:68:in `block in gem' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_gem.rb:68:in `synchronize' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_gem.rb:68:in `gem' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:80:in `require' /home/deivid/Code/bundler/lib/bundler/settings.rb:3:in `' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:92:in `require' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:92:in `require' /home/deivid/Code/bundler/lib/bundler.rb:318:in `settings' /home/deivid/Code/bundler/lib/bundler.rb:100:in `configured_bundle_path' /home/deivid/Code/bundler/lib/bundler.rb:456:in `use_system_gems?' /home/deivid/Code/bundler/lib/bundler.rb:646:in `configure_gem_path' /home/deivid/Code/bundler/lib/bundler.rb:639:in `configure_gem_home_and_path' /home/deivid/Code/bundler/lib/bundler.rb:82:in `configure' /home/deivid/Code/bundler/lib/bundler.rb:195:in `definition' /home/deivid/Code/bundler/lib/bundler.rb:144:in `setup' -e:1:in `block in
' /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' -e:1:in `
' ******************************************************************************** /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' Commands: $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/spec/rubygems -S gem \ --backtrace generate_index Generating Marshal quick index gemspecs for 2 gems .. Complete Generated Marshal quick index gemspecs: 0.001s Generating specs index Generated specs index: 0.000s Generating latest specs index Generated latest specs index: 0.000s Generating prerelease specs index Generated prerelease specs index: 0.000s Compressing indices Compressed indices: 0.000s # $? => 0 $ /home/deivid/.rbenv/versions/master/bin/ruby \ -I/home/deivid/Code/bundler/lib:/home/deivid/Code/bundler/spec -rsupport/hax \ -rsupport/artifice/fail /home/deivid/Code/bundler/exe/bundle install --retry 0 Fetching source index from file:///home/deivid/Code/bundler/tmp/1/gems/remote4/ Resolving dependencies... Using bundler 2.1.0.pre.3 Fetching uri 0.0.0.a Installing uri 0.0.0.a Bundle complete! 1 Gemfile dependency, 2 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. # $? => 0 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:92:in `require' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:92:in `require' /home/deivid/Code/bundler/lib/bundler.rb:318:in `settings' /home/deivid/Code/bundler/lib/bundler.rb:100:in `configured_bundle_path' /home/deivid/Code/bundler/lib/bundler.rb:456:in `use_system_gems?' /home/deivid/Code/bundler/lib/bundler.rb:646:in `configure_gem_path' /home/deivid/Code/bundler/lib/bundler.rb:639:in `configure_gem_home_and_path' /home/deivid/Code/bundler/lib/bundler.rb:82:in `configure' /home/deivid/Code/bundler/lib/bundler.rb:195:in `definition' /home/deivid/Code/bundler/lib/bundler.rb:144:in `setup' -e:1:in `block in
' /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' -e:1:in `
' ******************************************************************************** /home/deivid/Code/bundler/lib/bundler/runtime.rb:312:in `check_for_activated_spec!': You have already activated uri 0.10.0, but your Gemfile requires uri 0.0.0.a. Since uri is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports uri as a default gem. (Gem::LoadError) from /home/deivid/Code/bundler/lib/bundler/runtime.rb:31:in `block in setup' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/spec_set.rb:147:in `each' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `map' from /home/deivid/Code/bundler/lib/bundler/runtime.rb:26:in `setup' from /home/deivid/Code/bundler/lib/bundler.rb:150:in `setup' from -e:1:in `block in
' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' from /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' from -e:1:in `
' # $? => 1 # ./spec/runtime/setup_spec.rb:1294:in `block (5 levels) in ' # ./spec/spec_helper.rb:111:in `block (3 levels) in ' # ./spec/spec_helper.rb:111:in `block (2 levels) in ' # ./spec/spec_helper.rb:78:in `block (2 levels) in ' # ./spec/support/rubygems_ext.rb:85:in `load' # ./spec/support/rubygems_ext.rb:85:in `gem_load_and_activate' # ./spec/support/rubygems_ext.rb:43:in `gem_load' 2) Bundler.setup with gemified standard libraries default gem activation activates older versions of delegate Failure/Error: expect(the_bundle).to include_gem("#{g} 0.0.0.a", :env => { "RUBYOPT" => activation_warning_hack_rubyopt }) expected the bundle to include gem "delegate 0.0.0.a" and {} but: delegate is not installed: Invoking run!("require 'delegate.rb'; puts DELEGATE", {}) failed: -------------------------------------------------------------------------------- activating uri-0.10.0 /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_gem.rb:68:in `block in gem' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_gem.rb:68:in `synchronize' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_gem.rb:68:in `gem' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:80:in `require' /home/deivid/Code/bundler/lib/bundler/settings.rb:3:in `' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:92:in `require' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:92:in `require' /home/deivid/Code/bundler/lib/bundler.rb:318:in `settings' /home/deivid/Code/bundler/lib/bundler.rb:100:in `configured_bundle_path' /home/deivid/Code/bundler/lib/bundler.rb:456:in `use_system_gems?' /home/deivid/Code/bundler/lib/bundler.rb:646:in `configure_gem_path' /home/deivid/Code/bundler/lib/bundler.rb:639:in `configure_gem_home_and_path' /home/deivid/Code/bundler/lib/bundler.rb:82:in `configure' /home/deivid/Code/bundler/lib/bundler.rb:195:in `definition' /home/deivid/Code/bundler/lib/bundler.rb:144:in `setup' -e:1:in `block in
' /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' -e:1:in `
' ******************************************************************************** -e:2:in `
': uninitialized constant DELEGATE (NameError) Commands: $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/spec/rubygems -S gem \ --backtrace generate_index Generating Marshal quick index gemspecs for 2 gems .. Complete Generated Marshal quick index gemspecs: 0.001s Generating specs index Generated specs index: 0.000s Generating latest specs index Generated latest specs index: 0.000s Generating prerelease specs index Generated prerelease specs index: 0.000s Compressing indices Compressed indices: 0.000s # $? => 0 $ /home/deivid/.rbenv/versions/master/bin/ruby \ -I/home/deivid/Code/bundler/lib:/home/deivid/Code/bundler/spec -rsupport/hax \ -rsupport/artifice/fail /home/deivid/Code/bundler/exe/bundle install --retry 0 Fetching source index from file:///home/deivid/Code/bundler/tmp/1/gems/remote4/ Resolving dependencies... Using bundler 2.1.0.pre.3 Fetching delegate 0.0.0.a Installing delegate 0.0.0.a Bundle complete! 1 Gemfile dependency, 2 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. # $? => 0 $ /home/deivid/.rbenv/versions/master/bin/ruby -I/home/deivid/Code/bundler/lib -w -e \ <' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:92:in `require' /home/deivid/Code/bundler/tmp/rubygems/lib/rubygems/core_ext/kernel_require.rb:92:in `require' /home/deivid/Code/bundler/lib/bundler.rb:318:in `settings' /home/deivid/Code/bundler/lib/bundler.rb:100:in `configured_bundle_path' /home/deivid/Code/bundler/lib/bundler.rb:456:in `use_system_gems?' /home/deivid/Code/bundler/lib/bundler.rb:646:in `configure_gem_path' /home/deivid/Code/bundler/lib/bundler.rb:639:in `configure_gem_home_and_path' /home/deivid/Code/bundler/lib/bundler.rb:82:in `configure' /home/deivid/Code/bundler/lib/bundler.rb:195:in `definition' /home/deivid/Code/bundler/lib/bundler.rb:144:in `setup' -e:1:in `block in
' /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:136:in `with_level' /home/deivid/Code/bundler/lib/bundler/ui/shell.rb:88:in `silence' -e:1:in `
' ******************************************************************************** -e:2:in `
': uninitialized constant DELEGATE (NameError) # $? => 1 # ./spec/runtime/setup_spec.rb:1294:in `block (5 levels) in ' # ./spec/spec_helper.rb:111:in `block (3 levels) in ' # ./spec/spec_helper.rb:111:in `block (2 levels) in ' # ./spec/spec_helper.rb:78:in `block (2 levels) in ' # ./spec/support/rubygems_ext.rb:85:in `load' # ./spec/support/rubygems_ext.rb:85:in `gem_load_and_activate' # ./spec/support/rubygems_ext.rb:43:in `gem_load' Finished in 25.2 seconds (files took 0.16231 seconds to load) 47 examples, 2 failures Failed examples: rspec ./spec/runtime/setup_spec.rb[1:31:3:91] # Bundler.setup with gemified standard libraries default gem activation activates older versions of uri rspec ./spec/runtime/setup_spec.rb[1:31:3:15] # Bundler.setup with gemified standard libraries default gem activation activates older versions of delegate Randomized with seed 50536 ```
### Why did you choose this fix out of the possible options? I chose this fix because it will make it easier to fix current and future breakage of unintentional activation of default gems. Co-authored-by: David Rodríguez (cherry picked from commit 31f875ff81a3d738ef32a57952dcd2dded593a65) --- spec/bundler/definition_spec.rb | 10 ++-- spec/bundler/friendly_errors_spec.rb | 2 +- spec/commands/binstubs_spec.rb | 2 +- spec/commands/install_spec.rb | 2 +- spec/install/deploy_spec.rb | 2 +- spec/install/gemfile/path_spec.rb | 6 +- spec/install/gems/compact_index_spec.rb | 2 +- spec/install/gems/resolving_spec.rb | 6 +- spec/install/gems/sudo_spec.rb | 2 +- spec/runtime/setup_spec.rb | 80 ++++++++++--------------- spec/support/helpers.rb | 6 +- 11 files changed, 50 insertions(+), 70 deletions(-) diff --git a/spec/bundler/definition_spec.rb b/spec/bundler/definition_spec.rb index 92f836299df..1f4c1a0807d 100644 --- a/spec/bundler/definition_spec.rb +++ b/spec/bundler/definition_spec.rb @@ -46,7 +46,7 @@ s.add_dependency "rack", "1.0" end - bundle :install, :env => { "DEBUG" => 1 } + bundle :install, :env => { "DEBUG" => "1" } expect(out).to match(/re-resolving dependencies/) lockfile_should_be <<-G @@ -84,7 +84,7 @@ s.add_dependency "rack", "1.0" end - bundle :install, :env => { "DEBUG" => 1 } + bundle :install, :env => { "DEBUG" => "1" } expect(out).to match(/re-resolving dependencies/) lockfile_should_be <<-G @@ -121,7 +121,7 @@ gem "foo", :path => "#{lib_path("foo")}" G - bundle :check, :env => { "DEBUG" => 1 } + bundle :check, :env => { "DEBUG" => "1" } expect(out).to match(/using resolution from the lockfile/) lockfile_should_be <<-G @@ -154,7 +154,7 @@ G bundle "lock --add-platform java" - bundle :check, :env => { "DEBUG" => 1 } + bundle :check, :env => { "DEBUG" => "1" } expect(out).to match(/using resolution from the lockfile/) lockfile_should_be <<-G @@ -181,7 +181,7 @@ gem "foo" G - bundle :check, :env => { "DEBUG" => 1 } + bundle :check, :env => { "DEBUG" => "1" } expect(out).to match(/using resolution from the lockfile/) lockfile_should_be <<-G diff --git a/spec/bundler/friendly_errors_spec.rb b/spec/bundler/friendly_errors_spec.rb index 47e7a5d3cdb..e9189b05141 100644 --- a/spec/bundler/friendly_errors_spec.rb +++ b/spec/bundler/friendly_errors_spec.rb @@ -22,7 +22,7 @@ gem "rack" G - bundle :install, :env => { "DEBUG" => true } + bundle :install, :env => { "DEBUG" => "true" } expect(err).to include("Failed to load #{home(".gemrc")}") expect(exitstatus).to eq(0) if exitstatus diff --git a/spec/commands/binstubs_spec.rb b/spec/commands/binstubs_spec.rb index df10bd34988..7c04e8ddbd2 100644 --- a/spec/commands/binstubs_spec.rb +++ b/spec/commands/binstubs_spec.rb @@ -458,7 +458,7 @@ G bundle "config set auto_install 1" - bundle "binstubs rack", :env => { "BUNDLE_INSTALL" => 1 } + bundle "binstubs rack", :env => { "BUNDLE_INSTALL" => "1" } expect(out).not_to include("Installing rack 1.0.0") end end diff --git a/spec/commands/install_spec.rb b/spec/commands/install_spec.rb index 8e161a4aae6..b57d81b10aa 100644 --- a/spec/commands/install_spec.rb +++ b/spec/commands/install_spec.rb @@ -45,7 +45,7 @@ gem "rack" G - bundle! :install, :env => { "BUNDLE_PATH__SYSTEM" => true } # can't use install_gemfile since it sets retry + bundle! :install, :env => { "BUNDLE_PATH__SYSTEM" => "true" } # can't use install_gemfile since it sets retry expect(bundled_app(".bundle")).not_to exist end diff --git a/spec/install/deploy_spec.rb b/spec/install/deploy_spec.rb index d607f8bb469..89da3fc8014 100644 --- a/spec/install/deploy_spec.rb +++ b/spec/install/deploy_spec.rb @@ -146,7 +146,7 @@ expect(the_bundle).to include_gems "path_gem 1.0" FileUtils.rm_r lib_path("path_gem-1.0") - bundle! :install, forgotten_command_line_options(:path => ".bundle", :without => "development", :deployment => true).merge(:env => { :DEBUG => "1" }) + bundle! :install, forgotten_command_line_options(:path => ".bundle", :without => "development", :deployment => true).merge(:env => { "DEBUG" => "1" }) run! "puts :WIN" expect(out).to eq("WIN") end diff --git a/spec/install/gemfile/path_spec.rb b/spec/install/gemfile/path_spec.rb index 786b767354f..e53636da092 100644 --- a/spec/install/gemfile/path_spec.rb +++ b/spec/install/gemfile/path_spec.rb @@ -439,7 +439,7 @@ gem 'net-ssh', '1.0' G - bundle :check, :env => { "DEBUG" => 1 } + bundle :check, :env => { "DEBUG" => "1" } expect(out).to match(/using resolution from the lockfile/) expect(the_bundle).to include_gems "rack-obama 1.0", "net-ssh 1.0" end @@ -459,7 +459,7 @@ gem 'net-ssh', :path => "#{lib_path("omg")}" G - bundle :check, :env => { "DEBUG" => 1 } + bundle :check, :env => { "DEBUG" => "1" } expect(out).to match(/using resolution from the lockfile/) expect(the_bundle).to include_gems "rack-obama 1.0", "net-ssh 1.0" end @@ -654,7 +654,7 @@ File.open(lib_path("private_lib/Gemfile"), "w") {|f| f.puts gemfile } Dir.chdir(lib_path("private_lib")) do - bundle :install, :env => { "DEBUG" => 1 }, :artifice => "endpoint" + bundle :install, :env => { "DEBUG" => "1" }, :artifice => "endpoint" expect(out).to match(%r{^HTTP GET http://localgemserver\.test/api/v1/dependencies\?gems=rack$}) expect(out).not_to match(/^HTTP GET.*private_lib/) expect(the_bundle).to include_gems "private_lib 2.2" diff --git a/spec/install/gems/compact_index_spec.rb b/spec/install/gems/compact_index_spec.rb index 2c145ce6431..a294b83d1ca 100644 --- a/spec/install/gems/compact_index_spec.rb +++ b/spec/install/gems/compact_index_spec.rb @@ -51,7 +51,7 @@ build_gem "Rack", "0.1" end - install_gemfile! <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4 } + install_gemfile! <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s } source "#{source_uri}" gem "rack", "1.0" gem "Rack", "0.1" diff --git a/spec/install/gems/resolving_spec.rb b/spec/install/gems/resolving_spec.rb index f7c72d7e319..52511ff67fc 100644 --- a/spec/install/gems/resolving_spec.rb +++ b/spec/install/gems/resolving_spec.rb @@ -108,7 +108,7 @@ end end - install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2 } + install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s } ruby "#{RUBY_VERSION}" source "http://localgemserver.test/" gem 'rack' @@ -127,7 +127,7 @@ build_gem "foo1", "1.0" end - install_gemfile <<-G, :artifice => "compact_index_rate_limited", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4 } + install_gemfile <<-G, :artifice => "compact_index_rate_limited", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s } ruby "#{RUBY_VERSION}" source "http://localgemserver.test/" gem 'rack' @@ -153,7 +153,7 @@ shared_examples_for "ruby version conflicts" do it "raises an error during resolution" do - install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2 } + install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s } source "http://localgemserver.test/" ruby #{ruby_requirement} gem 'require_ruby' diff --git a/spec/install/gems/sudo_spec.rb b/spec/install/gems/sudo_spec.rb index fcafe4a9079..170ffaca039 100644 --- a/spec/install/gems/sudo_spec.rb +++ b/spec/install/gems/sudo_spec.rb @@ -172,7 +172,7 @@ context "when ENV['BUNDLE_SILENCE_ROOT_WARNING'] is set" do it "skips the warning" do - bundle :install, :sudo => :preserve_env, :env => { "BUNDLE_SILENCE_ROOT_WARNING" => true } + bundle :install, :sudo => :preserve_env, :env => { "BUNDLE_SILENCE_ROOT_WARNING" => "true" } expect(err).to_not include(warning) end end diff --git a/spec/runtime/setup_spec.rb b/spec/runtime/setup_spec.rb index e247feb8044..80c38e9f4a6 100644 --- a/spec/runtime/setup_spec.rb +++ b/spec/runtime/setup_spec.rb @@ -864,7 +864,7 @@ def clean_load_path(lp) G Dir.chdir(bundled_app.parent) do - run <<-R, :env => { "BUNDLE_GEMFILE" => bundled_app("Gemfile") } + run <<-R, :env => { "BUNDLE_GEMFILE" => bundled_app("Gemfile").to_s } require 'foo' R end @@ -888,7 +888,7 @@ def clean_load_path(lp) bundle :install Dir.chdir(bundled_app.parent) do - run <<-R, :env => { "BUNDLE_GEMFILE" => bundled_app("Gemfile") } + run <<-R, :env => { "BUNDLE_GEMFILE" => bundled_app("Gemfile").to_s } require 'foo' R end @@ -1212,17 +1212,15 @@ def lock_with(ruby_version = nil) let(:activation_warning_hack) { strip_whitespace(<<-RUBY) } require #{spec_dir.join("support/hax").to_s.dump} - if Gem::Specification.instance_methods.map(&:to_sym).include?(:activate) - Gem::Specification.send(:alias_method, :bundler_spec_activate, :activate) - Gem::Specification.send(:define_method, :activate) do - unless #{exemptions.inspect}.include?(name) - warn '-' * 80 - warn "activating \#{full_name}" - warn *caller - warn '*' * 80 - end - bundler_spec_activate + Gem::Specification.send(:alias_method, :bundler_spec_activate, :activate) + Gem::Specification.send(:define_method, :activate) do + unless #{exemptions.inspect}.include?(name) + warn '-' * 80 + warn "activating \#{full_name}" + warn(*caller) + warn '*' * 80 end + bundler_spec_activate end RUBY @@ -1246,14 +1244,14 @@ def lock_with(ruby_version = nil) it "activates no gems with -rbundler/setup" do install_gemfile! "" - ruby! code, :env => { :RUBYOPT => activation_warning_hack_rubyopt + " -r#{lib_dir}/bundler/setup" } + ruby! code, :env => { "RUBYOPT" => activation_warning_hack_rubyopt + " -r#{lib_dir}/bundler/setup" } expect(out).to eq("{}") end it "activates no gems with bundle exec" do install_gemfile! "" create_file("script.rb", code) - bundle! "exec ruby ./script.rb", :env => { :RUBYOPT => activation_warning_hack_rubyopt } + bundle! "exec ruby ./script.rb", :env => { "RUBYOPT" => activation_warning_hack_rubyopt } expect(out).to eq("{}") end @@ -1261,54 +1259,40 @@ def lock_with(ruby_version = nil) install_gemfile! "" create_file("script.rb", "#!/usr/bin/env ruby\n\n#{code}") FileUtils.chmod(0o777, bundled_app("script.rb")) - bundle! "exec ./script.rb", :artifice => nil, :env => { :RUBYOPT => activation_warning_hack_rubyopt } + bundle! "exec ./script.rb", :artifice => nil, :env => { "RUBYOPT" => activation_warning_hack_rubyopt } expect(out).to eq("{}") end - let(:default_gems) do - ruby!(<<-RUBY).split("\n") - if Gem::Specification.is_a?(Enumerable) - puts Gem::Specification.select(&:default_gem?).map(&:name) - end - RUBY - end + Gem::Specification.select(&:default_gem?).map(&:name).each do |g| + it "activates newer versions of #{g}" do + skip if exemptions.include?(g) - it "activates newer versions of default gems" do - build_repo4 do - default_gems.each do |g| + build_repo4 do build_gem g, "999999" end - end - default_gems.reject! {|g| exemptions.include?(g) } + install_gemfile! <<-G + source "#{file_uri_for(gem_repo4)}" + gem "#{g}", "999999" + G - install_gemfile! <<-G - source "#{file_uri_for(gem_repo4)}" - #{default_gems}.each do |g| - gem g, "999999" - end - G + expect(the_bundle).to include_gem("#{g} 999999", :env => { "RUBYOPT" => activation_warning_hack_rubyopt }) + end - expect(the_bundle).to include_gems(*default_gems.map {|g| "#{g} 999999" }) - end + it "activates older versions of #{g}" do + skip if exemptions.include?(g) - it "activates older versions of default gems" do - build_repo4 do - default_gems.each do |g| + build_repo4 do build_gem g, "0.0.0.a" end - end - default_gems.reject! {|g| exemptions.include?(g) } - - install_gemfile! <<-G - source "#{file_uri_for(gem_repo4)}" - #{default_gems}.each do |g| - gem g, "0.0.0.a" - end - G + install_gemfile! <<-G + source "#{file_uri_for(gem_repo4)}" + gem "#{g}", "0.0.0.a" + G - expect(the_bundle).to include_gems(*default_gems.map {|g| "#{g} 0.0.0.a" }) + expect(the_bundle).to include_gem("#{g} 0.0.0.a", :env => { "RUBYOPT" => activation_warning_hack_rubyopt }) + end end end end diff --git a/spec/support/helpers.rb b/spec/support/helpers.rb index 95c2d60d563..7d1bd651854 100644 --- a/spec/support/helpers.rb +++ b/spec/support/helpers.rb @@ -23,9 +23,7 @@ def self.bang(method) define_method("#{method}!") do |*args, &blk| send(method, *args, &blk).tap do unless last_command.success? - raise RuntimeError, - "Invoking #{method}!(#{args.map(&:inspect).join(", ")}) failed:\n#{last_command.stdboth}", - caller.drop_while {|bt| bt.start_with?(__FILE__) } + raise "Invoking #{method}!(#{args.map(&:inspect).join(", ")}) failed:\n#{last_command.stdboth}" end end end @@ -207,8 +205,6 @@ def rake def sys_exec(cmd, env = {}) command_execution = CommandExecution.new(cmd.to_s, Dir.pwd) - env = env.map {|k, v| [k.to_s, v.to_s] }.to_h # convert env keys and values to string - require "open3" Open3.popen3(env, cmd.to_s) do |stdin, stdout, stderr, wait_thr| yield stdin, stdout, wait_thr if block_given? From a2c2d3c5c55e4ed128ec8728c177d639213ecbe8 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 29 Nov 2019 12:01:45 +0000 Subject: [PATCH 12/31] Merge #7459 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7459: Unskip quality specs r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was after 5003a436765eb50d9208ffdce4bbe46cf0d6d63b backported from ruby-core, quality_specs are no longer run, not even in our repo. ### What was your diagnosis of the problem? My diagnosis was that the condition to check whether the root folder is a git folder was incorrect. ### What is your fix for the problem, implemented in this PR? My fix is to correct the condition. Co-authored-by: David Rodríguez (cherry picked from commit 8c78566bf25917bd77c5183604c5d34c175eb987) --- spec/support/path.rb | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/spec/support/path.rb b/spec/support/path.rb index 4b3941b70fc..3e42589f4d3 100644 --- a/spec/support/path.rb +++ b/spec/support/path.rb @@ -30,23 +30,20 @@ def spec_dir end def tracked_files - if root != `git rev-parse --show-toplevel` - skip "not in git working directory" - end + skip "not in git working directory" unless git_root_dir? + @tracked_files ||= ruby_core? ? `git ls-files -z -- lib/bundler lib/bundler.rb spec/bundler man/bundler*` : `git ls-files -z` end def shipped_files - if root != `git rev-parse --show-toplevel` - skip "not in git working directory" - end + skip "not in git working directory" unless git_root_dir? + @shipped_files ||= ruby_core? ? `git ls-files -z -- lib/bundler lib/bundler.rb man/bundler* libexec/bundle*` : `git ls-files -z -- lib man exe CHANGELOG.md LICENSE.md README.md bundler.gemspec` end def lib_tracked_files - if root != `git rev-parse --show-toplevel` - skip "not in git working directory" - end + skip "not in git working directory" unless git_root_dir? + @lib_tracked_files ||= ruby_core? ? `git ls-files -z -- lib/bundler lib/bundler.rb` : `git ls-files -z -- lib` end @@ -182,5 +179,11 @@ def ruby_core? end extend self + + private + + def git_root_dir? + root.to_s == `git rev-parse --show-toplevel`.chomp + end end end From 937fc2006d74cec3ff48ea312cdcc89a3a2f38a7 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 29 Nov 2019 18:49:53 +0000 Subject: [PATCH 13/31] Merge #7461 7461: Set parallel_tests to output progress in the same format as regular RSpec r=deivid-rodriguez a=colby-swandale # What was the end-user problem that led to this PR? When running tests using the `parallel_test` tool, there will be no output on the terminal to show the progress or result of the test suit. ``` $ ./bin/parallel_rspec spec 8 processes for 162 specs, ~ 20 specs per process Took 576 seconds (9:36) ``` You have to go diving into a file that's located in `tmp/parallel_runtime_rspec.log`. It would be better to have the output that we get from the regular `./bin/rspec` and show the progress/result of the test suit. ### What was your diagnosis of the problem? Run the parallel test suit using `./bin/parallel_rspec spec` ### What is your fix for the problem, implemented in this PR? Add the additional `progress` formatter to the parallel rspec configuration Co-authored-by: Colby Swandale (cherry picked from commit 8b5bd053b0333c1537f60e2d14a1045234999b8f) --- .rspec_parallel | 1 + 1 file changed, 1 insertion(+) diff --git a/.rspec_parallel b/.rspec_parallel index 8b7ea4229b8..6989221a44c 100644 --- a/.rspec_parallel +++ b/.rspec_parallel @@ -1,3 +1,4 @@ +--format progress --format ParallelTests::RSpec::RuntimeLogger --out tmp/parallel_runtime_rspec.log --require spec_helper --require support/parallel.rb From 4e4ea8f212fc2b052341606b54f3bd97497163b4 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Sun, 1 Dec 2019 13:52:28 +0000 Subject: [PATCH 14/31] Merge #7465 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7465: December manpages r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that man pages are out of date. ### What is your fix for the problem, implemented in this PR? My fix is to update them. Co-authored-by: David Rodríguez (cherry picked from commit 88bc81b26e1fa409a384925ae865e477073b4f03) --- man/bundle-add.1 | 2 +- man/bundle-add.1.txt | 2 +- man/bundle-binstubs.1 | 2 +- man/bundle-binstubs.1.txt | 2 +- man/bundle-cache.1 | 2 +- man/bundle-cache.1.txt | 2 +- man/bundle-check.1 | 2 +- man/bundle-check.1.txt | 2 +- man/bundle-clean.1 | 2 +- man/bundle-clean.1.txt | 2 +- man/bundle-config.1 | 2 +- man/bundle-config.1.txt | 2 +- man/bundle-doctor.1 | 2 +- man/bundle-doctor.1.txt | 2 +- man/bundle-exec.1 | 2 +- man/bundle-exec.1.txt | 2 +- man/bundle-gem.1 | 2 +- man/bundle-gem.1.txt | 2 +- man/bundle-info.1 | 2 +- man/bundle-info.1.txt | 2 +- man/bundle-init.1 | 2 +- man/bundle-init.1.txt | 2 +- man/bundle-inject.1 | 2 +- man/bundle-inject.1.txt | 2 +- man/bundle-install.1 | 2 +- man/bundle-install.1.txt | 2 +- man/bundle-list.1 | 2 +- man/bundle-list.1.txt | 2 +- man/bundle-lock.1 | 2 +- man/bundle-lock.1.txt | 2 +- man/bundle-open.1 | 2 +- man/bundle-open.1.txt | 2 +- man/bundle-outdated.1 | 2 +- man/bundle-outdated.1.txt | 2 +- man/bundle-platform.1 | 2 +- man/bundle-platform.1.txt | 2 +- man/bundle-pristine.1 | 2 +- man/bundle-pristine.1.txt | 2 +- man/bundle-remove.1 | 2 +- man/bundle-remove.1.txt | 2 +- man/bundle-show.1 | 2 +- man/bundle-show.1.txt | 2 +- man/bundle-update.1 | 2 +- man/bundle-update.1.txt | 2 +- man/bundle-viz.1 | 2 +- man/bundle-viz.1.txt | 2 +- man/bundle.1 | 2 +- man/bundle.1.txt | 2 +- man/gemfile.5 | 2 +- man/gemfile.5.txt | 2 +- 50 files changed, 50 insertions(+), 50 deletions(-) diff --git a/man/bundle-add.1 b/man/bundle-add.1 index ba81726c5f0..24bfe50f4f0 100644 --- a/man/bundle-add.1 +++ b/man/bundle-add.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-ADD" "1" "November 2019" "" "" +.TH "BUNDLE\-ADD" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install diff --git a/man/bundle-add.1.txt b/man/bundle-add.1.txt index 16a1405c9b0..aff9977fb12 100644 --- a/man/bundle-add.1.txt +++ b/man/bundle-add.1.txt @@ -55,4 +55,4 @@ OPTIONS - November 2019 BUNDLE-ADD(1) + December 2019 BUNDLE-ADD(1) diff --git a/man/bundle-binstubs.1 b/man/bundle-binstubs.1 index 559350c7d0c..4e69bfb7159 100644 --- a/man/bundle-binstubs.1 +++ b/man/bundle-binstubs.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-BINSTUBS" "1" "November 2019" "" "" +.TH "BUNDLE\-BINSTUBS" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems diff --git a/man/bundle-binstubs.1.txt b/man/bundle-binstubs.1.txt index 1e35f6111b6..564989bd8a6 100644 --- a/man/bundle-binstubs.1.txt +++ b/man/bundle-binstubs.1.txt @@ -45,4 +45,4 @@ BUNDLE INSTALL --BINSTUBS - November 2019 BUNDLE-BINSTUBS(1) + December 2019 BUNDLE-BINSTUBS(1) diff --git a/man/bundle-cache.1 b/man/bundle-cache.1 index 1adb0b152cd..23bc757d035 100644 --- a/man/bundle-cache.1 +++ b/man/bundle-cache.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-CACHE" "1" "November 2019" "" "" +.TH "BUNDLE\-CACHE" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application diff --git a/man/bundle-cache.1.txt b/man/bundle-cache.1.txt index b5cec05f8a1..4dcc7c9cc96 100644 --- a/man/bundle-cache.1.txt +++ b/man/bundle-cache.1.txt @@ -75,4 +75,4 @@ REMOTE FETCHING - November 2019 BUNDLE-CACHE(1) + December 2019 BUNDLE-CACHE(1) diff --git a/man/bundle-check.1 b/man/bundle-check.1 index 56516255c7b..ac80f697f54 100644 --- a/man/bundle-check.1 +++ b/man/bundle-check.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-CHECK" "1" "November 2019" "" "" +.TH "BUNDLE\-CHECK" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems diff --git a/man/bundle-check.1.txt b/man/bundle-check.1.txt index a1edc4d4a44..05d1c7dc5c4 100644 --- a/man/bundle-check.1.txt +++ b/man/bundle-check.1.txt @@ -30,4 +30,4 @@ OPTIONS - November 2019 BUNDLE-CHECK(1) + December 2019 BUNDLE-CHECK(1) diff --git a/man/bundle-clean.1 b/man/bundle-clean.1 index 9d62619bb2d..61fcf9d3964 100644 --- a/man/bundle-clean.1 +++ b/man/bundle-clean.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-CLEAN" "1" "November 2019" "" "" +.TH "BUNDLE\-CLEAN" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory diff --git a/man/bundle-clean.1.txt b/man/bundle-clean.1.txt index 6e24aaf2c49..9438f8adc90 100644 --- a/man/bundle-clean.1.txt +++ b/man/bundle-clean.1.txt @@ -23,4 +23,4 @@ OPTIONS - November 2019 BUNDLE-CLEAN(1) + December 2019 BUNDLE-CLEAN(1) diff --git a/man/bundle-config.1 b/man/bundle-config.1 index e982ec05016..56ef24791d0 100644 --- a/man/bundle-config.1 +++ b/man/bundle-config.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-CONFIG" "1" "November 2019" "" "" +.TH "BUNDLE\-CONFIG" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-config\fR \- Set bundler configuration options diff --git a/man/bundle-config.1.txt b/man/bundle-config.1.txt index cff59902968..bc3fe390699 100644 --- a/man/bundle-config.1.txt +++ b/man/bundle-config.1.txt @@ -525,4 +525,4 @@ CONFIGURE BUNDLER DIRECTORIES - November 2019 BUNDLE-CONFIG(1) + December 2019 BUNDLE-CONFIG(1) diff --git a/man/bundle-doctor.1 b/man/bundle-doctor.1 index ec7231d4a91..d3e3e73bbe5 100644 --- a/man/bundle-doctor.1 +++ b/man/bundle-doctor.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-DOCTOR" "1" "November 2019" "" "" +.TH "BUNDLE\-DOCTOR" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-doctor\fR \- Checks the bundle for common problems diff --git a/man/bundle-doctor.1.txt b/man/bundle-doctor.1.txt index 58fd9ed4a02..6b2fdcbdf42 100644 --- a/man/bundle-doctor.1.txt +++ b/man/bundle-doctor.1.txt @@ -41,4 +41,4 @@ OPTIONS - November 2019 BUNDLE-DOCTOR(1) + December 2019 BUNDLE-DOCTOR(1) diff --git a/man/bundle-exec.1 b/man/bundle-exec.1 index 187251740a8..fa0728a5de1 100644 --- a/man/bundle-exec.1 +++ b/man/bundle-exec.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-EXEC" "1" "November 2019" "" "" +.TH "BUNDLE\-EXEC" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-exec\fR \- Execute a command in the context of the bundle diff --git a/man/bundle-exec.1.txt b/man/bundle-exec.1.txt index 2b0a17c4fce..efcb130b48e 100644 --- a/man/bundle-exec.1.txt +++ b/man/bundle-exec.1.txt @@ -175,4 +175,4 @@ RUBYGEMS PLUGINS - November 2019 BUNDLE-EXEC(1) + December 2019 BUNDLE-EXEC(1) diff --git a/man/bundle-gem.1 b/man/bundle-gem.1 index e814e3f1aa5..9971e3528c2 100644 --- a/man/bundle-gem.1 +++ b/man/bundle-gem.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-GEM" "1" "November 2019" "" "" +.TH "BUNDLE\-GEM" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem diff --git a/man/bundle-gem.1.txt b/man/bundle-gem.1.txt index 266cc43131e..c95c409c659 100644 --- a/man/bundle-gem.1.txt +++ b/man/bundle-gem.1.txt @@ -88,4 +88,4 @@ SEE ALSO - November 2019 BUNDLE-GEM(1) + December 2019 BUNDLE-GEM(1) diff --git a/man/bundle-info.1 b/man/bundle-info.1 index 75b0cfa358d..9dbef738fa0 100644 --- a/man/bundle-info.1 +++ b/man/bundle-info.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-INFO" "1" "November 2019" "" "" +.TH "BUNDLE\-INFO" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-info\fR \- Show information for the given gem in your bundle diff --git a/man/bundle-info.1.txt b/man/bundle-info.1.txt index 4e908c6e4c7..102ec48f6ec 100644 --- a/man/bundle-info.1.txt +++ b/man/bundle-info.1.txt @@ -18,4 +18,4 @@ OPTIONS - November 2019 BUNDLE-INFO(1) + December 2019 BUNDLE-INFO(1) diff --git a/man/bundle-init.1 b/man/bundle-init.1 index 9e2a23004f5..8fe0d024063 100644 --- a/man/bundle-init.1 +++ b/man/bundle-init.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-INIT" "1" "November 2019" "" "" +.TH "BUNDLE\-INIT" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-init\fR \- Generates a Gemfile into the current working directory diff --git a/man/bundle-init.1.txt b/man/bundle-init.1.txt index cdebbebf14a..187ed4b3c04 100644 --- a/man/bundle-init.1.txt +++ b/man/bundle-init.1.txt @@ -31,4 +31,4 @@ SEE ALSO - November 2019 BUNDLE-INIT(1) + December 2019 BUNDLE-INIT(1) diff --git a/man/bundle-inject.1 b/man/bundle-inject.1 index 6ce2973b5fc..afc328771e0 100644 --- a/man/bundle-inject.1 +++ b/man/bundle-inject.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-INJECT" "1" "November 2019" "" "" +.TH "BUNDLE\-INJECT" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile diff --git a/man/bundle-inject.1.txt b/man/bundle-inject.1.txt index df0a032b979..a73927cef0c 100644 --- a/man/bundle-inject.1.txt +++ b/man/bundle-inject.1.txt @@ -29,4 +29,4 @@ DESCRIPTION - November 2019 BUNDLE-INJECT(1) + December 2019 BUNDLE-INJECT(1) diff --git a/man/bundle-install.1 b/man/bundle-install.1 index 4656a0cbe3e..200acfca241 100644 --- a/man/bundle-install.1 +++ b/man/bundle-install.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-INSTALL" "1" "November 2019" "" "" +.TH "BUNDLE\-INSTALL" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-install\fR \- Install the dependencies specified in your Gemfile diff --git a/man/bundle-install.1.txt b/man/bundle-install.1.txt index cef9494cc34..08a0869d6f8 100644 --- a/man/bundle-install.1.txt +++ b/man/bundle-install.1.txt @@ -398,4 +398,4 @@ SEE ALSO - November 2019 BUNDLE-INSTALL(1) + December 2019 BUNDLE-INSTALL(1) diff --git a/man/bundle-list.1 b/man/bundle-list.1 index 0d932dbf28e..53427b4504c 100644 --- a/man/bundle-list.1 +++ b/man/bundle-list.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-LIST" "1" "November 2019" "" "" +.TH "BUNDLE\-LIST" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-list\fR \- List all the gems in the bundle diff --git a/man/bundle-list.1.txt b/man/bundle-list.1.txt index d2433c56486..f4eab62783d 100644 --- a/man/bundle-list.1.txt +++ b/man/bundle-list.1.txt @@ -40,4 +40,4 @@ OPTIONS - November 2019 BUNDLE-LIST(1) + December 2019 BUNDLE-LIST(1) diff --git a/man/bundle-lock.1 b/man/bundle-lock.1 index 6b86531f605..b64a645eb80 100644 --- a/man/bundle-lock.1 +++ b/man/bundle-lock.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-LOCK" "1" "November 2019" "" "" +.TH "BUNDLE\-LOCK" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-lock\fR \- Creates / Updates a lockfile without installing diff --git a/man/bundle-lock.1.txt b/man/bundle-lock.1.txt index b8f18c13e0f..a50ee25643c 100644 --- a/man/bundle-lock.1.txt +++ b/man/bundle-lock.1.txt @@ -90,4 +90,4 @@ PATCH LEVEL OPTIONS - November 2019 BUNDLE-LOCK(1) + December 2019 BUNDLE-LOCK(1) diff --git a/man/bundle-open.1 b/man/bundle-open.1 index 4eb5aebdf34..6213aeca655 100644 --- a/man/bundle-open.1 +++ b/man/bundle-open.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-OPEN" "1" "November 2019" "" "" +.TH "BUNDLE\-OPEN" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle diff --git a/man/bundle-open.1.txt b/man/bundle-open.1.txt index a4ca7eaf619..9ecc89c10a9 100644 --- a/man/bundle-open.1.txt +++ b/man/bundle-open.1.txt @@ -26,4 +26,4 @@ DESCRIPTION - November 2019 BUNDLE-OPEN(1) + December 2019 BUNDLE-OPEN(1) diff --git a/man/bundle-outdated.1 b/man/bundle-outdated.1 index d126a14f05c..81543bb65b3 100644 --- a/man/bundle-outdated.1 +++ b/man/bundle-outdated.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-OUTDATED" "1" "November 2019" "" "" +.TH "BUNDLE\-OUTDATED" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-outdated\fR \- List installed gems with newer versions available diff --git a/man/bundle-outdated.1.txt b/man/bundle-outdated.1.txt index 49534557d9c..905a1fd9fc9 100644 --- a/man/bundle-outdated.1.txt +++ b/man/bundle-outdated.1.txt @@ -128,4 +128,4 @@ FILTERING OUTPUT - November 2019 BUNDLE-OUTDATED(1) + December 2019 BUNDLE-OUTDATED(1) diff --git a/man/bundle-platform.1 b/man/bundle-platform.1 index 8d0dd9bfdaf..f7f65045dc9 100644 --- a/man/bundle-platform.1 +++ b/man/bundle-platform.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-PLATFORM" "1" "November 2019" "" "" +.TH "BUNDLE\-PLATFORM" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-platform\fR \- Displays platform compatibility information diff --git a/man/bundle-platform.1.txt b/man/bundle-platform.1.txt index e609225e843..d808bed64f7 100644 --- a/man/bundle-platform.1.txt +++ b/man/bundle-platform.1.txt @@ -54,4 +54,4 @@ OPTIONS - November 2019 BUNDLE-PLATFORM(1) + December 2019 BUNDLE-PLATFORM(1) diff --git a/man/bundle-pristine.1 b/man/bundle-pristine.1 index 3ba82f0eb1c..5b3522dd1ae 100644 --- a/man/bundle-pristine.1 +++ b/man/bundle-pristine.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-PRISTINE" "1" "November 2019" "" "" +.TH "BUNDLE\-PRISTINE" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition diff --git a/man/bundle-pristine.1.txt b/man/bundle-pristine.1.txt index 780441595a5..a22bd539273 100644 --- a/man/bundle-pristine.1.txt +++ b/man/bundle-pristine.1.txt @@ -41,4 +41,4 @@ DESCRIPTION - November 2019 BUNDLE-PRISTINE(1) + December 2019 BUNDLE-PRISTINE(1) diff --git a/man/bundle-remove.1 b/man/bundle-remove.1 index 35874563a0b..4a4ed7ac951 100644 --- a/man/bundle-remove.1 +++ b/man/bundle-remove.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-REMOVE" "1" "November 2019" "" "" +.TH "BUNDLE\-REMOVE" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-remove\fR \- Removes gems from the Gemfile diff --git a/man/bundle-remove.1.txt b/man/bundle-remove.1.txt index 968aeed4167..7c8945e2c06 100644 --- a/man/bundle-remove.1.txt +++ b/man/bundle-remove.1.txt @@ -31,4 +31,4 @@ OPTIONS - November 2019 BUNDLE-REMOVE(1) + December 2019 BUNDLE-REMOVE(1) diff --git a/man/bundle-show.1 b/man/bundle-show.1 index 51329ecb2c5..575619370b9 100644 --- a/man/bundle-show.1 +++ b/man/bundle-show.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-SHOW" "1" "November 2019" "" "" +.TH "BUNDLE\-SHOW" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem diff --git a/man/bundle-show.1.txt b/man/bundle-show.1.txt index cbab9e0bd7c..fa800814277 100644 --- a/man/bundle-show.1.txt +++ b/man/bundle-show.1.txt @@ -24,4 +24,4 @@ OPTIONS - November 2019 BUNDLE-SHOW(1) + December 2019 BUNDLE-SHOW(1) diff --git a/man/bundle-update.1 b/man/bundle-update.1 index 726f4f7cb7c..6a3fd877e2a 100644 --- a/man/bundle-update.1 +++ b/man/bundle-update.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-UPDATE" "1" "November 2019" "" "" +.TH "BUNDLE\-UPDATE" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-update\fR \- Update your gems to the latest available versions diff --git a/man/bundle-update.1.txt b/man/bundle-update.1.txt index bc84254475c..c54ade97136 100644 --- a/man/bundle-update.1.txt +++ b/man/bundle-update.1.txt @@ -387,4 +387,4 @@ RECOMMENDED WORKFLOW - November 2019 BUNDLE-UPDATE(1) + December 2019 BUNDLE-UPDATE(1) diff --git a/man/bundle-viz.1 b/man/bundle-viz.1 index 0ad8a1fa587..f1852e4206b 100644 --- a/man/bundle-viz.1 +++ b/man/bundle-viz.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE\-VIZ" "1" "November 2019" "" "" +.TH "BUNDLE\-VIZ" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile diff --git a/man/bundle-viz.1.txt b/man/bundle-viz.1.txt index c9e3ce2c2b6..7956cf18ed8 100644 --- a/man/bundle-viz.1.txt +++ b/man/bundle-viz.1.txt @@ -36,4 +36,4 @@ OPTIONS - November 2019 BUNDLE-VIZ(1) + December 2019 BUNDLE-VIZ(1) diff --git a/man/bundle.1 b/man/bundle.1 index c391270cf23..93a43c0c700 100644 --- a/man/bundle.1 +++ b/man/bundle.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "BUNDLE" "1" "November 2019" "" "" +.TH "BUNDLE" "1" "December 2019" "" "" . .SH "NAME" \fBbundle\fR \- Ruby Dependency Management diff --git a/man/bundle.1.txt b/man/bundle.1.txt index e952002870e..cd0fabadeae 100644 --- a/man/bundle.1.txt +++ b/man/bundle.1.txt @@ -113,4 +113,4 @@ OBSOLETE - November 2019 BUNDLE(1) + December 2019 BUNDLE(1) diff --git a/man/gemfile.5 b/man/gemfile.5 index 8d1ac996a0b..536af70a6e2 100644 --- a/man/gemfile.5 +++ b/man/gemfile.5 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "GEMFILE" "5" "November 2019" "" "" +.TH "GEMFILE" "5" "December 2019" "" "" . .SH "NAME" \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs diff --git a/man/gemfile.5.txt b/man/gemfile.5.txt index e7dd2c0d97e..b3da595b17a 100644 --- a/man/gemfile.5.txt +++ b/man/gemfile.5.txt @@ -646,4 +646,4 @@ SOURCE PRIORITY - November 2019 GEMFILE(5) + December 2019 GEMFILE(5) From 144b55c75d0e2e2ba0a73bce7ba9801d74970a93 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Sun, 1 Dec 2019 16:27:19 +0000 Subject: [PATCH 15/31] Merge #7464 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7464: Improve rubygems switcher r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was we have some code in our tests to make sure that the `ENV["RGV"]` variable we use to set the rubygems version we want to test bundler against is always respected, including every subprocess our tests start. However: * The code was overly complicated. * It didn't support custom branches, for example, `RGV=lazily_load_uri`. This is a feature I find very useful when a PR you're working on also need some changes in the rubygems side, like it happened to me at #7460. ### What was your diagnosis of the problem? My diagnosis was that all the code needs to do is: * Set up the location of the rubygems code we'll test bundler against, be it a path, a branch, or a released version. * Modify `RUBYOPT` to include that location in the LOAD_PATH, so that `rubygems` is always loaded from there instead of the system's version. ### What is your fix for the problem, implemented in this PR? My fix is to do just that, remove all the stuff that wasn't needed, and do a bit of renaming to improve readability. Co-authored-by: David Rodríguez (cherry picked from commit 0cb51921d238f330c91673428b53f523016cdd01) --- spec/rubygems/rubygems.rb | 9 --- spec/spec_helper.rb | 2 +- spec/support/rubygems_ext.rb | 4 +- spec/support/rubygems_version_manager.rb | 74 ++++++++---------------- 4 files changed, 29 insertions(+), 60 deletions(-) delete mode 100644 spec/rubygems/rubygems.rb diff --git a/spec/rubygems/rubygems.rb b/spec/rubygems/rubygems.rb deleted file mode 100644 index 6fa63013bfb..00000000000 --- a/spec/rubygems/rubygems.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -require_relative "../support/rubygems_version_manager" - -RubygemsVersionManager.new(ENV["RGV"]).switch - -$:.delete("#{Spec::Path.spec_dir}/rubygems") - -require "rubygems" diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9702ab71f53..ba21d22fbda 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -82,7 +82,7 @@ def self.ruby=(ruby) config.before :suite do require_relative "support/rubygems_ext" Spec::Rubygems.setup - ENV["RUBYOPT"] = "#{ENV["RUBYOPT"]} -I#{Spec::Path.spec_dir}/rubygems -r#{Spec::Path.spec_dir}/support/hax.rb" + ENV["RUBYOPT"] = "#{ENV["RUBYOPT"]} -r#{Spec::Path.spec_dir}/support/hax.rb" ENV["BUNDLE_SPEC_RUN"] = "true" ENV["BUNDLE_USER_CONFIG"] = ENV["BUNDLE_USER_CACHE"] = ENV["BUNDLE_USER_PLUGIN"] = nil ENV["GEMRC"] = nil diff --git a/spec/support/rubygems_ext.rb b/spec/support/rubygems_ext.rb index 5bfcac5ac40..39144653710 100644 --- a/spec/support/rubygems_ext.rb +++ b/spec/support/rubygems_ext.rb @@ -39,7 +39,9 @@ def dev_setup end def gem_load(gem_name, bin_container) - require_relative "../rubygems/rubygems" + require_relative "rubygems_version_manager" + RubygemsVersionManager.new(ENV["RGV"]).switch + gem_load_and_activate(gem_name, bin_container) end diff --git a/spec/support/rubygems_version_manager.rb b/spec/support/rubygems_version_manager.rb index 356d391c08b..854bce890df 100644 --- a/spec/support/rubygems_version_manager.rb +++ b/spec/support/rubygems_version_manager.rb @@ -8,27 +8,25 @@ class RubygemsVersionManager include Spec::Helpers include Spec::Path - def initialize(env_version) - @env_version = env_version + def initialize(source) + @source = source end def switch return if use_system? - unrequire_rubygems_if_needed - switch_local_copy_if_needed - prepare_environment + reexec_if_needed end private def use_system? - @env_version.nil? + @source.nil? end - def unrequire_rubygems_if_needed + def reexec_if_needed return unless rubygems_unrequire_needed? require "rbconfig" @@ -37,7 +35,8 @@ def unrequire_rubygems_if_needed ruby << RbConfig::CONFIG["EXEEXT"] cmd = [ruby, $0, *ARGV].compact - cmd[1, 0] = "--disable-gems" + + ENV["RUBYOPT"] = "-I#{local_copy_path.join("lib")} #{ENV["RUBYOPT"]}" exec(ENV, *cmd) end @@ -47,35 +46,28 @@ def switch_local_copy_if_needed Dir.chdir(local_copy_path) do sys_exec!("git remote update") - sys_exec!("git checkout #{target_tag_version} --quiet") + sys_exec!("git checkout #{target_tag} --quiet") end - end - def prepare_environment - $:.unshift File.expand_path("lib", local_copy_path) + ENV["RGV"] = local_copy_path.to_s end def rubygems_unrequire_needed? - defined?(Gem::VERSION) && Gem::VERSION != target_gem_version + !$LOADED_FEATURES.include?(local_copy_path.join("lib/rubygems.rb").to_s) end def local_copy_switch_needed? - !env_version_is_path? && target_gem_version != local_copy_version - end - - def target_gem_version - @target_gem_version ||= resolve_target_gem_version + !source_is_path? && target_tag != local_copy_tag end - def target_tag_version - @target_tag_version ||= resolve_target_tag_version + def target_tag + @target_tag ||= resolve_target_tag end - def local_copy_version - gemspec_contents = File.read(local_copy_path.join("lib/rubygems.rb")) - version_regexp = /VERSION = ["'](.*)["']/ - - version_regexp.match(gemspec_contents)[1] + def local_copy_tag + Dir.chdir(local_copy_path) do + sys_exec!("git rev-parse --abbrev-ref HEAD") + end end def local_copy_path @@ -83,7 +75,7 @@ def local_copy_path end def resolve_local_copy_path - return expanded_env_version if env_version_is_path? + return expanded_source if source_is_path? rubygems_path = root.join("tmp/rubygems") @@ -95,33 +87,17 @@ def resolve_local_copy_path rubygems_path end - def env_version_is_path? - expanded_env_version.directory? + def source_is_path? + expanded_source.directory? end - def expanded_env_version - @expanded_env_version ||= Pathname.new(@env_version).expand_path(root) + def expanded_source + @expanded_source ||= Pathname.new(@source).expand_path(root) end - def resolve_target_tag_version - return "v#{@env_version}" if @env_version.match(/^\d/) - - return "master" if @env_version == master_gem_version - - @env_version - end - - def resolve_target_gem_version - return local_copy_version if env_version_is_path? - - return @env_version[1..-1] if @env_version.match(/^v/) - - return master_gem_version if @env_version == "master" - - @env_version - end + def resolve_target_tag + return "v#{@source}" if @source.match(/^\d/) - def master_gem_version - "3.1.0.pre1" + @source end end From 2dadf376ee8d23a3109a947329d46b92a3b72a53 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Mon, 2 Dec 2019 10:13:57 +0000 Subject: [PATCH 16/31] Merge #7463 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7463: Vendor fileutils 1.4.1 r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was no big deal. Just a discrepancy between the fileutils version we're vendoring and the one that will ship with ruby 2.7. This doesn't cause any issues, but I prefer that they match. ### What is your fix for the problem, implemented in this PR? My fix is to `bin/rake vendor:fileutils[v1.4.1]` and commit the result. Co-authored-by: David Rodríguez (cherry picked from commit f6b970d0b8347681fdcf804a837876798a9230ef) --- lib/bundler/vendor/fileutils/lib/fileutils.rb | 6 +++--- lib/bundler/vendor/fileutils/lib/fileutils/version.rb | 5 ----- 2 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 lib/bundler/vendor/fileutils/lib/fileutils/version.rb diff --git a/lib/bundler/vendor/fileutils/lib/fileutils.rb b/lib/bundler/vendor/fileutils/lib/fileutils.rb index c1988dceab3..8f8faf30c84 100644 --- a/lib/bundler/vendor/fileutils/lib/fileutils.rb +++ b/lib/bundler/vendor/fileutils/lib/fileutils.rb @@ -6,8 +6,6 @@ # for make mjit-headers end -require_relative "fileutils/version" - # # = fileutils.rb # @@ -104,6 +102,7 @@ # :verbose flags to methods in Bundler::FileUtils. # module Bundler::FileUtils + VERSION = "1.4.1" def self.private_module_function(name) #:nodoc: module_function name @@ -1300,7 +1299,8 @@ def entries .reject {|n| n == '.' or n == '..' } end - files.map {|n| Entry_.new(prefix(), join(rel(), n.tap{|x| x.untaint if RUBY_VERSION < "2.7" })) } + untaint = RUBY_VERSION < '2.7' + files.map {|n| Entry_.new(prefix(), join(rel(), untaint ? n.untaint : n)) } end def stat diff --git a/lib/bundler/vendor/fileutils/lib/fileutils/version.rb b/lib/bundler/vendor/fileutils/lib/fileutils/version.rb deleted file mode 100644 index b8f616e4fb3..00000000000 --- a/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -module Bundler::FileUtils - VERSION = "1.3.0" -end From 4d77dca72a9a7208aef01c1e0fcd0dcd71195c65 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Mon, 2 Dec 2019 15:04:34 +0000 Subject: [PATCH 17/31] Merge #7462 7462: Document running tests in parallel inside a dev environment r=deivid-rodriguez a=colby-swandale ### What was the end-user problem that led to this PR? We do not have any documentation for running the test suite in parallel. Developers working on Bundler may be unaware that the test suite can be executed in parallel to help speed up the time needed to run tests. ### What is your fix for the problem, implemented in this PR? Document how to run the parallel Bundler test suit in the Contributing docs. Co-authored-by: Colby Swandale (cherry picked from commit fe91eb21cfc07e4fb5710126302d58b433c6d734) --- doc/development/SETUP.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/development/SETUP.md b/doc/development/SETUP.md index 80abe4cc6b5..6af7c071456 100644 --- a/doc/development/SETUP.md +++ b/doc/development/SETUP.md @@ -24,7 +24,11 @@ Bundler doesn't use a Gemfile to list development dependencies, because when we $ bin/rake spec -6. Set up a shell alias to run Bundler from your clone, e.g. a Bash alias ([follow these instructions](https://www.moncefbelyamani.com/create-aliases-in-bash-profile-to-assign-shortcuts-for-common-terminal-commands/) for adding aliases to your `~/.bashrc` profile): +6. Optionally, you can run the test suite in parallel: + + $ bin/parallel_rspec spec + +7. Set up a shell alias to run Bundler from your clone, e.g. a Bash alias ([follow these instructions](https://www.moncefbelyamani.com/create-aliases-in-bash-profile-to-assign-shortcuts-for-common-terminal-commands/) for adding aliases to your `~/.bashrc` profile): $ alias dbundle='/path/to/bundler/repo/bin/bundle' From e101da16143ed4974099e0521dcc53bf3777aa45 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 6 Dec 2019 21:38:11 +0000 Subject: [PATCH 18/31] Merge #7471 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7471: Vendor latest thor's master r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that I need to pull some changes from latest `thor` master to avoid loading the `uri` library for #7460. ### What is your fix for the problem, implemented in this PR? My fix is to run `bin/rake vendor:thor[master]` and commit changes. Not that I used an `automatiek` version including https://github.com/segiddins/automatiek/pull/7 that avoids some false positive when replacing namespaces. Co-authored-by: David Rodríguez (cherry picked from commit 25595896eb0f8dfd004d941093bf1d8f4a39aeeb) --- lib/bundler/vendor/thor/lib/thor.rb | 7 +++++ lib/bundler/vendor/thor/lib/thor/actions.rb | 16 +++++++----- lib/bundler/vendor/thor/lib/thor/base.rb | 26 +++++++++++-------- .../thor/lib/thor/core_ext/io_binary_read.rb | 12 --------- .../vendor/thor/lib/thor/parser/arguments.rb | 2 +- .../vendor/thor/lib/thor/parser/option.rb | 15 +++++++++-- lib/bundler/vendor/thor/lib/thor/runner.rb | 17 ++++++------ .../vendor/thor/lib/thor/shell/basic.rb | 11 +++++++- .../vendor/thor/lib/thor/shell/html.rb | 4 +-- lib/bundler/vendor/thor/lib/thor/util.rb | 18 ++++++++++++- 10 files changed, 83 insertions(+), 45 deletions(-) delete mode 100644 lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb diff --git a/lib/bundler/vendor/thor/lib/thor.rb b/lib/bundler/vendor/thor/lib/thor.rb index f2a03388cc3..01c0b2f83c8 100644 --- a/lib/bundler/vendor/thor/lib/thor.rb +++ b/lib/bundler/vendor/thor/lib/thor.rb @@ -344,6 +344,13 @@ def disable_required_check?(command) #:nodoc: command && disable_required_check.include?(command.name.to_sym) end + def deprecation_warning(message) #:nodoc: + unless ENV['THOR_SILENCE_DEPRECATION'] + warn "Deprecation warning: #{message}\n" + + 'You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.' + end + end + protected def stop_on_unknown_option #:nodoc: diff --git a/lib/bundler/vendor/thor/lib/thor/actions.rb b/lib/bundler/vendor/thor/lib/thor/actions.rb index 39ce67e1420..a5368d07f30 100644 --- a/lib/bundler/vendor/thor/lib/thor/actions.rb +++ b/lib/bundler/vendor/thor/lib/thor/actions.rb @@ -1,5 +1,3 @@ -require "uri" -require_relative "core_ext/io_binary_read" require_relative "actions/create_file" require_relative "actions/create_link" require_relative "actions/directory" @@ -258,13 +256,19 @@ def run(command, config = {}) return if options[:pretend] - result = config[:capture] ? `#{command}` : system(command.to_s) + env_splat = [config[:env]] if config[:env] - if config[:abort_on_failure] - success = config[:capture] ? $?.success? : result - abort unless success + if config[:capture] + require "open3" + result, status = Open3.capture2e(*env_splat, command.to_s) + success = status.success? + else + result = system(*env_splat, command.to_s) + success = result end + abort if !success && config.fetch(:abort_on_failure, self.class.exit_on_failure?) + result end diff --git a/lib/bundler/vendor/thor/lib/thor/base.rb b/lib/bundler/vendor/thor/lib/thor/base.rb index 6089fd3dc4f..bd2ebb61565 100644 --- a/lib/bundler/vendor/thor/lib/thor/base.rb +++ b/lib/bundler/vendor/thor/lib/thor/base.rb @@ -153,17 +153,20 @@ def check_unknown_options?(config) #:nodoc: # If you want to raise an error when the default value of an option does not match # the type call check_default_type! - # This is disabled by default for compatibility. + # This will be the default; for compatibility a deprecation warning is issued if necessary. def check_default_type! @check_default_type = true end - def check_default_type #:nodoc: - @check_default_type ||= from_superclass(:check_default_type, false) + # If you want to use defaults that don't match the type of an option, + # either specify `check_default_type: false` or call `allow_incompatible_default_type!` + def allow_incompatible_default_type! + @check_default_type = false end - def check_default_type? #:nodoc: - !!check_default_type + def check_default_type #:nodoc: + @check_default_type = from_superclass(:check_default_type, nil) unless defined?(@check_default_type) + @check_default_type end # If true, option parsing is suspended as soon as an unknown option or a @@ -506,6 +509,12 @@ def handle_argument_error(command, error, args, arity) #:nodoc: raise InvocationError, msg end + # A flag that makes the process exit with status 1 if any error happens. + def exit_on_failure? + 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}`" + false + end + protected # Prints the class options per group. If an option does not belong to @@ -563,7 +572,7 @@ def is_thor_reserved_word?(word, type) #:nodoc: # options:: Described in both class_option and method_option. # scope:: Options hash that is being built up def build_option(name, options, scope) #:nodoc: - scope[name] = Bundler::Thor::Option.new(name, options.merge(:check_default_type => check_default_type?)) + scope[name] = Bundler::Thor::Option.new(name, {:check_default_type => check_default_type}.merge!(options)) end # Receives a hash of options, parse them and add to the scope. This is a @@ -643,11 +652,6 @@ def from_superclass(method, default = nil) end end - # A flag that makes the process exit with status 1 if any error happens. - def exit_on_failure? - false - end - # # The basename of the program invoking the thor class. # diff --git a/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb b/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb deleted file mode 100644 index 0f6e2e0af2f..00000000000 --- a/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +++ /dev/null @@ -1,12 +0,0 @@ -class IO #:nodoc: - class << self - unless method_defined? :binread - def binread(file, *args) - raise ArgumentError, "wrong number of arguments (#{1 + args.size} for 1..3)" unless args.size < 3 - File.open(file, "rb") do |f| - f.read(*args) - end - end - end - end -end diff --git a/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb b/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb index a17a3fcf22a..d0f43e2d971 100644 --- a/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +++ b/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb @@ -82,7 +82,7 @@ def unshift(arg) end def current_is_value? - peek && peek.to_s !~ /^-/ + peek && peek.to_s !~ /^-{1,2}\S+/ end # Runs through the argument array getting strings that contains ":" and diff --git a/lib/bundler/vendor/thor/lib/thor/parser/option.rb b/lib/bundler/vendor/thor/lib/thor/parser/option.rb index 0ddd472b432..5a5af6f8888 100644 --- a/lib/bundler/vendor/thor/lib/thor/parser/option.rb +++ b/lib/bundler/vendor/thor/lib/thor/parser/option.rb @@ -112,7 +112,7 @@ def #{type}? def validate! raise ArgumentError, "An option cannot be boolean and required." if boolean? && required? - validate_default_type! if @check_default_type + validate_default_type! end def validate_default_type! @@ -130,7 +130,18 @@ def validate_default_type! end expected_type = (@repeatable && @type != :hash) ? :array : @type - raise ArgumentError, "Expected #{expected_type} default value for '#{switch_name}'; got #{@default.inspect} (#{default_type})" unless default_type == expected_type + + if default_type != expected_type + err = "Expected #{expected_type} default value for '#{switch_name}'; got #{@default.inspect} (#{default_type})" + + if @check_default_type + raise ArgumentError, err + elsif @check_default_type == nil + Bundler::Thor.deprecation_warning "#{err}.\n" + + 'This will be rejected in the future unless you explicitly pass the options `check_default_type: false`' + + ' or call `allow_incompatible_default_type!` in your code' + end + end end def dasherized? diff --git a/lib/bundler/vendor/thor/lib/thor/runner.rb b/lib/bundler/vendor/thor/lib/thor/runner.rb index 48d33d7ac34..54c55250937 100644 --- a/lib/bundler/vendor/thor/lib/thor/runner.rb +++ b/lib/bundler/vendor/thor/lib/thor/runner.rb @@ -1,6 +1,5 @@ require_relative "../thor" require_relative "group" -require_relative "core_ext/io_binary_read" require "yaml" require "digest/md5" @@ -67,7 +66,7 @@ def install(name) # rubocop:disable MethodLength raise Error, "Error opening file '#{name}'" end - say "Your Bundler::Thorfile contains:" + say "Your Thorfile contains:" say contents unless options["force"] @@ -206,7 +205,7 @@ def save_yaml(yaml) File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml } end - # Load the Bundler::Thorfiles. If relevant_to is supplied, looks for specific files + # Load the Thorfiles. If relevant_to is supplied, looks for specific files # in the thor_root instead of loading them all. # # By default, it also traverses the current path until find Bundler::Thor files, as @@ -219,11 +218,11 @@ def initialize_thorfiles(relevant_to = nil, skip_lookup = false) end end - # Finds Bundler::Thorfiles by traversing from your current directory down to the root + # Finds Thorfiles by traversing from your current directory down to the root # directory of your system. If at any time we find a Bundler::Thor file, we stop. # - # We also ensure that system-wide Bundler::Thorfiles are loaded first, so local - # Bundler::Thorfiles can override them. + # We also ensure that system-wide Thorfiles are loaded first, so local + # Thorfiles can override them. # # ==== Example # @@ -231,7 +230,7 @@ def initialize_thorfiles(relevant_to = nil, skip_lookup = false) # # 1. /Users/wycats/dev/thor # 2. /Users/wycats/dev - # 3. /Users/wycats <-- we find a Bundler::Thorfile here, so we stop + # 3. /Users/wycats <-- we find a Thorfile here, so we stop # # Suppose we start at c:\Documents and Settings\james\dev\thor ... # @@ -239,7 +238,7 @@ def initialize_thorfiles(relevant_to = nil, skip_lookup = false) # 2. c:\Documents and Settings\james\dev # 3. c:\Documents and Settings\james # 4. c:\Documents and Settings - # 5. c:\ <-- no Bundler::Thorfiles found! + # 5. c:\ <-- no Thorfiles found! # def thorfiles(relevant_to = nil, skip_lookup = false) thorfiles = [] @@ -260,7 +259,7 @@ def thorfiles(relevant_to = nil, skip_lookup = false) end end - # Load Bundler::Thorfiles relevant to the given method. If you provide "foo:bar" it + # Load Thorfiles relevant to the given method. If you provide "foo:bar" it # will load all thor files in the thor.yaml that has "foo" e "foo:bar" # namespaces registered. # diff --git a/lib/bundler/vendor/thor/lib/thor/shell/basic.rb b/lib/bundler/vendor/thor/lib/thor/shell/basic.rb index 52648fee8fe..be48358cb11 100644 --- a/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +++ b/lib/bundler/vendor/thor/lib/thor/shell/basic.rb @@ -451,16 +451,25 @@ def ask_simply(statement, color, options) def ask_filtered(statement, color, options) answer_set = options[:limited_to] + case_insensitive = options.fetch(:case_insensitive, false) correct_answer = nil until correct_answer answers = answer_set.join(", ") answer = ask_simply("#{statement} [#{answers}]", color, options) - correct_answer = answer_set.include?(answer) ? answer : nil + correct_answer = answer_match(answer_set, answer, case_insensitive) say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer end correct_answer end + def answer_match(possibilities, answer, case_insensitive) + if case_insensitive + possibilities.detect{ |possibility| possibility.downcase == answer.downcase } + else + possibilities.detect{ |possibility| possibility == answer } + end + end + def merge(destination, content) #:nodoc: require "tempfile" Tempfile.open([File.basename(destination), File.extname(destination)], File.dirname(destination)) do |temp| diff --git a/lib/bundler/vendor/thor/lib/thor/shell/html.rb b/lib/bundler/vendor/thor/lib/thor/shell/html.rb index 55262f19cc5..77a6d13a233 100644 --- a/lib/bundler/vendor/thor/lib/thor/shell/html.rb +++ b/lib/bundler/vendor/thor/lib/thor/shell/html.rb @@ -51,13 +51,13 @@ class HTML < Basic def set_color(string, *colors) if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) } html_colors = colors.map { |color| lookup_color(color) } - "#{string}" + "#{Bundler::Thor::Util.escape_html(string)}" else color, bold = colors html_color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol) styles = [html_color] styles << BOLD if bold - "#{string}" + "#{Bundler::Thor::Util.escape_html(string)}" end end diff --git a/lib/bundler/vendor/thor/lib/thor/util.rb b/lib/bundler/vendor/thor/lib/thor/util.rb index 0fe7d4d8599..ddf4d21b90b 100644 --- a/lib/bundler/vendor/thor/lib/thor/util.rb +++ b/lib/bundler/vendor/thor/lib/thor/util.rb @@ -211,7 +211,7 @@ def thor_root_glob # def globs_for(path) path = escape_globs(path) - ["#{path}/Bundler::Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"] + ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"] end # Return the path to the ruby interpreter taking into account multiple @@ -263,6 +263,22 @@ def ruby_command def escape_globs(path) path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&') end + + # Returns a string that has had any HTML characters escaped. + # + # ==== Examples + # + # Bundler::Thor::Util.escape_html('
') # => "<div>" + # + # ==== Parameters + # String + # + # ==== Returns + # String + # + def escape_html(string) + CGI.escapeHTML(string) + end end end end From cd3fb55c06b18673f2cfbb946d6fc81375afa3ea Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Sun, 8 Dec 2019 12:04:13 +0000 Subject: [PATCH 19/31] Merge #7473 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7473: Cleanup some unnecessary code r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was #7460 is very big so I want to extract these changes to a separate PR, so that we're more aware of them. ### What was your diagnosis of the problem? My diagnosis was that this code can be removed. In particular, in the `GemRemoteFetcher` class there was the following comment https://github.com/bundler/bundler/blob/25595896eb0f8dfd004d941093bf1d8f4a39aeeb/lib/bundler/gem_remote_fetcher.rb#L9-L10 After having a look, I think the comment would make sense if where it says "gemstash", it actually meant "bundler". That would make sense to me since this is about fetching remote specs, so I would assume it's the client side running it. Assuming this is the correct interpretation, we can remove the code since our minimum supported rubygems version is 2.5.2, and this code was included in rubygems in 2.5.0. ### What is your fix for the problem, implemented in this PR? My fix is to remove the `GemRemoteFetcher` class, plus simplify other related code. Co-authored-by: David Rodríguez (cherry picked from commit bada03dd6d4d15828fb5b2cf7f744948e88a69a3) --- lib/bundler.rb | 1 - lib/bundler/gem_remote_fetcher.rb | 43 ----------------------- lib/bundler/rubygems_integration.rb | 18 +++------- spec/bundler/rubygems_integration_spec.rb | 2 +- 4 files changed, 6 insertions(+), 58 deletions(-) delete mode 100644 lib/bundler/gem_remote_fetcher.rb diff --git a/lib/bundler.rb b/lib/bundler.rb index 3b494a6cdf1..df345539c8c 100644 --- a/lib/bundler.rb +++ b/lib/bundler.rb @@ -50,7 +50,6 @@ module Bundler autoload :FeatureFlag, File.expand_path("bundler/feature_flag", __dir__) autoload :GemHelper, File.expand_path("bundler/gem_helper", __dir__) autoload :GemHelpers, File.expand_path("bundler/gem_helpers", __dir__) - autoload :GemRemoteFetcher, File.expand_path("bundler/gem_remote_fetcher", __dir__) autoload :GemVersionPromoter, File.expand_path("bundler/gem_version_promoter", __dir__) autoload :Graph, File.expand_path("bundler/graph", __dir__) autoload :Index, File.expand_path("bundler/index", __dir__) diff --git a/lib/bundler/gem_remote_fetcher.rb b/lib/bundler/gem_remote_fetcher.rb deleted file mode 100644 index 9577535d63c..00000000000 --- a/lib/bundler/gem_remote_fetcher.rb +++ /dev/null @@ -1,43 +0,0 @@ -# frozen_string_literal: true - -require "rubygems/remote_fetcher" - -module Bundler - # Adds support for setting custom HTTP headers when fetching gems from the - # server. - # - # TODO: Get rid of this when and if gemstash only supports RubyGems versions - # that contain https://github.com/rubygems/rubygems/commit/3db265cc20b2f813. - class GemRemoteFetcher < Gem::RemoteFetcher - attr_accessor :headers - - # Extracted from RubyGems 2.4. - def fetch_http(uri, last_modified = nil, head = false, depth = 0) - fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get - # beginning of change - response = request uri, fetch_type, last_modified do |req| - headers.each {|k, v| req.add_field(k, v) } if headers - end - # end of change - - case response - when Net::HTTPOK, Net::HTTPNotModified then - response.uri = uri if response.respond_to? :uri - head ? response : response.body - when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther, - Net::HTTPTemporaryRedirect then - raise FetchError.new("too many redirects", uri) if depth > 10 - - location = URI.parse response["Location"] - - if https?(uri) && !https?(location) - raise FetchError.new("redirecting to non-https resource: #{location}", uri) - end - - fetch_http(location, last_modified, head, depth + 1) - else - raise FetchError.new("bad response #{response.message} #{response.code}", uri) - end - end - end -end diff --git a/lib/bundler/rubygems_integration.rb b/lib/bundler/rubygems_integration.rb index c4950d14e8d..bb632096329 100644 --- a/lib/bundler/rubygems_integration.rb +++ b/lib/bundler/rubygems_integration.rb @@ -247,12 +247,6 @@ def ext_lock EXT_LOCK end - def fetch_prerelease_specs - fetch_specs(false, true) - rescue Gem::RemoteFetcher::FetchError - {} # if we can't download them, there aren't any - end - def with_build_args(args) ext_lock.synchronize do old_args = build_args @@ -531,8 +525,8 @@ def stub_rubygems(specs) end end - def fetch_specs(source, remote, name) - path = source + "#{name}.#{Gem.marshal_version}.gz" + def fetch_specs(remote, name) + path = remote.uri.to_s + "#{name}.#{Gem.marshal_version}.gz" fetcher = gem_remote_fetcher fetcher.headers = { "X-Gemfile-Source" => remote.original_uri.to_s } if remote.original_uri string = fetcher.fetch_path(path) @@ -543,10 +537,8 @@ def fetch_specs(source, remote, name) end def fetch_all_remote_specs(remote) - source = remote.uri.is_a?(URI) ? remote.uri : URI.parse(source.to_s) - - specs = fetch_specs(source, remote, "specs") - pres = fetch_specs(source, remote, "prerelease_specs") || [] + specs = fetch_specs(remote, "specs") + pres = fetch_specs(remote, "prerelease_specs") || [] specs.concat(pres) end @@ -564,7 +556,7 @@ def gem_remote_fetcher require "resolv" proxy = configuration[:http_proxy] dns = Resolv::DNS.new - Bundler::GemRemoteFetcher.new(proxy, dns) + Gem::RemoteFetcher.new(proxy, dns) end def gem_from_path(path, policy = nil) diff --git a/spec/bundler/rubygems_integration_spec.rb b/spec/bundler/rubygems_integration_spec.rb index 26cbaa630b2..ce2b1000884 100644 --- a/spec/bundler/rubygems_integration_spec.rb +++ b/spec/bundler/rubygems_integration_spec.rb @@ -67,7 +67,7 @@ end describe "#fetch_all_remote_specs" do - let(:uri) { URI("https://example.com") } + let(:uri) { "https://example.com" } let(:fetcher) { double("gem_remote_fetcher") } let(:specs_response) { Marshal.dump(["specs"]) } let(:prerelease_specs_response) { Marshal.dump(["prerelease_specs"]) } From 4e5e9cd49b16f136482505de6a3258aabdb26a99 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Thu, 12 Dec 2019 12:09:52 +0000 Subject: [PATCH 20/31] Merge #7474 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7474: Fix `bundle exec rake install` failing r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that I noticed `bundle exec rake install` was failing on my gem using the latest prerelease of bundler. ### What was your diagnosis of the problem? My diagnosis was that `bundler` silences output of rubygems by default, and in a `bundle exec` context, `bundler/setup` is always required by subprocesses. So, the `rake install` task is silencing rubygems, but it requires it to not be silent: https://github.com/bundler/bundler/blob/bada03dd6d4d15828fb5b2cf7f744948e88a69a3/lib/bundler/gem_helper.rb#L91-L92 ### What is your fix for the problem, implemented in this PR? My fix is to wrap the execution of the rubygems subprocess with `Bundler.with_original_env` so that the `gem` command runs without `bundler` involved. Co-authored-by: David Rodríguez (cherry picked from commit f44ebf017001239a3e66589dff5aa77f631ca6e2) --- lib/bundler/gem_helper.rb | 22 ++++++++++++---------- spec/commands/clean_spec.rb | 2 +- spec/commands/exec_spec.rb | 2 +- spec/commands/outdated_spec.rb | 2 +- spec/runtime/gem_tasks_spec.rb | 24 +++++++++++++++++++++++- spec/runtime/setup_spec.rb | 12 ++++++------ spec/support/path.rb | 2 +- 7 files changed, 45 insertions(+), 21 deletions(-) diff --git a/lib/bundler/gem_helper.rb b/lib/bundler/gem_helper.rb index 46a66432337..7d4e382be8c 100644 --- a/lib/bundler/gem_helper.rb +++ b/lib/bundler/gem_helper.rb @@ -73,8 +73,7 @@ def install def build_gem file_name = nil - gem = ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem" - sh("#{gem} build -V #{spec_path}".shellsplit) do + sh("#{gem_command} build -V #{spec_path}".shellsplit) do file_name = File.basename(built_gem_path) SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) } FileUtils.mv(built_gem_path, "pkg") @@ -85,11 +84,10 @@ def build_gem def install_gem(built_gem_path = nil, local = false) built_gem_path ||= build_gem - gem = ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem" - cmd = "#{gem} install #{built_gem_path}" + cmd = "#{gem_command} install #{built_gem_path}" cmd += " --local" if local - out, status = sh_with_status(cmd.shellsplit) - unless status.success? && out[/Successfully installed/] + _, status = sh_with_status(cmd.shellsplit) + unless status.success? raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output" end Bundler.ui.confirm "#{name} (#{version}) installed." @@ -98,13 +96,13 @@ def install_gem(built_gem_path = nil, local = false) protected def rubygem_push(path) - gem_command = %W[gem push #{path}] - gem_command << "--key" << gem_key if gem_key - gem_command << "--host" << allowed_push_host if allowed_push_host + cmd = %W[#{gem_command} push #{path}] + cmd << "--key" << gem_key if gem_key + cmd << "--host" << allowed_push_host if allowed_push_host unless allowed_push_host || Bundler.user_home.join(".gem/credentials").file? raise "Your rubygems.org credentials aren't set. Run `gem push` to set them." end - sh_with_input(gem_command) + sh_with_input(cmd) Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}" end @@ -211,5 +209,9 @@ def gem_key def gem_push? !%w[n no nil false off 0].include?(ENV["gem_push"].to_s.downcase) end + + def gem_command + ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem" + end end end diff --git a/spec/commands/clean_spec.rb b/spec/commands/clean_spec.rb index 7f9f84c104e..5cc97de9122 100644 --- a/spec/commands/clean_spec.rb +++ b/spec/commands/clean_spec.rb @@ -782,7 +782,7 @@ def should_not_have_gems(*gems) expect(vendored_gems("bundler/gems/very_simple_git_binary-1.0-#{revision[0..11]}")).to exist bundle! :clean - expect(out).to eq("") + expect(out).to be_empty expect(vendored_gems("bundler/gems/extensions")).to exist expect(vendored_gems("bundler/gems/very_simple_git_binary-1.0-#{revision[0..11]}")).to exist diff --git a/spec/commands/exec_spec.rb b/spec/commands/exec_spec.rb index d2e85a289bf..a5d67c6d682 100644 --- a/spec/commands/exec_spec.rb +++ b/spec/commands/exec_spec.rb @@ -104,7 +104,7 @@ install_gemfile "" sys_exec "#{Gem.ruby} #{command.path}" - expect(out).to eq("") + expect(out).to be_empty expect(err).to be_empty end diff --git a/spec/commands/outdated_spec.rb b/spec/commands/outdated_spec.rb index ab549257564..6e82d34b056 100644 --- a/spec/commands/outdated_spec.rb +++ b/spec/commands/outdated_spec.rb @@ -228,7 +228,7 @@ def test_group_option(group = nil, gems_list_size = 1) context "and no gems are outdated" do it "has empty output" do subject - expect(out).to eq("") + expect(out).to be_empty end end end diff --git a/spec/runtime/gem_tasks_spec.rb b/spec/runtime/gem_tasks_spec.rb index 4760b6a7490..4b92de76bba 100644 --- a/spec/runtime/gem_tasks_spec.rb +++ b/spec/runtime/gem_tasks_spec.rb @@ -6,15 +6,25 @@ f.write <<-GEMSPEC Gem::Specification.new do |s| s.name = "foo" + s.version = "1.0" + s.summary = "dummy" + s.author = "Perry Mason" end GEMSPEC end + bundled_app("Rakefile").open("w") do |f| f.write <<-RAKEFILE $:.unshift("#{lib_dir}") require "bundler/gem_tasks" RAKEFILE end + + install_gemfile! <<-G + source "#{file_uri_for(gem_repo1)}" + + gem "rake" + G end it "includes the relevant tasks" do @@ -22,7 +32,7 @@ sys_exec "#{rake} -T", "RUBYOPT" => "-I#{lib_dir}" end - expect(err).to eq("") + expect(err).to be_empty expected_tasks = [ "rake build", "rake clean", @@ -35,6 +45,18 @@ expect(exitstatus).to eq(0) if exitstatus end + it "defines a working `rake install` task" do + with_gem_path_as(Spec::Path.base_system_gems.to_s) do + sys_exec "#{rake} install", "RUBYOPT" => "-I#{lib_dir}" + end + + expect(err).to be_empty + + bundle! "exec rake install" + + expect(err).to be_empty + end + it "adds 'pkg' to rake/clean's CLOBBER" do with_gem_path_as(Spec::Path.base_system_gems.to_s) do sys_exec! %(#{rake} -e 'load "Rakefile"; puts CLOBBER.inspect') diff --git a/spec/runtime/setup_spec.rb b/spec/runtime/setup_spec.rb index 80c38e9f4a6..8769b00426c 100644 --- a/spec/runtime/setup_spec.rb +++ b/spec/runtime/setup_spec.rb @@ -130,7 +130,7 @@ def clean_load_path(lp) load_path = out.split("\n") rack_load_order = load_path.index {|path| path.include?("rack") } - expect(err).to eq("") + expect(err).to be_empty expect(load_path).to include(a_string_ending_with("dash_i_dir"), "rubylib_dir") expect(rack_load_order).to be > 0 end @@ -1042,7 +1042,7 @@ def Bundler.require(path) RUBY expect(err).to be_empty - expect(out).to eq("") + expect(out).to be_empty end end @@ -1098,8 +1098,8 @@ def lock_with(bundler_version = nil) it "does not change the lock or warn" do lockfile lock_with(Bundler::VERSION.succ) ruby "require '#{lib_dir}/bundler/setup'" - expect(out).to eq("") - expect(err).to eq("") + expect(out).to be_empty + expect(err).to be_empty lockfile_should_be lock_with(Bundler::VERSION.succ) end end @@ -1162,8 +1162,8 @@ def lock_with(ruby_version = nil) let(:ruby_version) { "5.5.5" } it "does not change the lock or warn" do expect { ruby! "require '#{lib_dir}/bundler/setup'" }.not_to change { lockfile } - expect(out).to eq("") - expect(err).to eq("") + expect(out).to be_empty + expect(err).to be_empty end end diff --git a/spec/support/path.rb b/spec/support/path.rb index 3e42589f4d3..1c142e2643e 100644 --- a/spec/support/path.rb +++ b/spec/support/path.rb @@ -22,7 +22,7 @@ def bindir end def gem_bin - @gem_bin ||= ruby_core? ? ENV["GEM_COMMAND"] : "#{Gem.ruby} -I#{spec_dir}/rubygems -S gem --backtrace" + @gem_bin ||= ruby_core? ? ENV["GEM_COMMAND"] : "#{Gem.ruby} -S gem --backtrace" end def spec_dir From f14fc9a2659f9ac155eb38d10e1960df43eae67a Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Thu, 12 Dec 2019 16:45:34 +0000 Subject: [PATCH 21/31] Merge #7476 7476: Bump RuboCop to 0.77.0 r=deivid-rodriguez a=koic ### What was the end-user problem that led to this PR? RuboCop 0.77.0 has been released. https://github.com/rubocop-hq/rubocop/releases/tag/v0.77.0 This PR updates the following changes. ```console % bin/rake rubocop bin/rubocop --parallel Error: The `Layout/AlignArray` cop has been renamed to `Layout/ArrayAlignment`. (obsolete configuration found in .rubocop.yml, please update it) The `Layout/AlignParameters` cop has been renamed to `Layout/ParameterAlignment`. (obsolete configuration found in .rubocop.yml, please update it) The `Layout/IndentAssignment` cop has been renamed to `Layout/AssignmentIndentation`. (obsolete configuration found in .rubocop.yml, please update it) The `Layout/IndentFirstArgument` cop has been renamed to `Layout/FirstArgumentIndentation`. (obsolete configuration found in .rubocop.yml, please update it) The `Layout/IndentFirstArrayElement` cop has been renamed to `Layout/FirstArrayElementIndentation`. (obsolete configuration found in .rubocop.yml, please update it) The `Layout/IndentFirstHashElement` cop has been renamed to `Layout/FirstHashElementIndentation`. (obsolete configuration found in .rubocop.yml, please update it) The `Layout/LeadingBlankLines` cop has been renamed to `Layout/LeadingEmptyLines`. (obsolete configuration found in .rubocop.yml, please update it) The `Layout/TrailingBlankLines` cop has been renamed to `Layout/TrailingEmptyLines`. (obsolete configuration found in .rubocop.yml, please update it) The `Lint/DuplicatedKey` cop has been renamed to `Lint/DuplicateHashKey`. (obsolete configuration found in .rubocop.yml, please update it) The `Lint/MultipleCompare` cop has been renamed to `Lint/MultipleComparison`. (obsolete configuration found in .rubocop.yml, please update it) The `Lint/StringConversionInInterpolation` cop has been renamed to `Lint/RedundantStringCoercion`. (obsolete configuration found in .rubocop.yml, please update it) The `Naming/UncommunicativeBlockParamName` cop has been renamed to `Naming/BlockParameterName`. (obsolete configuration found in .rubocop.yml, please update it) rake aborted! Command failed with status (2): [bin/rubocop --parallel...] /Users/koic/src/github.com/bundler/bundler/Rakefile:123:in `block in ' /Users/koic/src/github.com/bundler/bundler/Rakefile:15:in `block in invoke' /Users/koic/src/github.com/bundler/bundler/Rakefile:14:in `invoke' /Users/koic/src/github.com/bundler/bundler/spec/support/rubygems_ext.rb:87:in `load' /Users/koic/src/github.com/bundler/bundler/spec/support/rubygems_ext.rb:87:in `gem_load_and_activate' /Users/koic/src/github.com/bundler/bundler/spec/support/rubygems_ext.rb:45:in `gem_load' Tasks: TOP => rubocop (See full trace by running task with --trace) ``` ### What is your fix for the problem, implemented in this PR? And this PR has auto-correction of .rubocop.yml using Mry gem. https://github.com/pocke/mry ```console % gem i mry Fetching mry-0.77.0.2.gem Successfully installed mry-0.77.0.2 1 gem installed % mry .rubocop.yml ``` Co-authored-by: Koichi ITO (cherry picked from commit 14d23844689aac341957b3b6bc6b336beb14588b) --- .rubocop.yml | 24 ++++++++++++------------ spec/support/rubygems_ext.rb | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 99f84d8ef02..604300a1179 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -55,7 +55,7 @@ Lint/DuplicateCaseCondition: Lint/DuplicateMethods: Enabled: true -Lint/DuplicatedKey: +Lint/DuplicateHashKey: Enabled: true Lint/EachWithObjectArgument: @@ -106,7 +106,7 @@ Lint/LiteralInInterpolation: Lint/Loop: Enabled: true -Lint/MultipleCompare: +Lint/MultipleComparison: Enabled: true Lint/NestedPercentLiteral: @@ -171,7 +171,7 @@ Lint/ShadowedArgument: Lint/ShadowingOuterLocalVariable: Enabled: true -Lint/StringConversionInInterpolation: +Lint/RedundantStringCoercion: Enabled: true Lint/Syntax: @@ -213,10 +213,10 @@ Layout/AccessModifierIndentation: Enabled: true EnforcedStyle: outdent -Layout/AlignArray: +Layout/ArrayAlignment: Enabled: true -Layout/AlignParameters: +Layout/ParameterAlignment: Enabled: true EnforcedStyle: with_fixed_indentation @@ -292,18 +292,18 @@ Layout/EndOfLine: Layout/ExtraSpacing: Enabled: true -Layout/IndentAssignment: +Layout/AssignmentIndentation: Enabled: true -Layout/IndentFirstArrayElement: +Layout/FirstArrayElementIndentation: Enabled: true EnforcedStyle: consistent -Layout/IndentFirstHashElement: +Layout/FirstHashElementIndentation: Enabled: true EnforcedStyle: special_inside_parentheses -Layout/IndentFirstArgument: +Layout/FirstArgumentIndentation: Enabled: true Layout/IndentationConsistency: @@ -315,7 +315,7 @@ Layout/IndentationWidth: Layout/InitialIndentation: Enabled: true -Layout/LeadingBlankLines: +Layout/LeadingEmptyLines: Enabled: true Layout/LeadingCommentSpace: @@ -386,7 +386,7 @@ Layout/SpaceInsideStringInterpolation: Layout/Tab: Enabled: true -Layout/TrailingBlankLines: +Layout/TrailingEmptyLines: Enabled: true Layout/TrailingWhitespace: @@ -415,7 +415,7 @@ Naming/HeredocDelimiterCase: Naming/MethodName: Enabled: true -Naming/UncommunicativeBlockParamName: +Naming/BlockParameterName: Enabled: true Naming/VariableName: diff --git a/spec/support/rubygems_ext.rb b/spec/support/rubygems_ext.rb index 39144653710..7e9e8328c58 100644 --- a/spec/support/rubygems_ext.rb +++ b/spec/support/rubygems_ext.rb @@ -10,7 +10,7 @@ module Rubygems "rake" => "~> 12.0", "ronn" => "~> 0.7.3", "rspec" => "~> 3.8", - "rubocop" => "= 0.76.0", + "rubocop" => "= 0.77.0", "rubocop-performance" => "= 1.5.1", }.freeze From 614f189397ff411db6a2a31a0e904386315ce44c Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 13 Dec 2019 10:07:09 +0000 Subject: [PATCH 22/31] Merge #7460 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7460: Vendor `uri` library r=hsbt a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that after the gemification of the `uri` library (which will happen in ruby 2.7), `bundler` will activate the default version of the new library inside its own `bundler/setup` code. That means users won't be able to specify the version of the library they want/need to use in their own Gemfiles. ### What was your diagnosis of the problem? My diagnosis was that we should avoid using `uri` inside `bundler/setup` code. ### What is your fix for the problem, implemented in this PR? My fix is to vendor the `uri` library, like we did with `fileutils`. Co-authored-by: David Rodríguez (cherry picked from commit 6394536271a0326efd4ed3544b78e528da7e90b1) --- Rakefile | 8 + lib/bundler/cli.rb | 2 +- lib/bundler/fetcher.rb | 4 +- lib/bundler/fetcher/downloader.rb | 2 +- lib/bundler/fetcher/index.rb | 2 +- lib/bundler/lazy_specification.rb | 1 - lib/bundler/mirror.rb | 6 +- lib/bundler/plugin/api/source.rb | 6 +- lib/bundler/remote_specification.rb | 2 - lib/bundler/settings.rb | 11 +- lib/bundler/source/git.rb | 3 +- lib/bundler/source/git/git_proxy.rb | 2 +- lib/bundler/source/rubygems.rb | 6 +- lib/bundler/source/rubygems/remote.rb | 2 +- lib/bundler/uri_credentials_filter.rb | 10 +- .../lib/net/http/persistent.rb | 52 +- lib/bundler/vendor/uri/lib/uri.rb | 104 ++ lib/bundler/vendor/uri/lib/uri/common.rb | 744 ++++++++ lib/bundler/vendor/uri/lib/uri/file.rb | 94 + lib/bundler/vendor/uri/lib/uri/ftp.rb | 267 +++ lib/bundler/vendor/uri/lib/uri/generic.rb | 1568 +++++++++++++++++ lib/bundler/vendor/uri/lib/uri/http.rb | 88 + lib/bundler/vendor/uri/lib/uri/https.rb | 23 + lib/bundler/vendor/uri/lib/uri/ldap.rb | 261 +++ lib/bundler/vendor/uri/lib/uri/ldaps.rb | 21 + lib/bundler/vendor/uri/lib/uri/mailto.rb | 294 ++++ .../vendor/uri/lib/uri/rfc2396_parser.rb | 546 ++++++ .../vendor/uri/lib/uri/rfc3986_parser.rb | 125 ++ lib/bundler/vendor/uri/lib/uri/version.rb | 6 + lib/bundler/vendored_uri.rb | 4 + spec/bundler/fetcher/base_spec.rb | 6 +- spec/bundler/fetcher/compact_index_spec.rb | 2 +- spec/bundler/fetcher/dependency_spec.rb | 4 +- spec/bundler/fetcher/downloader_spec.rb | 26 +- spec/bundler/fetcher/index_spec.rb | 2 +- spec/bundler/fetcher_spec.rb | 4 +- spec/bundler/mirror_spec.rb | 16 +- spec/bundler/rubygems_integration_spec.rb | 4 +- spec/bundler/settings_spec.rb | 10 +- spec/bundler/source/rubygems/remote_spec.rb | 20 +- spec/bundler/source_list_spec.rb | 4 +- spec/bundler/uri_credentials_filter_spec.rb | 10 +- spec/bundler/vendored_persistent_spec.rb | 4 +- spec/realworld/edgecases_spec.rb | 2 +- spec/spec_helper.rb | 2 +- spec/support/path.rb | 2 - 46 files changed, 4267 insertions(+), 115 deletions(-) create mode 100644 lib/bundler/vendor/uri/lib/uri.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/common.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/file.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/ftp.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/generic.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/http.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/https.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/ldap.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/ldaps.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/mailto.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb create mode 100644 lib/bundler/vendor/uri/lib/uri/version.rb create mode 100644 lib/bundler/vendored_uri.rb diff --git a/Rakefile b/Rakefile index 5fe293a8633..eb37dffd9a0 100644 --- a/Rakefile +++ b/Rakefile @@ -268,6 +268,14 @@ else sublib.prefix = "Bundler" sublib.vendor_lib = "lib/bundler/vendor/connection_pool" end + + lib.dependency("uri") do |sublib| + sublib.version = "master" + sublib.download = { :github => "https://github.com/ruby/uri" } + sublib.namespace = "URI" + sublib.prefix = "Bundler" + sublib.vendor_lib = "lib/bundler/vendor/uri" + end end end diff --git a/lib/bundler/cli.rb b/lib/bundler/cli.rb index d7f749a672d..443458f2d99 100644 --- a/lib/bundler/cli.rb +++ b/lib/bundler/cli.rb @@ -783,7 +783,7 @@ def warn_on_outdated_bundler return unless SharedHelpers.md5_available? latest = Fetcher::CompactIndex. - new(nil, Source::Rubygems::Remote.new(URI("https://rubygems.org")), nil). + new(nil, Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org")), nil). send(:compact_index_client). instance_variable_get(:@cache). dependencies("bundler"). diff --git a/lib/bundler/fetcher.rb b/lib/bundler/fetcher.rb index 7bda26770b3..caf33bcfc91 100644 --- a/lib/bundler/fetcher.rb +++ b/lib/bundler/fetcher.rb @@ -97,7 +97,7 @@ def fetch_spec(spec) spec -= [nil, "ruby", ""] spec_file_name = "#{spec.join "-"}.gemspec" - uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz") + uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz") if uri.scheme == "file" path = Bundler.rubygems.correct_for_windows_path(uri.path) Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path)) @@ -244,7 +244,7 @@ def connection con = PersistentHTTP.new :name => "bundler", :proxy => :ENV if gem_proxy = Bundler.rubygems.configuration[:http_proxy] - con.proxy = URI.parse(gem_proxy) if gem_proxy != :no_proxy + con.proxy = Bundler::URI.parse(gem_proxy) if gem_proxy != :no_proxy end if remote_uri.scheme == "https" diff --git a/lib/bundler/fetcher/downloader.rb b/lib/bundler/fetcher/downloader.rb index 73f125af91c..498852c1749 100644 --- a/lib/bundler/fetcher/downloader.rb +++ b/lib/bundler/fetcher/downloader.rb @@ -21,7 +21,7 @@ def fetch(uri, headers = {}, counter = 0) when Net::HTTPSuccess, Net::HTTPNotModified response when Net::HTTPRedirection - new_uri = URI.parse(response["location"]) + new_uri = Bundler::URI.parse(response["location"]) if new_uri.host == uri.host new_uri.user = uri.user new_uri.password = uri.password diff --git a/lib/bundler/fetcher/index.rb b/lib/bundler/fetcher/index.rb index d2ad657fe6b..034a225198c 100644 --- a/lib/bundler/fetcher/index.rb +++ b/lib/bundler/fetcher/index.rb @@ -28,7 +28,7 @@ def fetch_spec(spec) spec -= [nil, "ruby", ""] spec_file_name = "#{spec.join "-"}.gemspec" - uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz") + uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz") if uri.scheme == "file" path = Bundler.rubygems.correct_for_windows_path(uri.path) Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path)) diff --git a/lib/bundler/lazy_specification.rb b/lib/bundler/lazy_specification.rb index cbd04b2c90c..32c8bb9557a 100644 --- a/lib/bundler/lazy_specification.rb +++ b/lib/bundler/lazy_specification.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "uri" require_relative "match_platform" module Bundler diff --git a/lib/bundler/mirror.rb b/lib/bundler/mirror.rb index b15190e7e57..0e554bcc3f0 100644 --- a/lib/bundler/mirror.rb +++ b/lib/bundler/mirror.rb @@ -47,7 +47,7 @@ def parse(key, value) def fetch_valid_mirror_for(uri) downcased = uri.to_s.downcase - mirror = @mirrors[downcased] || @mirrors[URI(downcased).host] || Mirror.new(uri) + mirror = @mirrors[downcased] || @mirrors[Bundler::URI(downcased).host] || Mirror.new(uri) mirror.validate!(@prober) mirror = Mirror.new(uri) unless mirror.valid? mirror @@ -74,7 +74,7 @@ def uri=(uri) @uri = if uri.nil? nil else - URI(uri.to_s) + Bundler::URI(uri.to_s) end @valid = nil end @@ -126,7 +126,7 @@ def initialize(config_line, value) if uri == "all" @all = true else - @uri = URI(uri).absolute? ? Settings.normalize_uri(uri) : uri + @uri = Bundler::URI(uri).absolute? ? Settings.normalize_uri(uri) : uri end @value = value end diff --git a/lib/bundler/plugin/api/source.rb b/lib/bundler/plugin/api/source.rb index 3a2ca2f04de..56e97f4aa41 100644 --- a/lib/bundler/plugin/api/source.rb +++ b/lib/bundler/plugin/api/source.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "uri" - module Bundler module Plugin class API @@ -108,7 +106,7 @@ def post_install(spec, disable_exts = false) def install_path @install_path ||= begin - base_name = File.basename(URI.parse(uri).normalize.path) + base_name = File.basename(Bundler::URI.parse(uri).normalize.path) gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}") end @@ -170,7 +168,7 @@ def unlock! # # This is used by `app_cache_path` def app_cache_dirname - base_name = File.basename(URI.parse(uri).normalize.path) + base_name = File.basename(Bundler::URI.parse(uri).normalize.path) "#{base_name}-#{uri_hash}" end diff --git a/lib/bundler/remote_specification.rb b/lib/bundler/remote_specification.rb index 23e12343307..f87a09b9a60 100644 --- a/lib/bundler/remote_specification.rb +++ b/lib/bundler/remote_specification.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "uri" - module Bundler # Represents a lazily loaded gem specification, where the full specification # is on the source server in rubygems' "quick" index. The proxy object is to diff --git a/lib/bundler/settings.rb b/lib/bundler/settings.rb index 2074070e3e8..afbb02397c7 100644 --- a/lib/bundler/settings.rb +++ b/lib/bundler/settings.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "uri" - module Bundler class Settings autoload :Mirror, File.expand_path("mirror", __dir__) @@ -152,7 +150,11 @@ def local_overrides end def mirror_for(uri) - uri = URI(uri.to_s) unless uri.is_a?(URI) + if uri.is_a?(String) + require_relative "vendored_uri" + uri = Bundler::URI(uri) + end + gem_mirrors.for(uri.to_s).uri end @@ -421,7 +423,8 @@ def self.normalize_uri(uri) suffix = $3 end uri = "#{uri}/" unless uri.end_with?("/") - uri = URI(uri) + require_relative "vendored_uri" + uri = Bundler::URI(uri) unless uri.absolute? raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri) end diff --git a/lib/bundler/source/git.rb b/lib/bundler/source/git.rb index fcb0ce8e0e1..7c1533ad906 100644 --- a/lib/bundler/source/git.rb +++ b/lib/bundler/source/git.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require_relative "../vendored_fileutils" -require "uri" module Bundler class Source @@ -285,7 +284,7 @@ def uri_hash if uri =~ %r{^\w+://(\w+@)?} # Downcase the domain component of the URI # and strip off a trailing slash, if one is present - input = URI.parse(uri).normalize.to_s.sub(%r{/$}, "") + input = Bundler::URI.parse(uri).normalize.to_s.sub(%r{/$}, "") else # If there is no URI scheme, assume it is an ssh/git URI input = uri diff --git a/lib/bundler/source/git/git_proxy.rb b/lib/bundler/source/git/git_proxy.rb index 671610e7c1b..7612eb16c65 100644 --- a/lib/bundler/source/git/git_proxy.rb +++ b/lib/bundler/source/git/git_proxy.rb @@ -217,7 +217,7 @@ def uri_escaped_with_configured_credentials # Adds credentials to the URI as Fetcher#configured_uri_for does def configured_uri_for(uri) if /https?:/ =~ uri - remote = URI(uri) + remote = Bundler::URI(uri) config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host] remote.userinfo ||= config_auth remote.to_s diff --git a/lib/bundler/source/rubygems.rb b/lib/bundler/source/rubygems.rb index 103faa6b80a..6c0de204e75 100644 --- a/lib/bundler/source/rubygems.rb +++ b/lib/bundler/source/rubygems.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "uri" require "rubygems/user_interaction" module Bundler @@ -328,9 +327,10 @@ def cached_path(spec) def normalize_uri(uri) uri = uri.to_s uri = "#{uri}/" unless uri =~ %r{/$} - uri = URI(uri) + require_relative "../vendored_uri" + uri = Bundler::URI(uri) raise ArgumentError, "The source must be an absolute URI. For example:\n" \ - "source 'https://rubygems.org'" if !uri.absolute? || (uri.is_a?(URI::HTTP) && uri.host.nil?) + "source 'https://rubygems.org'" if !uri.absolute? || (uri.is_a?(Bundler::URI::HTTP) && uri.host.nil?) uri end diff --git a/lib/bundler/source/rubygems/remote.rb b/lib/bundler/source/rubygems/remote.rb index 7558b2cc3fa..45ea61acb2f 100644 --- a/lib/bundler/source/rubygems/remote.rb +++ b/lib/bundler/source/rubygems/remote.rb @@ -48,7 +48,7 @@ def apply_auth(uri, auth) end uri - rescue URI::InvalidComponentError + rescue Bundler::URI::InvalidComponentError error_message = "Please CGI escape your usernames and passwords before " \ "setting them for authentication." raise HTTPError.new(error_message) diff --git a/lib/bundler/uri_credentials_filter.rb b/lib/bundler/uri_credentials_filter.rb index ee3692268cf..9b9e9c2799f 100644 --- a/lib/bundler/uri_credentials_filter.rb +++ b/lib/bundler/uri_credentials_filter.rb @@ -7,7 +7,11 @@ module URICredentialsFilter def credential_filtered_uri(uri_to_anonymize) return uri_to_anonymize if uri_to_anonymize.nil? uri = uri_to_anonymize.dup - uri = URI(uri.to_s) unless uri.is_a?(URI) + if uri.is_a?(String) + require_relative "vendored_uri" + uri = Bundler::URI(uri) + end + if uri.userinfo # oauth authentication if uri.password == "x-oauth-basic" || uri.password == "x" @@ -17,9 +21,9 @@ def credential_filtered_uri(uri_to_anonymize) end uri.password = nil end - return uri if uri_to_anonymize.is_a?(URI) return uri.to_s if uri_to_anonymize.is_a?(String) - rescue URI::InvalidURIError # uri is not canonical uri scheme + uri + rescue Bundler::URI::InvalidURIError # uri is not canonical uri scheme uri end diff --git a/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb b/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb index 327cb0f8c28..e9c4c3e89ef 100644 --- a/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +++ b/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb @@ -1,5 +1,5 @@ require 'net/http' -require 'uri' +require_relative '../../../../uri/lib/uri' require 'cgi' # for escaping require_relative '../../../../connection_pool/lib/connection_pool' @@ -31,7 +31,7 @@ # # require 'bundler/vendor/net-http-persistent/lib/net/http/persistent' # -# uri = URI 'http://example.com/awesome/web/service' +# uri = Bundler::URI 'http://example.com/awesome/web/service' # # http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name' # @@ -48,17 +48,17 @@ # post = Net::HTTP::Post.new post_uri.path # post.set_form_data 'some' => 'cool data' # -# # perform the POST, the URI is always required +# # perform the POST, the Bundler::URI is always required # response http.request post_uri, post # # Note that for GET, HEAD and other requests that do not have a body you want -# to use URI#request_uri not URI#path. The request_uri contains the query +# to use Bundler::URI#request_uri not Bundler::URI#path. The request_uri contains the query # params which are sent in the body for other requests. # # == SSL # # SSL connections are automatically created depending upon the scheme of the -# URI. SSL connections are automatically verified against the default +# Bundler::URI. SSL connections are automatically verified against the default # certificate store for your computer. You can override this by changing # verify_mode or by specifying an alternate cert_store. # @@ -81,7 +81,7 @@ # == Proxies # # A proxy can be set through #proxy= or at initialization time by providing a -# second argument to ::new. The proxy may be the URI of the proxy server or +# second argument to ::new. The proxy may be the Bundler::URI of the proxy server or # :ENV which will consult environment variables. # # See #proxy= and #proxy_from_env for details. @@ -150,7 +150,7 @@ # # require 'bundler/vendor/net-http-persistent/lib/net/http/persistent' # -# uri = URI 'http://example.com/awesome/web/service' +# uri = Bundler::URI 'http://example.com/awesome/web/service' # post_uri = uri + 'create' # # http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name' @@ -249,7 +249,7 @@ class Error < StandardError; end # NOTE: This may not work on ruby > 1.9. def self.detect_idle_timeout uri, max = 10 - uri = URI uri unless URI::Generic === uri + uri = Bundler::URI uri unless Bundler::URI::Generic === uri uri += '/' req = Net::HTTP::Head.new uri.request_uri @@ -513,13 +513,13 @@ def self.detect_idle_timeout uri, max = 10 # required currently, but highly recommended. Your library name should be # good enough. This parameter will be required in a future version. # - # +proxy+ may be set to a URI::HTTP or :ENV to pick up proxy options from + # +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from # the environment. See proxy_from_env for details. # - # In order to use a URI for the proxy you may need to do some extra work - # beyond URI parsing if the proxy requires a password: + # In order to use a Bundler::URI for the proxy you may need to do some extra work + # beyond Bundler::URI parsing if the proxy requires a password: # - # proxy = URI 'http://proxy.example' + # proxy = Bundler::URI 'http://proxy.example' # proxy.user = 'AzureDiamond' # proxy.password = 'hunter2' # @@ -566,7 +566,7 @@ def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE @verify_mode = nil @cert_store = nil - @generation = 0 # incremented when proxy URI changes + @generation = 0 # incremented when proxy Bundler::URI changes if HAVE_OPENSSL then @verify_mode = OpenSSL::SSL::VERIFY_PEER @@ -688,14 +688,14 @@ def error_message connection end ## - # URI::escape wrapper + # Bundler::URI::escape wrapper def escape str CGI.escape str if str end ## - # URI::unescape wrapper + # Bundler::URI::unescape wrapper def unescape str CGI.unescape str if str @@ -803,12 +803,12 @@ def private_key= key alias key= private_key= ## - # Sets the proxy server. The +proxy+ may be the URI of the proxy server, + # Sets the proxy server. The +proxy+ may be the Bundler::URI of the proxy server, # the symbol +:ENV+ which will read the proxy from the environment or nil to # disable use of a proxy. See #proxy_from_env for details on setting the # proxy from the environment. # - # If the proxy URI is set after requests have been made, the next request + # If the proxy Bundler::URI is set after requests have been made, the next request # will shut-down and re-open all connections. # # The +no_proxy+ query parameter can be used to specify hosts which shouldn't @@ -819,9 +819,9 @@ def private_key= key def proxy= proxy @proxy_uri = case proxy when :ENV then proxy_from_env - when URI::HTTP then proxy + when Bundler::URI::HTTP then proxy when nil then # ignore - else raise ArgumentError, 'proxy must be :ENV or a URI::HTTP' + else raise ArgumentError, 'proxy must be :ENV or a Bundler::URI::HTTP' end @no_proxy.clear @@ -846,13 +846,13 @@ def proxy= proxy end ## - # Creates a URI for an HTTP proxy server from ENV variables. + # Creates a Bundler::URI for an HTTP proxy server from ENV variables. # # If +HTTP_PROXY+ is set a proxy will be returned. # - # If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the URI is given the + # If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the Bundler::URI is given the # indicated user and password unless HTTP_PROXY contains either of these in - # the URI. + # the Bundler::URI. # # The +NO_PROXY+ ENV variable can be used to specify hosts which shouldn't # be reached via proxy; if set it should be a comma separated list of @@ -868,7 +868,7 @@ def proxy_from_env return nil if env_proxy.nil? or env_proxy.empty? - uri = URI normalize_uri env_proxy + uri = Bundler::URI normalize_uri env_proxy env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY'] @@ -951,7 +951,7 @@ def request uri, req = nil, &block retried = false bad_response = false - uri = URI uri + uri = Bundler::URI uri req = request_setup req || uri response = nil @@ -1024,13 +1024,13 @@ def request_failed exception, req, connection # :nodoc: end ## - # Creates a GET request if +req_or_uri+ is a URI and adds headers to the + # Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the # request. # # Returns the request. def request_setup req_or_uri # :nodoc: - req = if URI === req_or_uri then + req = if Bundler::URI === req_or_uri then Net::HTTP::Get.new req_or_uri.request_uri else req_or_uri diff --git a/lib/bundler/vendor/uri/lib/uri.rb b/lib/bundler/vendor/uri/lib/uri.rb new file mode 100644 index 00000000000..00c01bd07bf --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: false +# Bundler::URI is a module providing classes to handle Uniform Resource Identifiers +# (RFC2396[http://tools.ietf.org/html/rfc2396]). +# +# == Features +# +# * Uniform way of handling URIs. +# * Flexibility to introduce custom Bundler::URI schemes. +# * Flexibility to have an alternate Bundler::URI::Parser (or just different patterns +# and regexp's). +# +# == Basic example +# +# require 'bundler/vendor/uri/lib/uri' +# +# uri = Bundler::URI("http://foo.com/posts?id=30&limit=5#time=1305298413") +# #=> # +# +# uri.scheme #=> "http" +# uri.host #=> "foo.com" +# uri.path #=> "/posts" +# uri.query #=> "id=30&limit=5" +# uri.fragment #=> "time=1305298413" +# +# uri.to_s #=> "http://foo.com/posts?id=30&limit=5#time=1305298413" +# +# == Adding custom URIs +# +# module Bundler::URI +# class RSYNC < Generic +# DEFAULT_PORT = 873 +# end +# @@schemes['RSYNC'] = RSYNC +# end +# #=> Bundler::URI::RSYNC +# +# Bundler::URI.scheme_list +# #=> {"FILE"=>Bundler::URI::File, "FTP"=>Bundler::URI::FTP, "HTTP"=>Bundler::URI::HTTP, +# # "HTTPS"=>Bundler::URI::HTTPS, "LDAP"=>Bundler::URI::LDAP, "LDAPS"=>Bundler::URI::LDAPS, +# # "MAILTO"=>Bundler::URI::MailTo, "RSYNC"=>Bundler::URI::RSYNC} +# +# uri = Bundler::URI("rsync://rsync.foo.com") +# #=> # +# +# == RFC References +# +# A good place to view an RFC spec is http://www.ietf.org/rfc.html. +# +# Here is a list of all related RFC's: +# - RFC822[http://tools.ietf.org/html/rfc822] +# - RFC1738[http://tools.ietf.org/html/rfc1738] +# - RFC2255[http://tools.ietf.org/html/rfc2255] +# - RFC2368[http://tools.ietf.org/html/rfc2368] +# - RFC2373[http://tools.ietf.org/html/rfc2373] +# - RFC2396[http://tools.ietf.org/html/rfc2396] +# - RFC2732[http://tools.ietf.org/html/rfc2732] +# - RFC3986[http://tools.ietf.org/html/rfc3986] +# +# == Class tree +# +# - Bundler::URI::Generic (in uri/generic.rb) +# - Bundler::URI::File - (in uri/file.rb) +# - Bundler::URI::FTP - (in uri/ftp.rb) +# - Bundler::URI::HTTP - (in uri/http.rb) +# - Bundler::URI::HTTPS - (in uri/https.rb) +# - Bundler::URI::LDAP - (in uri/ldap.rb) +# - Bundler::URI::LDAPS - (in uri/ldaps.rb) +# - Bundler::URI::MailTo - (in uri/mailto.rb) +# - Bundler::URI::Parser - (in uri/common.rb) +# - Bundler::URI::REGEXP - (in uri/common.rb) +# - Bundler::URI::REGEXP::PATTERN - (in uri/common.rb) +# - Bundler::URI::Util - (in uri/common.rb) +# - Bundler::URI::Escape - (in uri/common.rb) +# - Bundler::URI::Error - (in uri/common.rb) +# - Bundler::URI::InvalidURIError - (in uri/common.rb) +# - Bundler::URI::InvalidComponentError - (in uri/common.rb) +# - Bundler::URI::BadURIError - (in uri/common.rb) +# +# == Copyright Info +# +# Author:: Akira Yamada +# Documentation:: +# Akira Yamada +# Dmitry V. Sabanin +# Vincent Batts +# License:: +# Copyright (c) 2001 akira yamada +# You can redistribute it and/or modify it under the same term as Ruby. +# Revision:: $Id$ +# + +module Bundler::URI +end + +require_relative 'uri/version' +require_relative 'uri/common' +require_relative 'uri/generic' +require_relative 'uri/file' +require_relative 'uri/ftp' +require_relative 'uri/http' +require_relative 'uri/https' +require_relative 'uri/ldap' +require_relative 'uri/ldaps' +require_relative 'uri/mailto' diff --git a/lib/bundler/vendor/uri/lib/uri/common.rb b/lib/bundler/vendor/uri/lib/uri/common.rb new file mode 100644 index 00000000000..cc1ab86c2f4 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/common.rb @@ -0,0 +1,744 @@ +# frozen_string_literal: true +#-- +# = uri/common.rb +# +# Author:: Akira Yamada +# Revision:: $Id$ +# License:: +# You can redistribute it and/or modify it under the same term as Ruby. +# +# See Bundler::URI for general documentation +# + +require_relative "rfc2396_parser" +require_relative "rfc3986_parser" + +module Bundler::URI + REGEXP = RFC2396_REGEXP + Parser = RFC2396_Parser + RFC3986_PARSER = RFC3986_Parser.new + + # Bundler::URI::Parser.new + DEFAULT_PARSER = Parser.new + DEFAULT_PARSER.pattern.each_pair do |sym, str| + unless REGEXP::PATTERN.const_defined?(sym) + REGEXP::PATTERN.const_set(sym, str) + end + end + DEFAULT_PARSER.regexp.each_pair do |sym, str| + const_set(sym, str) + end + + module Util # :nodoc: + def make_components_hash(klass, array_hash) + tmp = {} + if array_hash.kind_of?(Array) && + array_hash.size == klass.component.size - 1 + klass.component[1..-1].each_index do |i| + begin + tmp[klass.component[i + 1]] = array_hash[i].clone + rescue TypeError + tmp[klass.component[i + 1]] = array_hash[i] + end + end + + elsif array_hash.kind_of?(Hash) + array_hash.each do |key, value| + begin + tmp[key] = value.clone + rescue TypeError + tmp[key] = value + end + end + else + raise ArgumentError, + "expected Array of or Hash of components of #{klass} (#{klass.component[1..-1].join(', ')})" + end + tmp[:scheme] = klass.to_s.sub(/\A.*::/, '').downcase + + return tmp + end + module_function :make_components_hash + end + + # Module for escaping unsafe characters with codes. + module Escape + # + # == Synopsis + # + # Bundler::URI.escape(str [, unsafe]) + # + # == Args + # + # +str+:: + # String to replaces in. + # +unsafe+:: + # Regexp that matches all symbols that must be replaced with codes. + # By default uses UNSAFE. + # When this argument is a String, it represents a character set. + # + # == Description + # + # Escapes the string, replacing all unsafe characters with codes. + # + # This method is obsolete and should not be used. Instead, use + # CGI.escape, Bundler::URI.encode_www_form or Bundler::URI.encode_www_form_component + # depending on your specific use case. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # enc_uri = Bundler::URI.escape("http://example.com/?a=\11\15") + # # => "http://example.com/?a=%09%0D" + # + # Bundler::URI.unescape(enc_uri) + # # => "http://example.com/?a=\t\r" + # + # Bundler::URI.escape("@?@!", "!?") + # # => "@%3F@%21" + # + def escape(*arg) + warn "Bundler::URI.escape is obsolete", uplevel: 1 + DEFAULT_PARSER.escape(*arg) + end + alias encode escape + # + # == Synopsis + # + # Bundler::URI.unescape(str) + # + # == Args + # + # +str+:: + # String to unescape. + # + # == Description + # + # This method is obsolete and should not be used. Instead, use + # CGI.unescape, Bundler::URI.decode_www_form or Bundler::URI.decode_www_form_component + # depending on your specific use case. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # enc_uri = Bundler::URI.escape("http://example.com/?a=\11\15") + # # => "http://example.com/?a=%09%0D" + # + # Bundler::URI.unescape(enc_uri) + # # => "http://example.com/?a=\t\r" + # + def unescape(*arg) + warn "Bundler::URI.unescape is obsolete", uplevel: 1 + DEFAULT_PARSER.unescape(*arg) + end + alias decode unescape + end # module Escape + + extend Escape + include REGEXP + + @@schemes = {} + # Returns a Hash of the defined schemes. + def self.scheme_list + @@schemes + end + + # + # Base class for all Bundler::URI exceptions. + # + class Error < StandardError; end + # + # Not a Bundler::URI. + # + class InvalidURIError < Error; end + # + # Not a Bundler::URI component. + # + class InvalidComponentError < Error; end + # + # Bundler::URI is valid, bad usage is not. + # + class BadURIError < Error; end + + # + # == Synopsis + # + # Bundler::URI::split(uri) + # + # == Args + # + # +uri+:: + # String with Bundler::URI. + # + # == Description + # + # Splits the string on following parts and returns array with result: + # + # * Scheme + # * Userinfo + # * Host + # * Port + # * Registry + # * Path + # * Opaque + # * Query + # * Fragment + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # Bundler::URI.split("http://www.ruby-lang.org/") + # # => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil] + # + def self.split(uri) + RFC3986_PARSER.split(uri) + end + + # + # == Synopsis + # + # Bundler::URI::parse(uri_str) + # + # == Args + # + # +uri_str+:: + # String with Bundler::URI. + # + # == Description + # + # Creates one of the Bundler::URI's subclasses instance from the string. + # + # == Raises + # + # Bundler::URI::InvalidURIError:: + # Raised if Bundler::URI given is not a correct one. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://www.ruby-lang.org/") + # # => # + # uri.scheme + # # => "http" + # uri.host + # # => "www.ruby-lang.org" + # + # It's recommended to first ::escape the provided +uri_str+ if there are any + # invalid Bundler::URI characters. + # + def self.parse(uri) + RFC3986_PARSER.parse(uri) + end + + # + # == Synopsis + # + # Bundler::URI::join(str[, str, ...]) + # + # == Args + # + # +str+:: + # String(s) to work with, will be converted to RFC3986 URIs before merging. + # + # == Description + # + # Joins URIs. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # Bundler::URI.join("http://example.com/","main.rbx") + # # => # + # + # Bundler::URI.join('http://example.com', 'foo') + # # => # + # + # Bundler::URI.join('http://example.com', '/foo', '/bar') + # # => # + # + # Bundler::URI.join('http://example.com', '/foo', 'bar') + # # => # + # + # Bundler::URI.join('http://example.com', '/foo/', 'bar') + # # => # + # + def self.join(*str) + RFC3986_PARSER.join(*str) + end + + # + # == Synopsis + # + # Bundler::URI::extract(str[, schemes][,&blk]) + # + # == Args + # + # +str+:: + # String to extract URIs from. + # +schemes+:: + # Limit Bundler::URI matching to specific schemes. + # + # == Description + # + # Extracts URIs from a string. If block given, iterates through all matched URIs. + # Returns nil if block given or array with matches. + # + # == Usage + # + # require "bundler/vendor/uri/lib/uri" + # + # Bundler::URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.") + # # => ["http://foo.example.com/bla", "mailto:test@example.com"] + # + def self.extract(str, schemes = nil, &block) + warn "Bundler::URI.extract is obsolete", uplevel: 1 if $VERBOSE + DEFAULT_PARSER.extract(str, schemes, &block) + end + + # + # == Synopsis + # + # Bundler::URI::regexp([match_schemes]) + # + # == Args + # + # +match_schemes+:: + # Array of schemes. If given, resulting regexp matches to URIs + # whose scheme is one of the match_schemes. + # + # == Description + # + # Returns a Regexp object which matches to Bundler::URI-like strings. + # The Regexp object returned by this method includes arbitrary + # number of capture group (parentheses). Never rely on it's number. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # # extract first Bundler::URI from html_string + # html_string.slice(Bundler::URI.regexp) + # + # # remove ftp URIs + # html_string.sub(Bundler::URI.regexp(['ftp']), '') + # + # # You should not rely on the number of parentheses + # html_string.scan(Bundler::URI.regexp) do |*matches| + # p $& + # end + # + def self.regexp(schemes = nil) + warn "Bundler::URI.regexp is obsolete", uplevel: 1 if $VERBOSE + DEFAULT_PARSER.make_regexp(schemes) + end + + TBLENCWWWCOMP_ = {} # :nodoc: + 256.times do |i| + TBLENCWWWCOMP_[-i.chr] = -('%%%02X' % i) + end + TBLENCWWWCOMP_[' '] = '+' + TBLENCWWWCOMP_.freeze + TBLDECWWWCOMP_ = {} # :nodoc: + 256.times do |i| + h, l = i>>4, i&15 + TBLDECWWWCOMP_[-('%%%X%X' % [h, l])] = -i.chr + TBLDECWWWCOMP_[-('%%%x%X' % [h, l])] = -i.chr + TBLDECWWWCOMP_[-('%%%X%x' % [h, l])] = -i.chr + TBLDECWWWCOMP_[-('%%%x%x' % [h, l])] = -i.chr + end + TBLDECWWWCOMP_['+'] = ' ' + TBLDECWWWCOMP_.freeze + + # Encodes given +str+ to URL-encoded form data. + # + # This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP + # (ASCII space) to + and converts others to %XX. + # + # If +enc+ is given, convert +str+ to the encoding before percent encoding. + # + # This is an implementation of + # http://www.w3.org/TR/2013/CR-html5-20130806/forms.html#url-encoded-form-data. + # + # See Bundler::URI.decode_www_form_component, Bundler::URI.encode_www_form. + def self.encode_www_form_component(str, enc=nil) + str = str.to_s.dup + if str.encoding != Encoding::ASCII_8BIT + if enc && enc != Encoding::ASCII_8BIT + str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace) + str.encode!(enc, fallback: ->(x){"&##{x.ord};"}) + end + str.force_encoding(Encoding::ASCII_8BIT) + end + str.gsub!(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_) + str.force_encoding(Encoding::US_ASCII) + end + + # Decodes given +str+ of URL-encoded form data. + # + # This decodes + to SP. + # + # See Bundler::URI.encode_www_form_component, Bundler::URI.decode_www_form. + def self.decode_www_form_component(str, enc=Encoding::UTF_8) + raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/ =~ str + str.b.gsub(/\+|%\h\h/, TBLDECWWWCOMP_).force_encoding(enc) + end + + # Generates URL-encoded form data from given +enum+. + # + # This generates application/x-www-form-urlencoded data defined in HTML5 + # from given an Enumerable object. + # + # This internally uses Bundler::URI.encode_www_form_component(str). + # + # This method doesn't convert the encoding of given items, so convert them + # before calling this method if you want to send data as other than original + # encoding or mixed encoding data. (Strings which are encoded in an HTML5 + # ASCII incompatible encoding are converted to UTF-8.) + # + # This method doesn't handle files. When you send a file, use + # multipart/form-data. + # + # This refers http://url.spec.whatwg.org/#concept-urlencoded-serializer + # + # Bundler::URI.encode_www_form([["q", "ruby"], ["lang", "en"]]) + # #=> "q=ruby&lang=en" + # Bundler::URI.encode_www_form("q" => "ruby", "lang" => "en") + # #=> "q=ruby&lang=en" + # Bundler::URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en") + # #=> "q=ruby&q=perl&lang=en" + # Bundler::URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]]) + # #=> "q=ruby&q=perl&lang=en" + # + # See Bundler::URI.encode_www_form_component, Bundler::URI.decode_www_form. + def self.encode_www_form(enum, enc=nil) + enum.map do |k,v| + if v.nil? + encode_www_form_component(k, enc) + elsif v.respond_to?(:to_ary) + v.to_ary.map do |w| + str = encode_www_form_component(k, enc) + unless w.nil? + str << '=' + str << encode_www_form_component(w, enc) + end + end.join('&') + else + str = encode_www_form_component(k, enc) + str << '=' + str << encode_www_form_component(v, enc) + end + end.join('&') + end + + # Decodes URL-encoded form data from given +str+. + # + # This decodes application/x-www-form-urlencoded data + # and returns an array of key-value arrays. + # + # This refers http://url.spec.whatwg.org/#concept-urlencoded-parser, + # so this supports only &-separator, and doesn't support ;-separator. + # + # ary = Bundler::URI.decode_www_form("a=1&a=2&b=3") + # ary #=> [['a', '1'], ['a', '2'], ['b', '3']] + # ary.assoc('a').last #=> '1' + # ary.assoc('b').last #=> '3' + # ary.rassoc('a').last #=> '2' + # Hash[ary] #=> {"a"=>"2", "b"=>"3"} + # + # See Bundler::URI.decode_www_form_component, Bundler::URI.encode_www_form. + def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false) + raise ArgumentError, "the input of #{self.name}.#{__method__} must be ASCII only string" unless str.ascii_only? + ary = [] + return ary if str.empty? + enc = Encoding.find(enc) + str.b.each_line(separator) do |string| + string.chomp!(separator) + key, sep, val = string.partition('=') + if isindex + if sep.empty? + val = key + key = +'' + end + isindex = false + end + + if use__charset_ and key == '_charset_' and e = get_encoding(val) + enc = e + use__charset_ = false + end + + key.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_) + if val + val.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_) + else + val = +'' + end + + ary << [key, val] + end + ary.each do |k, v| + k.force_encoding(enc) + k.scrub! + v.force_encoding(enc) + v.scrub! + end + ary + end + + private +=begin command for WEB_ENCODINGS_ + curl https://encoding.spec.whatwg.org/encodings.json| + ruby -rjson -e 'H={} + h={ + "shift_jis"=>"Windows-31J", + "euc-jp"=>"cp51932", + "iso-2022-jp"=>"cp50221", + "x-mac-cyrillic"=>"macCyrillic", + } + JSON($<.read).map{|x|x["encodings"]}.flatten.each{|x| + Encoding.find(n=h.fetch(n=x["name"].downcase,n))rescue next + x["labels"].each{|y|H[y]=n} + } + puts "{" + H.each{|k,v|puts %[ #{k.dump}=>#{v.dump},]} + puts "}" +' +=end + WEB_ENCODINGS_ = { + "unicode-1-1-utf-8"=>"utf-8", + "utf-8"=>"utf-8", + "utf8"=>"utf-8", + "866"=>"ibm866", + "cp866"=>"ibm866", + "csibm866"=>"ibm866", + "ibm866"=>"ibm866", + "csisolatin2"=>"iso-8859-2", + "iso-8859-2"=>"iso-8859-2", + "iso-ir-101"=>"iso-8859-2", + "iso8859-2"=>"iso-8859-2", + "iso88592"=>"iso-8859-2", + "iso_8859-2"=>"iso-8859-2", + "iso_8859-2:1987"=>"iso-8859-2", + "l2"=>"iso-8859-2", + "latin2"=>"iso-8859-2", + "csisolatin3"=>"iso-8859-3", + "iso-8859-3"=>"iso-8859-3", + "iso-ir-109"=>"iso-8859-3", + "iso8859-3"=>"iso-8859-3", + "iso88593"=>"iso-8859-3", + "iso_8859-3"=>"iso-8859-3", + "iso_8859-3:1988"=>"iso-8859-3", + "l3"=>"iso-8859-3", + "latin3"=>"iso-8859-3", + "csisolatin4"=>"iso-8859-4", + "iso-8859-4"=>"iso-8859-4", + "iso-ir-110"=>"iso-8859-4", + "iso8859-4"=>"iso-8859-4", + "iso88594"=>"iso-8859-4", + "iso_8859-4"=>"iso-8859-4", + "iso_8859-4:1988"=>"iso-8859-4", + "l4"=>"iso-8859-4", + "latin4"=>"iso-8859-4", + "csisolatincyrillic"=>"iso-8859-5", + "cyrillic"=>"iso-8859-5", + "iso-8859-5"=>"iso-8859-5", + "iso-ir-144"=>"iso-8859-5", + "iso8859-5"=>"iso-8859-5", + "iso88595"=>"iso-8859-5", + "iso_8859-5"=>"iso-8859-5", + "iso_8859-5:1988"=>"iso-8859-5", + "arabic"=>"iso-8859-6", + "asmo-708"=>"iso-8859-6", + "csiso88596e"=>"iso-8859-6", + "csiso88596i"=>"iso-8859-6", + "csisolatinarabic"=>"iso-8859-6", + "ecma-114"=>"iso-8859-6", + "iso-8859-6"=>"iso-8859-6", + "iso-8859-6-e"=>"iso-8859-6", + "iso-8859-6-i"=>"iso-8859-6", + "iso-ir-127"=>"iso-8859-6", + "iso8859-6"=>"iso-8859-6", + "iso88596"=>"iso-8859-6", + "iso_8859-6"=>"iso-8859-6", + "iso_8859-6:1987"=>"iso-8859-6", + "csisolatingreek"=>"iso-8859-7", + "ecma-118"=>"iso-8859-7", + "elot_928"=>"iso-8859-7", + "greek"=>"iso-8859-7", + "greek8"=>"iso-8859-7", + "iso-8859-7"=>"iso-8859-7", + "iso-ir-126"=>"iso-8859-7", + "iso8859-7"=>"iso-8859-7", + "iso88597"=>"iso-8859-7", + "iso_8859-7"=>"iso-8859-7", + "iso_8859-7:1987"=>"iso-8859-7", + "sun_eu_greek"=>"iso-8859-7", + "csiso88598e"=>"iso-8859-8", + "csisolatinhebrew"=>"iso-8859-8", + "hebrew"=>"iso-8859-8", + "iso-8859-8"=>"iso-8859-8", + "iso-8859-8-e"=>"iso-8859-8", + "iso-ir-138"=>"iso-8859-8", + "iso8859-8"=>"iso-8859-8", + "iso88598"=>"iso-8859-8", + "iso_8859-8"=>"iso-8859-8", + "iso_8859-8:1988"=>"iso-8859-8", + "visual"=>"iso-8859-8", + "csisolatin6"=>"iso-8859-10", + "iso-8859-10"=>"iso-8859-10", + "iso-ir-157"=>"iso-8859-10", + "iso8859-10"=>"iso-8859-10", + "iso885910"=>"iso-8859-10", + "l6"=>"iso-8859-10", + "latin6"=>"iso-8859-10", + "iso-8859-13"=>"iso-8859-13", + "iso8859-13"=>"iso-8859-13", + "iso885913"=>"iso-8859-13", + "iso-8859-14"=>"iso-8859-14", + "iso8859-14"=>"iso-8859-14", + "iso885914"=>"iso-8859-14", + "csisolatin9"=>"iso-8859-15", + "iso-8859-15"=>"iso-8859-15", + "iso8859-15"=>"iso-8859-15", + "iso885915"=>"iso-8859-15", + "iso_8859-15"=>"iso-8859-15", + "l9"=>"iso-8859-15", + "iso-8859-16"=>"iso-8859-16", + "cskoi8r"=>"koi8-r", + "koi"=>"koi8-r", + "koi8"=>"koi8-r", + "koi8-r"=>"koi8-r", + "koi8_r"=>"koi8-r", + "koi8-ru"=>"koi8-u", + "koi8-u"=>"koi8-u", + "dos-874"=>"windows-874", + "iso-8859-11"=>"windows-874", + "iso8859-11"=>"windows-874", + "iso885911"=>"windows-874", + "tis-620"=>"windows-874", + "windows-874"=>"windows-874", + "cp1250"=>"windows-1250", + "windows-1250"=>"windows-1250", + "x-cp1250"=>"windows-1250", + "cp1251"=>"windows-1251", + "windows-1251"=>"windows-1251", + "x-cp1251"=>"windows-1251", + "ansi_x3.4-1968"=>"windows-1252", + "ascii"=>"windows-1252", + "cp1252"=>"windows-1252", + "cp819"=>"windows-1252", + "csisolatin1"=>"windows-1252", + "ibm819"=>"windows-1252", + "iso-8859-1"=>"windows-1252", + "iso-ir-100"=>"windows-1252", + "iso8859-1"=>"windows-1252", + "iso88591"=>"windows-1252", + "iso_8859-1"=>"windows-1252", + "iso_8859-1:1987"=>"windows-1252", + "l1"=>"windows-1252", + "latin1"=>"windows-1252", + "us-ascii"=>"windows-1252", + "windows-1252"=>"windows-1252", + "x-cp1252"=>"windows-1252", + "cp1253"=>"windows-1253", + "windows-1253"=>"windows-1253", + "x-cp1253"=>"windows-1253", + "cp1254"=>"windows-1254", + "csisolatin5"=>"windows-1254", + "iso-8859-9"=>"windows-1254", + "iso-ir-148"=>"windows-1254", + "iso8859-9"=>"windows-1254", + "iso88599"=>"windows-1254", + "iso_8859-9"=>"windows-1254", + "iso_8859-9:1989"=>"windows-1254", + "l5"=>"windows-1254", + "latin5"=>"windows-1254", + "windows-1254"=>"windows-1254", + "x-cp1254"=>"windows-1254", + "cp1255"=>"windows-1255", + "windows-1255"=>"windows-1255", + "x-cp1255"=>"windows-1255", + "cp1256"=>"windows-1256", + "windows-1256"=>"windows-1256", + "x-cp1256"=>"windows-1256", + "cp1257"=>"windows-1257", + "windows-1257"=>"windows-1257", + "x-cp1257"=>"windows-1257", + "cp1258"=>"windows-1258", + "windows-1258"=>"windows-1258", + "x-cp1258"=>"windows-1258", + "x-mac-cyrillic"=>"macCyrillic", + "x-mac-ukrainian"=>"macCyrillic", + "chinese"=>"gbk", + "csgb2312"=>"gbk", + "csiso58gb231280"=>"gbk", + "gb2312"=>"gbk", + "gb_2312"=>"gbk", + "gb_2312-80"=>"gbk", + "gbk"=>"gbk", + "iso-ir-58"=>"gbk", + "x-gbk"=>"gbk", + "gb18030"=>"gb18030", + "big5"=>"big5", + "big5-hkscs"=>"big5", + "cn-big5"=>"big5", + "csbig5"=>"big5", + "x-x-big5"=>"big5", + "cseucpkdfmtjapanese"=>"cp51932", + "euc-jp"=>"cp51932", + "x-euc-jp"=>"cp51932", + "csiso2022jp"=>"cp50221", + "iso-2022-jp"=>"cp50221", + "csshiftjis"=>"Windows-31J", + "ms932"=>"Windows-31J", + "ms_kanji"=>"Windows-31J", + "shift-jis"=>"Windows-31J", + "shift_jis"=>"Windows-31J", + "sjis"=>"Windows-31J", + "windows-31j"=>"Windows-31J", + "x-sjis"=>"Windows-31J", + "cseuckr"=>"euc-kr", + "csksc56011987"=>"euc-kr", + "euc-kr"=>"euc-kr", + "iso-ir-149"=>"euc-kr", + "korean"=>"euc-kr", + "ks_c_5601-1987"=>"euc-kr", + "ks_c_5601-1989"=>"euc-kr", + "ksc5601"=>"euc-kr", + "ksc_5601"=>"euc-kr", + "windows-949"=>"euc-kr", + "utf-16be"=>"utf-16be", + "utf-16"=>"utf-16le", + "utf-16le"=>"utf-16le", + } # :nodoc: + + # :nodoc: + # return encoding or nil + # http://encoding.spec.whatwg.org/#concept-encoding-get + def self.get_encoding(label) + Encoding.find(WEB_ENCODINGS_[label.to_str.strip.downcase]) rescue nil + end +end # module Bundler::URI + +module Bundler + + # + # Returns +uri+ converted to an Bundler::URI object. + # + def URI(uri) + if uri.is_a?(Bundler::URI::Generic) + uri + elsif uri = String.try_convert(uri) + Bundler::URI.parse(uri) + else + raise ArgumentError, + "bad argument (expected Bundler::URI object or Bundler::URI string)" + end + end + module_function :URI +end diff --git a/lib/bundler/vendor/uri/lib/uri/file.rb b/lib/bundler/vendor/uri/lib/uri/file.rb new file mode 100644 index 00000000000..df42f8bcddb --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/file.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +require_relative 'generic' + +module Bundler::URI + + # + # The "file" Bundler::URI is defined by RFC8089. + # + class File < Generic + # A Default port of nil for Bundler::URI::File. + DEFAULT_PORT = nil + + # + # An Array of the available components for Bundler::URI::File. + # + COMPONENT = [ + :scheme, + :host, + :path + ].freeze + + # + # == Description + # + # Creates a new Bundler::URI::File object from components, with syntax checking. + # + # The components accepted are +host+ and +path+. + # + # The components should be provided either as an Array, or as a Hash + # with keys formed by preceding the component names with a colon. + # + # If an Array is used, the components must be passed in the + # order [host, path]. + # + # Examples: + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri1 = Bundler::URI::File.build(['host.example.com', '/path/file.zip']) + # uri1.to_s # => "file://host.example.com/path/file.zip" + # + # uri2 = Bundler::URI::File.build({:host => 'host.example.com', + # :path => '/ruby/src'}) + # uri2.to_s # => "file://host.example.com/ruby/src" + # + def self.build(args) + tmp = Util::make_components_hash(self, args) + super(tmp) + end + + # Protected setter for the host component +v+. + # + # See also Bundler::URI::Generic.host=. + # + def set_host(v) + v = "" if v.nil? || v == "localhost" + @host = v + end + + # do nothing + def set_port(v) + end + + # raise InvalidURIError + def check_userinfo(user) + raise Bundler::URI::InvalidURIError, "can not set userinfo for file Bundler::URI" + end + + # raise InvalidURIError + def check_user(user) + raise Bundler::URI::InvalidURIError, "can not set user for file Bundler::URI" + end + + # raise InvalidURIError + def check_password(user) + raise Bundler::URI::InvalidURIError, "can not set password for file Bundler::URI" + end + + # do nothing + def set_userinfo(v) + end + + # do nothing + def set_user(v) + end + + # do nothing + def set_password(v) + end + end + + @@schemes['FILE'] = File +end diff --git a/lib/bundler/vendor/uri/lib/uri/ftp.rb b/lib/bundler/vendor/uri/lib/uri/ftp.rb new file mode 100644 index 00000000000..ad39f57d7b6 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/ftp.rb @@ -0,0 +1,267 @@ +# frozen_string_literal: false +# = uri/ftp.rb +# +# Author:: Akira Yamada +# License:: You can redistribute it and/or modify it under the same term as Ruby. +# Revision:: $Id$ +# +# See Bundler::URI for general documentation +# + +require_relative 'generic' + +module Bundler::URI + + # + # FTP Bundler::URI syntax is defined by RFC1738 section 3.2. + # + # This class will be redesigned because of difference of implementations; + # the structure of its path. draft-hoffman-ftp-uri-04 is a draft but it + # is a good summary about the de facto spec. + # http://tools.ietf.org/html/draft-hoffman-ftp-uri-04 + # + class FTP < Generic + # A Default port of 21 for Bundler::URI::FTP. + DEFAULT_PORT = 21 + + # + # An Array of the available components for Bundler::URI::FTP. + # + COMPONENT = [ + :scheme, + :userinfo, :host, :port, + :path, :typecode + ].freeze + + # + # Typecode is "a", "i", or "d". + # + # * "a" indicates a text file (the FTP command was ASCII) + # * "i" indicates a binary file (FTP command IMAGE) + # * "d" indicates the contents of a directory should be displayed + # + TYPECODE = ['a', 'i', 'd'].freeze + + # Typecode prefix ";type=". + TYPECODE_PREFIX = ';type='.freeze + + def self.new2(user, password, host, port, path, + typecode = nil, arg_check = true) # :nodoc: + # Do not use this method! Not tested. [Bug #7301] + # This methods remains just for compatibility, + # Keep it undocumented until the active maintainer is assigned. + typecode = nil if typecode.size == 0 + if typecode && !TYPECODE.include?(typecode) + raise ArgumentError, + "bad typecode is specified: #{typecode}" + end + + # do escape + + self.new('ftp', + [user, password], + host, port, nil, + typecode ? path + TYPECODE_PREFIX + typecode : path, + nil, nil, nil, arg_check) + end + + # + # == Description + # + # Creates a new Bundler::URI::FTP object from components, with syntax checking. + # + # The components accepted are +userinfo+, +host+, +port+, +path+, and + # +typecode+. + # + # The components should be provided either as an Array, or as a Hash + # with keys formed by preceding the component names with a colon. + # + # If an Array is used, the components must be passed in the + # order [userinfo, host, port, path, typecode]. + # + # If the path supplied is absolute, it will be escaped in order to + # make it absolute in the Bundler::URI. + # + # Examples: + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri1 = Bundler::URI::FTP.build(['user:password', 'ftp.example.com', nil, + # '/path/file.zip', 'i']) + # uri1.to_s # => "ftp://user:password@ftp.example.com/%2Fpath/file.zip;type=i" + # + # uri2 = Bundler::URI::FTP.build({:host => 'ftp.example.com', + # :path => 'ruby/src'}) + # uri2.to_s # => "ftp://ftp.example.com/ruby/src" + # + def self.build(args) + + # Fix the incoming path to be generic URL syntax + # FTP path -> URL path + # foo/bar /foo/bar + # /foo/bar /%2Ffoo/bar + # + if args.kind_of?(Array) + args[3] = '/' + args[3].sub(/^\//, '%2F') + else + args[:path] = '/' + args[:path].sub(/^\//, '%2F') + end + + tmp = Util::make_components_hash(self, args) + + if tmp[:typecode] + if tmp[:typecode].size == 1 + tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode] + end + tmp[:path] << tmp[:typecode] + end + + return super(tmp) + end + + # + # == Description + # + # Creates a new Bundler::URI::FTP object from generic URL components with no + # syntax checking. + # + # Unlike build(), this method does not escape the path component as + # required by RFC1738; instead it is treated as per RFC2396. + # + # Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+, + # +opaque+, +query+, and +fragment+, in that order. + # + def initialize(scheme, + userinfo, host, port, registry, + path, opaque, + query, + fragment, + parser = nil, + arg_check = false) + raise InvalidURIError unless path + path = path.sub(/^\//,'') + path.sub!(/^%2F/,'/') + super(scheme, userinfo, host, port, registry, path, opaque, + query, fragment, parser, arg_check) + @typecode = nil + if tmp = @path.index(TYPECODE_PREFIX) + typecode = @path[tmp + TYPECODE_PREFIX.size..-1] + @path = @path[0..tmp - 1] + + if arg_check + self.typecode = typecode + else + self.set_typecode(typecode) + end + end + end + + # typecode accessor. + # + # See Bundler::URI::FTP::COMPONENT. + attr_reader :typecode + + # Validates typecode +v+, + # returns +true+ or +false+. + # + def check_typecode(v) + if TYPECODE.include?(v) + return true + else + raise InvalidComponentError, + "bad typecode(expected #{TYPECODE.join(', ')}): #{v}" + end + end + private :check_typecode + + # Private setter for the typecode +v+. + # + # See also Bundler::URI::FTP.typecode=. + # + def set_typecode(v) + @typecode = v + end + protected :set_typecode + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the typecode +v+ + # (with validation). + # + # See also Bundler::URI::FTP.check_typecode. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("ftp://john@ftp.example.com/my_file.img") + # #=> # + # uri.typecode = "i" + # uri + # #=> # + # + def typecode=(typecode) + check_typecode(typecode) + set_typecode(typecode) + typecode + end + + def merge(oth) # :nodoc: + tmp = super(oth) + if self != tmp + tmp.set_typecode(oth.typecode) + end + + return tmp + end + + # Returns the path from an FTP Bundler::URI. + # + # RFC 1738 specifically states that the path for an FTP Bundler::URI does not + # include the / which separates the Bundler::URI path from the Bundler::URI host. Example: + # + # ftp://ftp.example.com/pub/ruby + # + # The above Bundler::URI indicates that the client should connect to + # ftp.example.com then cd to pub/ruby from the initial login directory. + # + # If you want to cd to an absolute directory, you must include an + # escaped / (%2F) in the path. Example: + # + # ftp://ftp.example.com/%2Fpub/ruby + # + # This method will then return "/pub/ruby". + # + def path + return @path.sub(/^\//,'').sub(/^%2F/,'/') + end + + # Private setter for the path of the Bundler::URI::FTP. + def set_path(v) + super("/" + v.sub(/^\//, "%2F")) + end + protected :set_path + + # Returns a String representation of the Bundler::URI::FTP. + def to_s + save_path = nil + if @typecode + save_path = @path + @path = @path + TYPECODE_PREFIX + @typecode + end + str = super + if @typecode + @path = save_path + end + + return str + end + end + @@schemes['FTP'] = FTP +end diff --git a/lib/bundler/vendor/uri/lib/uri/generic.rb b/lib/bundler/vendor/uri/lib/uri/generic.rb new file mode 100644 index 00000000000..56b09e1d7f7 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/generic.rb @@ -0,0 +1,1568 @@ +# frozen_string_literal: true + +# = uri/generic.rb +# +# Author:: Akira Yamada +# License:: You can redistribute it and/or modify it under the same term as Ruby. +# Revision:: $Id$ +# +# See Bundler::URI for general documentation +# + +require_relative 'common' +autoload :IPSocket, 'socket' +autoload :IPAddr, 'ipaddr' + +module Bundler::URI + + # + # Base class for all Bundler::URI classes. + # Implements generic Bundler::URI syntax as per RFC 2396. + # + class Generic + include Bundler::URI + + # + # A Default port of nil for Bundler::URI::Generic. + # + DEFAULT_PORT = nil + + # + # Returns default port. + # + def self.default_port + self::DEFAULT_PORT + end + + # + # Returns default port. + # + def default_port + self.class.default_port + end + + # + # An Array of the available components for Bundler::URI::Generic. + # + COMPONENT = [ + :scheme, + :userinfo, :host, :port, :registry, + :path, :opaque, + :query, + :fragment + ].freeze + + # + # Components of the Bundler::URI in the order. + # + def self.component + self::COMPONENT + end + + USE_REGISTRY = false # :nodoc: + + def self.use_registry # :nodoc: + self::USE_REGISTRY + end + + # + # == Synopsis + # + # See ::new. + # + # == Description + # + # At first, tries to create a new Bundler::URI::Generic instance using + # Bundler::URI::Generic::build. But, if exception Bundler::URI::InvalidComponentError is raised, + # then it does Bundler::URI::Escape.escape all Bundler::URI components and tries again. + # + def self.build2(args) + begin + return self.build(args) + rescue InvalidComponentError + if args.kind_of?(Array) + return self.build(args.collect{|x| + if x.is_a?(String) + DEFAULT_PARSER.escape(x) + else + x + end + }) + elsif args.kind_of?(Hash) + tmp = {} + args.each do |key, value| + tmp[key] = if value + DEFAULT_PARSER.escape(value) + else + value + end + end + return self.build(tmp) + end + end + end + + # + # == Synopsis + # + # See ::new. + # + # == Description + # + # Creates a new Bundler::URI::Generic instance from components of Bundler::URI::Generic + # with check. Components are: scheme, userinfo, host, port, registry, path, + # opaque, query, and fragment. You can provide arguments either by an Array or a Hash. + # See ::new for hash keys to use or for order of array items. + # + def self.build(args) + if args.kind_of?(Array) && + args.size == ::Bundler::URI::Generic::COMPONENT.size + tmp = args.dup + elsif args.kind_of?(Hash) + tmp = ::Bundler::URI::Generic::COMPONENT.collect do |c| + if args.include?(c) + args[c] + else + nil + end + end + else + component = self.class.component rescue ::Bundler::URI::Generic::COMPONENT + raise ArgumentError, + "expected Array of or Hash of components of #{self.class} (#{component.join(', ')})" + end + + tmp << nil + tmp << true + return self.new(*tmp) + end + + # + # == Args + # + # +scheme+:: + # Protocol scheme, i.e. 'http','ftp','mailto' and so on. + # +userinfo+:: + # User name and password, i.e. 'sdmitry:bla'. + # +host+:: + # Server host name. + # +port+:: + # Server port. + # +registry+:: + # Registry of naming authorities. + # +path+:: + # Path on server. + # +opaque+:: + # Opaque part. + # +query+:: + # Query data. + # +fragment+:: + # Part of the Bundler::URI after '#' character. + # +parser+:: + # Parser for internal use [Bundler::URI::DEFAULT_PARSER by default]. + # +arg_check+:: + # Check arguments [false by default]. + # + # == Description + # + # Creates a new Bundler::URI::Generic instance from ``generic'' components without check. + # + def initialize(scheme, + userinfo, host, port, registry, + path, opaque, + query, + fragment, + parser = DEFAULT_PARSER, + arg_check = false) + @scheme = nil + @user = nil + @password = nil + @host = nil + @port = nil + @path = nil + @query = nil + @opaque = nil + @fragment = nil + @parser = parser == DEFAULT_PARSER ? nil : parser + + if arg_check + self.scheme = scheme + self.userinfo = userinfo + self.hostname = host + self.port = port + self.path = path + self.query = query + self.opaque = opaque + self.fragment = fragment + else + self.set_scheme(scheme) + self.set_userinfo(userinfo) + self.set_host(host) + self.set_port(port) + self.set_path(path) + self.query = query + self.set_opaque(opaque) + self.fragment=(fragment) + end + if registry + raise InvalidURIError, + "the scheme #{@scheme} does not accept registry part: #{registry} (or bad hostname?)" + end + + @scheme&.freeze + self.set_path('') if !@path && !@opaque # (see RFC2396 Section 5.2) + self.set_port(self.default_port) if self.default_port && !@port + end + + # + # Returns the scheme component of the Bundler::URI. + # + # Bundler::URI("http://foo/bar/baz").scheme #=> "http" + # + attr_reader :scheme + + # Returns the host component of the Bundler::URI. + # + # Bundler::URI("http://foo/bar/baz").host #=> "foo" + # + # It returns nil if no host component exists. + # + # Bundler::URI("mailto:foo@example.org").host #=> nil + # + # The component does not contain the port number. + # + # Bundler::URI("http://foo:8080/bar/baz").host #=> "foo" + # + # Since IPv6 addresses are wrapped with brackets in URIs, + # this method returns IPv6 addresses wrapped with brackets. + # This form is not appropriate to pass to socket methods such as TCPSocket.open. + # If unwrapped host names are required, use the #hostname method. + # + # Bundler::URI("http://[::1]/bar/baz").host #=> "[::1]" + # Bundler::URI("http://[::1]/bar/baz").hostname #=> "::1" + # + attr_reader :host + + # Returns the port component of the Bundler::URI. + # + # Bundler::URI("http://foo/bar/baz").port #=> 80 + # Bundler::URI("http://foo:8080/bar/baz").port #=> 8080 + # + attr_reader :port + + def registry # :nodoc: + nil + end + + # Returns the path component of the Bundler::URI. + # + # Bundler::URI("http://foo/bar/baz").path #=> "/bar/baz" + # + attr_reader :path + + # Returns the query component of the Bundler::URI. + # + # Bundler::URI("http://foo/bar/baz?search=FooBar").query #=> "search=FooBar" + # + attr_reader :query + + # Returns the opaque part of the Bundler::URI. + # + # Bundler::URI("mailto:foo@example.org").opaque #=> "foo@example.org" + # Bundler::URI("http://foo/bar/baz").opaque #=> nil + # + # The portion of the path that does not make use of the slash '/'. + # The path typically refers to an absolute path or an opaque part. + # (See RFC2396 Section 3 and 5.2.) + # + attr_reader :opaque + + # Returns the fragment component of the Bundler::URI. + # + # Bundler::URI("http://foo/bar/baz?search=FooBar#ponies").fragment #=> "ponies" + # + attr_reader :fragment + + # Returns the parser to be used. + # + # Unless a Bundler::URI::Parser is defined, DEFAULT_PARSER is used. + # + def parser + if !defined?(@parser) || !@parser + DEFAULT_PARSER + else + @parser || DEFAULT_PARSER + end + end + + # Replaces self by other Bundler::URI object. + # + def replace!(oth) + if self.class != oth.class + raise ArgumentError, "expected #{self.class} object" + end + + component.each do |c| + self.__send__("#{c}=", oth.__send__(c)) + end + end + private :replace! + + # + # Components of the Bundler::URI in the order. + # + def component + self.class.component + end + + # + # Checks the scheme +v+ component against the Bundler::URI::Parser Regexp for :SCHEME. + # + def check_scheme(v) + if v && parser.regexp[:SCHEME] !~ v + raise InvalidComponentError, + "bad component(expected scheme component): #{v}" + end + + return true + end + private :check_scheme + + # Protected setter for the scheme component +v+. + # + # See also Bundler::URI::Generic.scheme=. + # + def set_scheme(v) + @scheme = v&.downcase + end + protected :set_scheme + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the scheme component +v+ + # (with validation). + # + # See also Bundler::URI::Generic.check_scheme. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com") + # uri.scheme = "https" + # uri.to_s #=> "https://my.example.com" + # + def scheme=(v) + check_scheme(v) + set_scheme(v) + v + end + + # + # Checks the +user+ and +password+. + # + # If +password+ is not provided, then +user+ is + # split, using Bundler::URI::Generic.split_userinfo, to + # pull +user+ and +password. + # + # See also Bundler::URI::Generic.check_user, Bundler::URI::Generic.check_password. + # + def check_userinfo(user, password = nil) + if !password + user, password = split_userinfo(user) + end + check_user(user) + check_password(password, user) + + return true + end + private :check_userinfo + + # + # Checks the user +v+ component for RFC2396 compliance + # and against the Bundler::URI::Parser Regexp for :USERINFO. + # + # Can not have a registry or opaque component defined, + # with a user component defined. + # + def check_user(v) + if @opaque + raise InvalidURIError, + "can not set user with opaque" + end + + return v unless v + + if parser.regexp[:USERINFO] !~ v + raise InvalidComponentError, + "bad component(expected userinfo component or user component): #{v}" + end + + return true + end + private :check_user + + # + # Checks the password +v+ component for RFC2396 compliance + # and against the Bundler::URI::Parser Regexp for :USERINFO. + # + # Can not have a registry or opaque component defined, + # with a user component defined. + # + def check_password(v, user = @user) + if @opaque + raise InvalidURIError, + "can not set password with opaque" + end + return v unless v + + if !user + raise InvalidURIError, + "password component depends user component" + end + + if parser.regexp[:USERINFO] !~ v + raise InvalidComponentError, + "bad password component" + end + + return true + end + private :check_password + + # + # Sets userinfo, argument is string like 'name:pass'. + # + def userinfo=(userinfo) + if userinfo.nil? + return nil + end + check_userinfo(*userinfo) + set_userinfo(*userinfo) + # returns userinfo + end + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the +user+ component + # (with validation). + # + # See also Bundler::URI::Generic.check_user. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://john:S3nsit1ve@my.example.com") + # uri.user = "sam" + # uri.to_s #=> "http://sam:V3ry_S3nsit1ve@my.example.com" + # + def user=(user) + check_user(user) + set_user(user) + # returns user + end + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the +password+ component + # (with validation). + # + # See also Bundler::URI::Generic.check_password. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://john:S3nsit1ve@my.example.com") + # uri.password = "V3ry_S3nsit1ve" + # uri.to_s #=> "http://john:V3ry_S3nsit1ve@my.example.com" + # + def password=(password) + check_password(password) + set_password(password) + # returns password + end + + # Protected setter for the +user+ component, and +password+ if available + # (with validation). + # + # See also Bundler::URI::Generic.userinfo=. + # + def set_userinfo(user, password = nil) + unless password + user, password = split_userinfo(user) + end + @user = user + @password = password if password + + [@user, @password] + end + protected :set_userinfo + + # Protected setter for the user component +v+. + # + # See also Bundler::URI::Generic.user=. + # + def set_user(v) + set_userinfo(v, @password) + v + end + protected :set_user + + # Protected setter for the password component +v+. + # + # See also Bundler::URI::Generic.password=. + # + def set_password(v) + @password = v + # returns v + end + protected :set_password + + # Returns the userinfo +ui+ as [user, password] + # if properly formatted as 'user:password'. + def split_userinfo(ui) + return nil, nil unless ui + user, password = ui.split(':', 2) + + return user, password + end + private :split_userinfo + + # Escapes 'user:password' +v+ based on RFC 1738 section 3.1. + def escape_userpass(v) + parser.escape(v, /[@:\/]/o) # RFC 1738 section 3.1 #/ + end + private :escape_userpass + + # Returns the userinfo, either as 'user' or 'user:password'. + def userinfo + if @user.nil? + nil + elsif @password.nil? + @user + else + @user + ':' + @password + end + end + + # Returns the user component. + def user + @user + end + + # Returns the password component. + def password + @password + end + + # + # Checks the host +v+ component for RFC2396 compliance + # and against the Bundler::URI::Parser Regexp for :HOST. + # + # Can not have a registry or opaque component defined, + # with a host component defined. + # + def check_host(v) + return v unless v + + if @opaque + raise InvalidURIError, + "can not set host with registry or opaque" + elsif parser.regexp[:HOST] !~ v + raise InvalidComponentError, + "bad component(expected host component): #{v}" + end + + return true + end + private :check_host + + # Protected setter for the host component +v+. + # + # See also Bundler::URI::Generic.host=. + # + def set_host(v) + @host = v + end + protected :set_host + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the host component +v+ + # (with validation). + # + # See also Bundler::URI::Generic.check_host. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com") + # uri.host = "foo.com" + # uri.to_s #=> "http://foo.com" + # + def host=(v) + check_host(v) + set_host(v) + v + end + + # Extract the host part of the Bundler::URI and unwrap brackets for IPv6 addresses. + # + # This method is the same as Bundler::URI::Generic#host except + # brackets for IPv6 (and future IP) addresses are removed. + # + # uri = Bundler::URI("http://[::1]/bar") + # uri.hostname #=> "::1" + # uri.host #=> "[::1]" + # + def hostname + v = self.host + /\A\[(.*)\]\z/ =~ v ? $1 : v + end + + # Sets the host part of the Bundler::URI as the argument with brackets for IPv6 addresses. + # + # This method is the same as Bundler::URI::Generic#host= except + # the argument can be a bare IPv6 address. + # + # uri = Bundler::URI("http://foo/bar") + # uri.hostname = "::1" + # uri.to_s #=> "http://[::1]/bar" + # + # If the argument seems to be an IPv6 address, + # it is wrapped with brackets. + # + def hostname=(v) + v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v + self.host = v + end + + # + # Checks the port +v+ component for RFC2396 compliance + # and against the Bundler::URI::Parser Regexp for :PORT. + # + # Can not have a registry or opaque component defined, + # with a port component defined. + # + def check_port(v) + return v unless v + + if @opaque + raise InvalidURIError, + "can not set port with registry or opaque" + elsif !v.kind_of?(Integer) && parser.regexp[:PORT] !~ v + raise InvalidComponentError, + "bad component(expected port component): #{v.inspect}" + end + + return true + end + private :check_port + + # Protected setter for the port component +v+. + # + # See also Bundler::URI::Generic.port=. + # + def set_port(v) + v = v.empty? ? nil : v.to_i unless !v || v.kind_of?(Integer) + @port = v + end + protected :set_port + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the port component +v+ + # (with validation). + # + # See also Bundler::URI::Generic.check_port. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com") + # uri.port = 8080 + # uri.to_s #=> "http://my.example.com:8080" + # + def port=(v) + check_port(v) + set_port(v) + port + end + + def check_registry(v) # :nodoc: + raise InvalidURIError, "can not set registry" + end + private :check_registry + + def set_registry(v) #:nodoc: + raise InvalidURIError, "can not set registry" + end + protected :set_registry + + def registry=(v) + raise InvalidURIError, "can not set registry" + end + + # + # Checks the path +v+ component for RFC2396 compliance + # and against the Bundler::URI::Parser Regexp + # for :ABS_PATH and :REL_PATH. + # + # Can not have a opaque component defined, + # with a path component defined. + # + def check_path(v) + # raise if both hier and opaque are not nil, because: + # absoluteURI = scheme ":" ( hier_part | opaque_part ) + # hier_part = ( net_path | abs_path ) [ "?" query ] + if v && @opaque + raise InvalidURIError, + "path conflicts with opaque" + end + + # If scheme is ftp, path may be relative. + # See RFC 1738 section 3.2.2, and RFC 2396. + if @scheme && @scheme != "ftp" + if v && v != '' && parser.regexp[:ABS_PATH] !~ v + raise InvalidComponentError, + "bad component(expected absolute path component): #{v}" + end + else + if v && v != '' && parser.regexp[:ABS_PATH] !~ v && + parser.regexp[:REL_PATH] !~ v + raise InvalidComponentError, + "bad component(expected relative path component): #{v}" + end + end + + return true + end + private :check_path + + # Protected setter for the path component +v+. + # + # See also Bundler::URI::Generic.path=. + # + def set_path(v) + @path = v + end + protected :set_path + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the path component +v+ + # (with validation). + # + # See also Bundler::URI::Generic.check_path. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com/pub/files") + # uri.path = "/faq/" + # uri.to_s #=> "http://my.example.com/faq/" + # + def path=(v) + check_path(v) + set_path(v) + v + end + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the query component +v+. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com/?id=25") + # uri.query = "id=1" + # uri.to_s #=> "http://my.example.com/?id=1" + # + def query=(v) + return @query = nil unless v + raise InvalidURIError, "query conflicts with opaque" if @opaque + + x = v.to_str + v = x.dup if x.equal? v + v.encode!(Encoding::UTF_8) rescue nil + v.delete!("\t\r\n") + v.force_encoding(Encoding::ASCII_8BIT) + raise InvalidURIError, "invalid percent escape: #{$1}" if /(%\H\H)/n.match(v) + v.gsub!(/(?!%\h\h|[!$-&(-;=?-_a-~])./n.freeze){'%%%02X' % $&.ord} + v.force_encoding(Encoding::US_ASCII) + @query = v + end + + # + # Checks the opaque +v+ component for RFC2396 compliance and + # against the Bundler::URI::Parser Regexp for :OPAQUE. + # + # Can not have a host, port, user, or path component defined, + # with an opaque component defined. + # + def check_opaque(v) + return v unless v + + # raise if both hier and opaque are not nil, because: + # absoluteURI = scheme ":" ( hier_part | opaque_part ) + # hier_part = ( net_path | abs_path ) [ "?" query ] + if @host || @port || @user || @path # userinfo = @user + ':' + @password + raise InvalidURIError, + "can not set opaque with host, port, userinfo or path" + elsif v && parser.regexp[:OPAQUE] !~ v + raise InvalidComponentError, + "bad component(expected opaque component): #{v}" + end + + return true + end + private :check_opaque + + # Protected setter for the opaque component +v+. + # + # See also Bundler::URI::Generic.opaque=. + # + def set_opaque(v) + @opaque = v + end + protected :set_opaque + + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the opaque component +v+ + # (with validation). + # + # See also Bundler::URI::Generic.check_opaque. + # + def opaque=(v) + check_opaque(v) + set_opaque(v) + v + end + + # + # Checks the fragment +v+ component against the Bundler::URI::Parser Regexp for :FRAGMENT. + # + # + # == Args + # + # +v+:: + # String + # + # == Description + # + # Public setter for the fragment component +v+ + # (with validation). + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com/?id=25#time=1305212049") + # uri.fragment = "time=1305212086" + # uri.to_s #=> "http://my.example.com/?id=25#time=1305212086" + # + def fragment=(v) + return @fragment = nil unless v + + x = v.to_str + v = x.dup if x.equal? v + v.encode!(Encoding::UTF_8) rescue nil + v.delete!("\t\r\n") + v.force_encoding(Encoding::ASCII_8BIT) + v.gsub!(/(?!%\h\h|[!-~])./n){'%%%02X' % $&.ord} + v.force_encoding(Encoding::US_ASCII) + @fragment = v + end + + # + # Returns true if Bundler::URI is hierarchical. + # + # == Description + # + # Bundler::URI has components listed in order of decreasing significance from left to right, + # see RFC3986 https://tools.ietf.org/html/rfc3986 1.2.3. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com/") + # uri.hierarchical? + # #=> true + # uri = Bundler::URI.parse("mailto:joe@example.com") + # uri.hierarchical? + # #=> false + # + def hierarchical? + if @path + true + else + false + end + end + + # + # Returns true if Bundler::URI has a scheme (e.g. http:// or https://) specified. + # + def absolute? + if @scheme + true + else + false + end + end + alias absolute absolute? + + # + # Returns true if Bundler::URI does not have a scheme (e.g. http:// or https://) specified. + # + def relative? + !absolute? + end + + # + # Returns an Array of the path split on '/'. + # + def split_path(path) + path.split("/", -1) + end + private :split_path + + # + # Merges a base path +base+, with relative path +rel+, + # returns a modified base path. + # + def merge_path(base, rel) + + # RFC2396, Section 5.2, 5) + # RFC2396, Section 5.2, 6) + base_path = split_path(base) + rel_path = split_path(rel) + + # RFC2396, Section 5.2, 6), a) + base_path << '' if base_path.last == '..' + while i = base_path.index('..') + base_path.slice!(i - 1, 2) + end + + if (first = rel_path.first) and first.empty? + base_path.clear + rel_path.shift + end + + # RFC2396, Section 5.2, 6), c) + # RFC2396, Section 5.2, 6), d) + rel_path.push('') if rel_path.last == '.' || rel_path.last == '..' + rel_path.delete('.') + + # RFC2396, Section 5.2, 6), e) + tmp = [] + rel_path.each do |x| + if x == '..' && + !(tmp.empty? || tmp.last == '..') + tmp.pop + else + tmp << x + end + end + + add_trailer_slash = !tmp.empty? + if base_path.empty? + base_path = [''] # keep '/' for root directory + elsif add_trailer_slash + base_path.pop + end + while x = tmp.shift + if x == '..' + # RFC2396, Section 4 + # a .. or . in an absolute path has no special meaning + base_path.pop if base_path.size > 1 + else + # if x == '..' + # valid absolute (but abnormal) path "/../..." + # else + # valid absolute path + # end + base_path << x + tmp.each {|t| base_path << t} + add_trailer_slash = false + break + end + end + base_path.push('') if add_trailer_slash + + return base_path.join('/') + end + private :merge_path + + # + # == Args + # + # +oth+:: + # Bundler::URI or String + # + # == Description + # + # Destructive form of #merge. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com") + # uri.merge!("/main.rbx?page=1") + # uri.to_s # => "http://my.example.com/main.rbx?page=1" + # + def merge!(oth) + t = merge(oth) + if self == t + nil + else + replace!(t) + self + end + end + + # + # == Args + # + # +oth+:: + # Bundler::URI or String + # + # == Description + # + # Merges two URIs. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com") + # uri.merge("/main.rbx?page=1") + # # => "http://my.example.com/main.rbx?page=1" + # + def merge(oth) + rel = parser.send(:convert_to_uri, oth) + + if rel.absolute? + #raise BadURIError, "both Bundler::URI are absolute" if absolute? + # hmm... should return oth for usability? + return rel + end + + unless self.absolute? + raise BadURIError, "both Bundler::URI are relative" + end + + base = self.dup + + authority = rel.userinfo || rel.host || rel.port + + # RFC2396, Section 5.2, 2) + if (rel.path.nil? || rel.path.empty?) && !authority && !rel.query + base.fragment=(rel.fragment) if rel.fragment + return base + end + + base.query = nil + base.fragment=(nil) + + # RFC2396, Section 5.2, 4) + if !authority + base.set_path(merge_path(base.path, rel.path)) if base.path && rel.path + else + # RFC2396, Section 5.2, 4) + base.set_path(rel.path) if rel.path + end + + # RFC2396, Section 5.2, 7) + base.set_userinfo(rel.userinfo) if rel.userinfo + base.set_host(rel.host) if rel.host + base.set_port(rel.port) if rel.port + base.query = rel.query if rel.query + base.fragment=(rel.fragment) if rel.fragment + + return base + end # merge + alias + merge + + # :stopdoc: + def route_from_path(src, dst) + case dst + when src + # RFC2396, Section 4.2 + return '' + when %r{(?:\A|/)\.\.?(?:/|\z)} + # dst has abnormal absolute path, + # like "/./", "/../", "/x/../", ... + return dst.dup + end + + src_path = src.scan(%r{[^/]*/}) + dst_path = dst.scan(%r{[^/]*/?}) + + # discard same parts + while !dst_path.empty? && dst_path.first == src_path.first + src_path.shift + dst_path.shift + end + + tmp = dst_path.join + + # calculate + if src_path.empty? + if tmp.empty? + return './' + elsif dst_path.first.include?(':') # (see RFC2396 Section 5) + return './' + tmp + else + return tmp + end + end + + return '../' * src_path.size + tmp + end + private :route_from_path + # :startdoc: + + # :stopdoc: + def route_from0(oth) + oth = parser.send(:convert_to_uri, oth) + if self.relative? + raise BadURIError, + "relative Bundler::URI: #{self}" + end + if oth.relative? + raise BadURIError, + "relative Bundler::URI: #{oth}" + end + + if self.scheme != oth.scheme + return self, self.dup + end + rel = Bundler::URI::Generic.new(nil, # it is relative Bundler::URI + self.userinfo, self.host, self.port, + nil, self.path, self.opaque, + self.query, self.fragment, parser) + + if rel.userinfo != oth.userinfo || + rel.host.to_s.downcase != oth.host.to_s.downcase || + rel.port != oth.port + + if self.userinfo.nil? && self.host.nil? + return self, self.dup + end + + rel.set_port(nil) if rel.port == oth.default_port + return rel, rel + end + rel.set_userinfo(nil) + rel.set_host(nil) + rel.set_port(nil) + + if rel.path && rel.path == oth.path + rel.set_path('') + rel.query = nil if rel.query == oth.query + return rel, rel + elsif rel.opaque && rel.opaque == oth.opaque + rel.set_opaque('') + rel.query = nil if rel.query == oth.query + return rel, rel + end + + # you can modify `rel', but can not `oth'. + return oth, rel + end + private :route_from0 + # :startdoc: + + # + # == Args + # + # +oth+:: + # Bundler::URI or String + # + # == Description + # + # Calculates relative path from oth to self. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse('http://my.example.com/main.rbx?page=1') + # uri.route_from('http://my.example.com') + # #=> # + # + def route_from(oth) + # you can modify `rel', but can not `oth'. + begin + oth, rel = route_from0(oth) + rescue + raise $!.class, $!.message + end + if oth == rel + return rel + end + + rel.set_path(route_from_path(oth.path, self.path)) + if rel.path == './' && self.query + # "./?foo" -> "?foo" + rel.set_path('') + end + + return rel + end + + alias - route_from + + # + # == Args + # + # +oth+:: + # Bundler::URI or String + # + # == Description + # + # Calculates relative path to oth from self. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse('http://my.example.com') + # uri.route_to('http://my.example.com/main.rbx?page=1') + # #=> # + # + def route_to(oth) + parser.send(:convert_to_uri, oth).route_from(self) + end + + # + # Returns normalized Bundler::URI. + # + # require 'bundler/vendor/uri/lib/uri' + # + # Bundler::URI("HTTP://my.EXAMPLE.com").normalize + # #=> # + # + # Normalization here means: + # + # * scheme and host are converted to lowercase, + # * an empty path component is set to "/". + # + def normalize + uri = dup + uri.normalize! + uri + end + + # + # Destructive version of #normalize. + # + def normalize! + if path&.empty? + set_path('/') + end + if scheme && scheme != scheme.downcase + set_scheme(self.scheme.downcase) + end + if host && host != host.downcase + set_host(self.host.downcase) + end + end + + # + # Constructs String from Bundler::URI. + # + def to_s + str = ''.dup + if @scheme + str << @scheme + str << ':' + end + + if @opaque + str << @opaque + else + if @host || %w[file postgres].include?(@scheme) + str << '//' + end + if self.userinfo + str << self.userinfo + str << '@' + end + if @host + str << @host + end + if @port && @port != self.default_port + str << ':' + str << @port.to_s + end + str << @path + if @query + str << '?' + str << @query + end + end + if @fragment + str << '#' + str << @fragment + end + str + end + + # + # Compares two URIs. + # + def ==(oth) + if self.class == oth.class + self.normalize.component_ary == oth.normalize.component_ary + else + false + end + end + + def hash + self.component_ary.hash + end + + def eql?(oth) + self.class == oth.class && + parser == oth.parser && + self.component_ary.eql?(oth.component_ary) + end + +=begin + +--- Bundler::URI::Generic#===(oth) + +=end +# def ===(oth) +# raise NotImplementedError +# end + +=begin +=end + + + # Returns an Array of the components defined from the COMPONENT Array. + def component_ary + component.collect do |x| + self.send(x) + end + end + protected :component_ary + + # == Args + # + # +components+:: + # Multiple Symbol arguments defined in Bundler::URI::HTTP. + # + # == Description + # + # Selects specified components from Bundler::URI. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse('http://myuser:mypass@my.example.com/test.rbx') + # uri.select(:userinfo, :host, :path) + # # => ["myuser:mypass", "my.example.com", "/test.rbx"] + # + def select(*components) + components.collect do |c| + if component.include?(c) + self.send(c) + else + raise ArgumentError, + "expected of components of #{self.class} (#{self.class.component.join(', ')})" + end + end + end + + def inspect + "#<#{self.class} #{self}>" + end + + # + # == Args + # + # +v+:: + # Bundler::URI or String + # + # == Description + # + # Attempts to parse other Bundler::URI +oth+, + # returns [parsed_oth, self]. + # + # == Usage + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("http://my.example.com") + # uri.coerce("http://foo.com") + # #=> [#, #] + # + def coerce(oth) + case oth + when String + oth = parser.parse(oth) + else + super + end + + return oth, self + end + + # Returns a proxy Bundler::URI. + # The proxy Bundler::URI is obtained from environment variables such as http_proxy, + # ftp_proxy, no_proxy, etc. + # If there is no proper proxy, nil is returned. + # + # If the optional parameter +env+ is specified, it is used instead of ENV. + # + # Note that capitalized variables (HTTP_PROXY, FTP_PROXY, NO_PROXY, etc.) + # are examined, too. + # + # But http_proxy and HTTP_PROXY is treated specially under CGI environment. + # It's because HTTP_PROXY may be set by Proxy: header. + # So HTTP_PROXY is not used. + # http_proxy is not used too if the variable is case insensitive. + # CGI_HTTP_PROXY can be used instead. + def find_proxy(env=ENV) + raise BadURIError, "relative Bundler::URI: #{self}" if self.relative? + name = self.scheme.downcase + '_proxy' + proxy_uri = nil + if name == 'http_proxy' && env.include?('REQUEST_METHOD') # CGI? + # HTTP_PROXY conflicts with *_proxy for proxy settings and + # HTTP_* for header information in CGI. + # So it should be careful to use it. + pairs = env.reject {|k, v| /\Ahttp_proxy\z/i !~ k } + case pairs.length + when 0 # no proxy setting anyway. + proxy_uri = nil + when 1 + k, _ = pairs.shift + if k == 'http_proxy' && env[k.upcase] == nil + # http_proxy is safe to use because ENV is case sensitive. + proxy_uri = env[name] + else + proxy_uri = nil + end + else # http_proxy is safe to use because ENV is case sensitive. + proxy_uri = env.to_hash[name] + end + if !proxy_uri + # Use CGI_HTTP_PROXY. cf. libwww-perl. + proxy_uri = env["CGI_#{name.upcase}"] + end + elsif name == 'http_proxy' + unless proxy_uri = env[name] + if proxy_uri = env[name.upcase] + warn 'The environment variable HTTP_PROXY is discouraged. Use http_proxy.', uplevel: 1 + end + end + else + proxy_uri = env[name] || env[name.upcase] + end + + if proxy_uri.nil? || proxy_uri.empty? + return nil + end + + if self.hostname + begin + addr = IPSocket.getaddress(self.hostname) + return nil if /\A127\.|\A::1\z/ =~ addr + rescue SocketError + end + end + + name = 'no_proxy' + if no_proxy = env[name] || env[name.upcase] + return nil unless Bundler::URI::Generic.use_proxy?(self.hostname, addr, self.port, no_proxy) + end + Bundler::URI.parse(proxy_uri) + end + + def self.use_proxy?(hostname, addr, port, no_proxy) # :nodoc: + hostname = hostname.downcase + dothostname = ".#{hostname}" + no_proxy.scan(/([^:,\s]+)(?::(\d+))?/) {|p_host, p_port| + if !p_port || port == p_port.to_i + if p_host.start_with?('.') + return false if hostname.end_with?(p_host.downcase) + else + return false if dothostname.end_with?(".#{p_host.downcase}") + end + if addr + begin + return false if IPAddr.new(p_host).include?(addr) + rescue IPAddr::InvalidAddressError + next + end + end + end + } + true + end + end +end diff --git a/lib/bundler/vendor/uri/lib/uri/http.rb b/lib/bundler/vendor/uri/lib/uri/http.rb new file mode 100644 index 00000000000..b6ca1c51de3 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/http.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: false +# = uri/http.rb +# +# Author:: Akira Yamada +# License:: You can redistribute it and/or modify it under the same term as Ruby. +# Revision:: $Id$ +# +# See Bundler::URI for general documentation +# + +require_relative 'generic' + +module Bundler::URI + + # + # The syntax of HTTP URIs is defined in RFC1738 section 3.3. + # + # Note that the Ruby Bundler::URI library allows HTTP URLs containing usernames and + # passwords. This is not legal as per the RFC, but used to be + # supported in Internet Explorer 5 and 6, before the MS04-004 security + # update. See . + # + class HTTP < Generic + # A Default port of 80 for Bundler::URI::HTTP. + DEFAULT_PORT = 80 + + # An Array of the available components for Bundler::URI::HTTP. + COMPONENT = %i[ + scheme + userinfo host port + path + query + fragment + ].freeze + + # + # == Description + # + # Creates a new Bundler::URI::HTTP object from components, with syntax checking. + # + # The components accepted are userinfo, host, port, path, query, and + # fragment. + # + # The components should be provided either as an Array, or as a Hash + # with keys formed by preceding the component names with a colon. + # + # If an Array is used, the components must be passed in the + # order [userinfo, host, port, path, query, fragment]. + # + # Example: + # + # uri = Bundler::URI::HTTP.build(host: 'www.example.com', path: '/foo/bar') + # + # uri = Bundler::URI::HTTP.build([nil, "www.example.com", nil, "/path", + # "query", 'fragment']) + # + # Currently, if passed userinfo components this method generates + # invalid HTTP URIs as per RFC 1738. + # + def self.build(args) + tmp = Util.make_components_hash(self, args) + super(tmp) + end + + # + # == Description + # + # Returns the full path for an HTTP request, as required by Net::HTTP::Get. + # + # If the Bundler::URI contains a query, the full path is Bundler::URI#path + '?' + Bundler::URI#query. + # Otherwise, the path is simply Bundler::URI#path. + # + # Example: + # + # uri = Bundler::URI::HTTP.build(path: '/foo/bar', query: 'test=true') + # uri.request_uri # => "/foo/bar?test=true" + # + def request_uri + return unless @path + + url = @query ? "#@path?#@query" : @path.dup + url.start_with?(?/.freeze) ? url : ?/ + url + end + end + + @@schemes['HTTP'] = HTTP + +end diff --git a/lib/bundler/vendor/uri/lib/uri/https.rb b/lib/bundler/vendor/uri/lib/uri/https.rb new file mode 100644 index 00000000000..78dc6bf532d --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/https.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: false +# = uri/https.rb +# +# Author:: Akira Yamada +# License:: You can redistribute it and/or modify it under the same term as Ruby. +# Revision:: $Id$ +# +# See Bundler::URI for general documentation +# + +require_relative 'http' + +module Bundler::URI + + # The default port for HTTPS URIs is 443, and the scheme is 'https:' rather + # than 'http:'. Other than that, HTTPS URIs are identical to HTTP URIs; + # see Bundler::URI::HTTP. + class HTTPS < HTTP + # A Default port of 443 for Bundler::URI::HTTPS + DEFAULT_PORT = 443 + end + @@schemes['HTTPS'] = HTTPS +end diff --git a/lib/bundler/vendor/uri/lib/uri/ldap.rb b/lib/bundler/vendor/uri/lib/uri/ldap.rb new file mode 100644 index 00000000000..b707bedb971 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/ldap.rb @@ -0,0 +1,261 @@ +# frozen_string_literal: false +# = uri/ldap.rb +# +# Author:: +# Takaaki Tateishi +# Akira Yamada +# License:: +# Bundler::URI::LDAP is copyrighted free software by Takaaki Tateishi and Akira Yamada. +# You can redistribute it and/or modify it under the same term as Ruby. +# Revision:: $Id$ +# +# See Bundler::URI for general documentation +# + +require_relative 'generic' + +module Bundler::URI + + # + # LDAP Bundler::URI SCHEMA (described in RFC2255). + #-- + # ldap:///[?[?[?[?]]]] + #++ + class LDAP < Generic + + # A Default port of 389 for Bundler::URI::LDAP. + DEFAULT_PORT = 389 + + # An Array of the available components for Bundler::URI::LDAP. + COMPONENT = [ + :scheme, + :host, :port, + :dn, + :attributes, + :scope, + :filter, + :extensions, + ].freeze + + # Scopes available for the starting point. + # + # * SCOPE_BASE - the Base DN + # * SCOPE_ONE - one level under the Base DN, not including the base DN and + # not including any entries under this + # * SCOPE_SUB - subtrees, all entries at all levels + # + SCOPE = [ + SCOPE_ONE = 'one', + SCOPE_SUB = 'sub', + SCOPE_BASE = 'base', + ].freeze + + # + # == Description + # + # Creates a new Bundler::URI::LDAP object from components, with syntax checking. + # + # The components accepted are host, port, dn, attributes, + # scope, filter, and extensions. + # + # The components should be provided either as an Array, or as a Hash + # with keys formed by preceding the component names with a colon. + # + # If an Array is used, the components must be passed in the + # order [host, port, dn, attributes, scope, filter, extensions]. + # + # Example: + # + # uri = Bundler::URI::LDAP.build({:host => 'ldap.example.com', + # :dn => '/dc=example'}) + # + # uri = Bundler::URI::LDAP.build(["ldap.example.com", nil, + # "/dc=example;dc=com", "query", nil, nil, nil]) + # + def self.build(args) + tmp = Util::make_components_hash(self, args) + + if tmp[:dn] + tmp[:path] = tmp[:dn] + end + + query = [] + [:extensions, :filter, :scope, :attributes].collect do |x| + next if !tmp[x] && query.size == 0 + query.unshift(tmp[x]) + end + + tmp[:query] = query.join('?') + + return super(tmp) + end + + # + # == Description + # + # Creates a new Bundler::URI::LDAP object from generic Bundler::URI components as per + # RFC 2396. No LDAP-specific syntax checking is performed. + # + # Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+, + # +opaque+, +query+, and +fragment+, in that order. + # + # Example: + # + # uri = Bundler::URI::LDAP.new("ldap", nil, "ldap.example.com", nil, nil, + # "/dc=example;dc=com", nil, "query", nil) + # + # See also Bundler::URI::Generic.new. + # + def initialize(*arg) + super(*arg) + + if @fragment + raise InvalidURIError, 'bad LDAP URL' + end + + parse_dn + parse_query + end + + # Private method to cleanup +dn+ from using the +path+ component attribute. + def parse_dn + @dn = @path[1..-1] + end + private :parse_dn + + # Private method to cleanup +attributes+, +scope+, +filter+, and +extensions+ + # from using the +query+ component attribute. + def parse_query + @attributes = nil + @scope = nil + @filter = nil + @extensions = nil + + if @query + attrs, scope, filter, extensions = @query.split('?') + + @attributes = attrs if attrs && attrs.size > 0 + @scope = scope if scope && scope.size > 0 + @filter = filter if filter && filter.size > 0 + @extensions = extensions if extensions && extensions.size > 0 + end + end + private :parse_query + + # Private method to assemble +query+ from +attributes+, +scope+, +filter+, and +extensions+. + def build_path_query + @path = '/' + @dn + + query = [] + [@extensions, @filter, @scope, @attributes].each do |x| + next if !x && query.size == 0 + query.unshift(x) + end + @query = query.join('?') + end + private :build_path_query + + # Returns dn. + def dn + @dn + end + + # Private setter for dn +val+. + def set_dn(val) + @dn = val + build_path_query + @dn + end + protected :set_dn + + # Setter for dn +val+. + def dn=(val) + set_dn(val) + val + end + + # Returns attributes. + def attributes + @attributes + end + + # Private setter for attributes +val+. + def set_attributes(val) + @attributes = val + build_path_query + @attributes + end + protected :set_attributes + + # Setter for attributes +val+. + def attributes=(val) + set_attributes(val) + val + end + + # Returns scope. + def scope + @scope + end + + # Private setter for scope +val+. + def set_scope(val) + @scope = val + build_path_query + @scope + end + protected :set_scope + + # Setter for scope +val+. + def scope=(val) + set_scope(val) + val + end + + # Returns filter. + def filter + @filter + end + + # Private setter for filter +val+. + def set_filter(val) + @filter = val + build_path_query + @filter + end + protected :set_filter + + # Setter for filter +val+. + def filter=(val) + set_filter(val) + val + end + + # Returns extensions. + def extensions + @extensions + end + + # Private setter for extensions +val+. + def set_extensions(val) + @extensions = val + build_path_query + @extensions + end + protected :set_extensions + + # Setter for extensions +val+. + def extensions=(val) + set_extensions(val) + val + end + + # Checks if Bundler::URI has a path. + # For Bundler::URI::LDAP this will return +false+. + def hierarchical? + false + end + end + + @@schemes['LDAP'] = LDAP +end diff --git a/lib/bundler/vendor/uri/lib/uri/ldaps.rb b/lib/bundler/vendor/uri/lib/uri/ldaps.rb new file mode 100644 index 00000000000..0af35bb16b4 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/ldaps.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: false +# = uri/ldap.rb +# +# License:: You can redistribute it and/or modify it under the same term as Ruby. +# +# See Bundler::URI for general documentation +# + +require_relative 'ldap' + +module Bundler::URI + + # The default port for LDAPS URIs is 636, and the scheme is 'ldaps:' rather + # than 'ldap:'. Other than that, LDAPS URIs are identical to LDAP URIs; + # see Bundler::URI::LDAP. + class LDAPS < LDAP + # A Default port of 636 for Bundler::URI::LDAPS + DEFAULT_PORT = 636 + end + @@schemes['LDAPS'] = LDAPS +end diff --git a/lib/bundler/vendor/uri/lib/uri/mailto.rb b/lib/bundler/vendor/uri/lib/uri/mailto.rb new file mode 100644 index 00000000000..5b2a4765c81 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/mailto.rb @@ -0,0 +1,294 @@ +# frozen_string_literal: false +# = uri/mailto.rb +# +# Author:: Akira Yamada +# License:: You can redistribute it and/or modify it under the same term as Ruby. +# Revision:: $Id$ +# +# See Bundler::URI for general documentation +# + +require_relative 'generic' + +module Bundler::URI + + # + # RFC6068, the mailto URL scheme. + # + class MailTo < Generic + include REGEXP + + # A Default port of nil for Bundler::URI::MailTo. + DEFAULT_PORT = nil + + # An Array of the available components for Bundler::URI::MailTo. + COMPONENT = [ :scheme, :to, :headers ].freeze + + # :stopdoc: + # "hname" and "hvalue" are encodings of an RFC 822 header name and + # value, respectively. As with "to", all URL reserved characters must + # be encoded. + # + # "#mailbox" is as specified in RFC 822 [RFC822]. This means that it + # consists of zero or more comma-separated mail addresses, possibly + # including "phrase" and "comment" components. Note that all URL + # reserved characters in "to" must be encoded: in particular, + # parentheses, commas, and the percent sign ("%"), which commonly occur + # in the "mailbox" syntax. + # + # Within mailto URLs, the characters "?", "=", "&" are reserved. + + # ; RFC 6068 + # hfields = "?" hfield *( "&" hfield ) + # hfield = hfname "=" hfvalue + # hfname = *qchar + # hfvalue = *qchar + # qchar = unreserved / pct-encoded / some-delims + # some-delims = "!" / "$" / "'" / "(" / ")" / "*" + # / "+" / "," / ";" / ":" / "@" + # + # ; RFC3986 + # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + # pct-encoded = "%" HEXDIG HEXDIG + HEADER_REGEXP = /\A(?(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g)*\z/ + # practical regexp for email address + # https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address + EMAIL_REGEXP = /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/ + # :startdoc: + + # + # == Description + # + # Creates a new Bundler::URI::MailTo object from components, with syntax checking. + # + # Components can be provided as an Array or Hash. If an Array is used, + # the components must be supplied as [to, headers]. + # + # If a Hash is used, the keys are the component names preceded by colons. + # + # The headers can be supplied as a pre-encoded string, such as + # "subject=subscribe&cc=address", or as an Array of Arrays + # like [['subject', 'subscribe'], ['cc', 'address']]. + # + # Examples: + # + # require 'bundler/vendor/uri/lib/uri' + # + # m1 = Bundler::URI::MailTo.build(['joe@example.com', 'subject=Ruby']) + # m1.to_s # => "mailto:joe@example.com?subject=Ruby" + # + # m2 = Bundler::URI::MailTo.build(['john@example.com', [['Subject', 'Ruby'], ['Cc', 'jack@example.com']]]) + # m2.to_s # => "mailto:john@example.com?Subject=Ruby&Cc=jack@example.com" + # + # m3 = Bundler::URI::MailTo.build({:to => 'listman@example.com', :headers => [['subject', 'subscribe']]}) + # m3.to_s # => "mailto:listman@example.com?subject=subscribe" + # + def self.build(args) + tmp = Util.make_components_hash(self, args) + + case tmp[:to] + when Array + tmp[:opaque] = tmp[:to].join(',') + when String + tmp[:opaque] = tmp[:to].dup + else + tmp[:opaque] = '' + end + + if tmp[:headers] + query = + case tmp[:headers] + when Array + tmp[:headers].collect { |x| + if x.kind_of?(Array) + x[0] + '=' + x[1..-1].join + else + x.to_s + end + }.join('&') + when Hash + tmp[:headers].collect { |h,v| + h + '=' + v + }.join('&') + else + tmp[:headers].to_s + end + unless query.empty? + tmp[:opaque] << '?' << query + end + end + + super(tmp) + end + + # + # == Description + # + # Creates a new Bundler::URI::MailTo object from generic URL components with + # no syntax checking. + # + # This method is usually called from Bundler::URI::parse, which checks + # the validity of each component. + # + def initialize(*arg) + super(*arg) + + @to = nil + @headers = [] + + # The RFC3986 parser does not normally populate opaque + @opaque = "?#{@query}" if @query && !@opaque + + unless @opaque + raise InvalidComponentError, + "missing opaque part for mailto URL" + end + to, header = @opaque.split('?', 2) + # allow semicolon as a addr-spec separator + # http://support.microsoft.com/kb/820868 + unless /\A(?:[^@,;]+@[^@,;]+(?:\z|[,;]))*\z/ =~ to + raise InvalidComponentError, + "unrecognised opaque part for mailtoURL: #{@opaque}" + end + + if arg[10] # arg_check + self.to = to + self.headers = header + else + set_to(to) + set_headers(header) + end + end + + # The primary e-mail address of the URL, as a String. + attr_reader :to + + # E-mail headers set by the URL, as an Array of Arrays. + attr_reader :headers + + # Checks the to +v+ component. + def check_to(v) + return true unless v + return true if v.size == 0 + + v.split(/[,;]/).each do |addr| + # check url safety as path-rootless + if /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*\z/ !~ addr + raise InvalidComponentError, + "an address in 'to' is invalid as Bundler::URI #{addr.dump}" + end + + # check addr-spec + # don't s/\+/ /g + addr.gsub!(/%\h\h/, Bundler::URI::TBLDECWWWCOMP_) + if EMAIL_REGEXP !~ addr + raise InvalidComponentError, + "an address in 'to' is invalid as uri-escaped addr-spec #{addr.dump}" + end + end + + true + end + private :check_to + + # Private setter for to +v+. + def set_to(v) + @to = v + end + protected :set_to + + # Setter for to +v+. + def to=(v) + check_to(v) + set_to(v) + v + end + + # Checks the headers +v+ component against either + # * HEADER_REGEXP + def check_headers(v) + return true unless v + return true if v.size == 0 + if HEADER_REGEXP !~ v + raise InvalidComponentError, + "bad component(expected opaque component): #{v}" + end + + true + end + private :check_headers + + # Private setter for headers +v+. + def set_headers(v) + @headers = [] + if v + v.split('&').each do |x| + @headers << x.split(/=/, 2) + end + end + end + protected :set_headers + + # Setter for headers +v+. + def headers=(v) + check_headers(v) + set_headers(v) + v + end + + # Constructs String from Bundler::URI. + def to_s + @scheme + ':' + + if @to + @to + else + '' + end + + if @headers.size > 0 + '?' + @headers.collect{|x| x.join('=')}.join('&') + else + '' + end + + if @fragment + '#' + @fragment + else + '' + end + end + + # Returns the RFC822 e-mail text equivalent of the URL, as a String. + # + # Example: + # + # require 'bundler/vendor/uri/lib/uri' + # + # uri = Bundler::URI.parse("mailto:ruby-list@ruby-lang.org?Subject=subscribe&cc=myaddr") + # uri.to_mailtext + # # => "To: ruby-list@ruby-lang.org\nSubject: subscribe\nCc: myaddr\n\n\n" + # + def to_mailtext + to = Bundler::URI.decode_www_form_component(@to) + head = '' + body = '' + @headers.each do |x| + case x[0] + when 'body' + body = Bundler::URI.decode_www_form_component(x[1]) + when 'to' + to << ', ' + Bundler::URI.decode_www_form_component(x[1]) + else + head << Bundler::URI.decode_www_form_component(x[0]).capitalize + ': ' + + Bundler::URI.decode_www_form_component(x[1]) + "\n" + end + end + + "To: #{to} +#{head} +#{body} +" + end + alias to_rfc822text to_mailtext + end + + @@schemes['MAILTO'] = MailTo +end diff --git a/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb b/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb new file mode 100644 index 00000000000..a0d62ede640 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb @@ -0,0 +1,546 @@ +# frozen_string_literal: false +#-- +# = uri/common.rb +# +# Author:: Akira Yamada +# Revision:: $Id$ +# License:: +# You can redistribute it and/or modify it under the same term as Ruby. +# +# See Bundler::URI for general documentation +# + +module Bundler::URI + # + # Includes Bundler::URI::REGEXP::PATTERN + # + module RFC2396_REGEXP + # + # Patterns used to parse Bundler::URI's + # + module PATTERN + # :stopdoc: + + # RFC 2396 (Bundler::URI Generic Syntax) + # RFC 2732 (IPv6 Literal Addresses in URL's) + # RFC 2373 (IPv6 Addressing Architecture) + + # alpha = lowalpha | upalpha + ALPHA = "a-zA-Z" + # alphanum = alpha | digit + ALNUM = "#{ALPHA}\\d" + + # hex = digit | "A" | "B" | "C" | "D" | "E" | "F" | + # "a" | "b" | "c" | "d" | "e" | "f" + HEX = "a-fA-F\\d" + # escaped = "%" hex hex + ESCAPED = "%[#{HEX}]{2}" + # mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | + # "(" | ")" + # unreserved = alphanum | mark + UNRESERVED = "\\-_.!~*'()#{ALNUM}" + # reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | + # "$" | "," + # reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | + # "$" | "," | "[" | "]" (RFC 2732) + RESERVED = ";/?:@&=+$,\\[\\]" + + # domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum + DOMLABEL = "(?:[#{ALNUM}](?:[-#{ALNUM}]*[#{ALNUM}])?)" + # toplabel = alpha | alpha *( alphanum | "-" ) alphanum + TOPLABEL = "(?:[#{ALPHA}](?:[-#{ALNUM}]*[#{ALNUM}])?)" + # hostname = *( domainlabel "." ) toplabel [ "." ] + HOSTNAME = "(?:#{DOMLABEL}\\.)*#{TOPLABEL}\\.?" + + # :startdoc: + end # PATTERN + + # :startdoc: + end # REGEXP + + # Class that parses String's into Bundler::URI's. + # + # It contains a Hash set of patterns and Regexp's that match and validate. + # + class RFC2396_Parser + include RFC2396_REGEXP + + # + # == Synopsis + # + # Bundler::URI::Parser.new([opts]) + # + # == Args + # + # The constructor accepts a hash as options for parser. + # Keys of options are pattern names of Bundler::URI components + # and values of options are pattern strings. + # The constructor generates set of regexps for parsing URIs. + # + # You can use the following keys: + # + # * :ESCAPED (Bundler::URI::PATTERN::ESCAPED in default) + # * :UNRESERVED (Bundler::URI::PATTERN::UNRESERVED in default) + # * :DOMLABEL (Bundler::URI::PATTERN::DOMLABEL in default) + # * :TOPLABEL (Bundler::URI::PATTERN::TOPLABEL in default) + # * :HOSTNAME (Bundler::URI::PATTERN::HOSTNAME in default) + # + # == Examples + # + # p = Bundler::URI::Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})") + # u = p.parse("http://example.jp/%uABCD") #=> # + # Bundler::URI.parse(u.to_s) #=> raises Bundler::URI::InvalidURIError + # + # s = "http://example.com/ABCD" + # u1 = p.parse(s) #=> # + # u2 = Bundler::URI.parse(s) #=> # + # u1 == u2 #=> true + # u1.eql?(u2) #=> false + # + def initialize(opts = {}) + @pattern = initialize_pattern(opts) + @pattern.each_value(&:freeze) + @pattern.freeze + + @regexp = initialize_regexp(@pattern) + @regexp.each_value(&:freeze) + @regexp.freeze + end + + # The Hash of patterns. + # + # See also Bundler::URI::Parser.initialize_pattern. + attr_reader :pattern + + # The Hash of Regexp. + # + # See also Bundler::URI::Parser.initialize_regexp. + attr_reader :regexp + + # Returns a split Bundler::URI against regexp[:ABS_URI]. + def split(uri) + case uri + when '' + # null uri + + when @regexp[:ABS_URI] + scheme, opaque, userinfo, host, port, + registry, path, query, fragment = $~[1..-1] + + # Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] + + # absoluteURI = scheme ":" ( hier_part | opaque_part ) + # hier_part = ( net_path | abs_path ) [ "?" query ] + # opaque_part = uric_no_slash *uric + + # abs_path = "/" path_segments + # net_path = "//" authority [ abs_path ] + + # authority = server | reg_name + # server = [ [ userinfo "@" ] hostport ] + + if !scheme + raise InvalidURIError, + "bad Bundler::URI(absolute but no scheme): #{uri}" + end + if !opaque && (!path && (!host && !registry)) + raise InvalidURIError, + "bad Bundler::URI(absolute but no path): #{uri}" + end + + when @regexp[:REL_URI] + scheme = nil + opaque = nil + + userinfo, host, port, registry, + rel_segment, abs_path, query, fragment = $~[1..-1] + if rel_segment && abs_path + path = rel_segment + abs_path + elsif rel_segment + path = rel_segment + elsif abs_path + path = abs_path + end + + # Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] + + # relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ] + + # net_path = "//" authority [ abs_path ] + # abs_path = "/" path_segments + # rel_path = rel_segment [ abs_path ] + + # authority = server | reg_name + # server = [ [ userinfo "@" ] hostport ] + + else + raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri}" + end + + path = '' if !path && !opaque # (see RFC2396 Section 5.2) + ret = [ + scheme, + userinfo, host, port, # X + registry, # X + path, # Y + opaque, # Y + query, + fragment + ] + return ret + end + + # + # == Args + # + # +uri+:: + # String + # + # == Description + # + # Parses +uri+ and constructs either matching Bundler::URI scheme object + # (File, FTP, HTTP, HTTPS, LDAP, LDAPS, or MailTo) or Bundler::URI::Generic. + # + # == Usage + # + # p = Bundler::URI::Parser.new + # p.parse("ldap://ldap.example.com/dc=example?user=john") + # #=> # + # + def parse(uri) + scheme, userinfo, host, port, + registry, path, opaque, query, fragment = self.split(uri) + + if scheme && Bundler::URI.scheme_list.include?(scheme.upcase) + Bundler::URI.scheme_list[scheme.upcase].new(scheme, userinfo, host, port, + registry, path, opaque, query, + fragment, self) + else + Generic.new(scheme, userinfo, host, port, + registry, path, opaque, query, + fragment, self) + end + end + + + # + # == Args + # + # +uris+:: + # an Array of Strings + # + # == Description + # + # Attempts to parse and merge a set of URIs. + # + def join(*uris) + uris[0] = convert_to_uri(uris[0]) + uris.inject :merge + end + + # + # :call-seq: + # extract( str ) + # extract( str, schemes ) + # extract( str, schemes ) {|item| block } + # + # == Args + # + # +str+:: + # String to search + # +schemes+:: + # Patterns to apply to +str+ + # + # == Description + # + # Attempts to parse and merge a set of URIs. + # If no +block+ given, then returns the result, + # else it calls +block+ for each element in result. + # + # See also Bundler::URI::Parser.make_regexp. + # + def extract(str, schemes = nil) + if block_given? + str.scan(make_regexp(schemes)) { yield $& } + nil + else + result = [] + str.scan(make_regexp(schemes)) { result.push $& } + result + end + end + + # Returns Regexp that is default self.regexp[:ABS_URI_REF], + # unless +schemes+ is provided. Then it is a Regexp.union with self.pattern[:X_ABS_URI]. + def make_regexp(schemes = nil) + unless schemes + @regexp[:ABS_URI_REF] + else + /(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x + end + end + + # + # :call-seq: + # escape( str ) + # escape( str, unsafe ) + # + # == Args + # + # +str+:: + # String to make safe + # +unsafe+:: + # Regexp to apply. Defaults to self.regexp[:UNSAFE] + # + # == Description + # + # Constructs a safe String from +str+, removing unsafe characters, + # replacing them with codes. + # + def escape(str, unsafe = @regexp[:UNSAFE]) + unless unsafe.kind_of?(Regexp) + # perhaps unsafe is String object + unsafe = Regexp.new("[#{Regexp.quote(unsafe)}]", false) + end + str.gsub(unsafe) do + us = $& + tmp = '' + us.each_byte do |uc| + tmp << sprintf('%%%02X', uc) + end + tmp + end.force_encoding(Encoding::US_ASCII) + end + + # + # :call-seq: + # unescape( str ) + # unescape( str, escaped ) + # + # == Args + # + # +str+:: + # String to remove escapes from + # +escaped+:: + # Regexp to apply. Defaults to self.regexp[:ESCAPED] + # + # == Description + # + # Removes escapes from +str+. + # + def unescape(str, escaped = @regexp[:ESCAPED]) + enc = str.encoding + enc = Encoding::UTF_8 if enc == Encoding::US_ASCII + str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(enc) } + end + + @@to_s = Kernel.instance_method(:to_s) + def inspect + @@to_s.bind_call(self) + end + + private + + # Constructs the default Hash of patterns. + def initialize_pattern(opts = {}) + ret = {} + ret[:ESCAPED] = escaped = (opts.delete(:ESCAPED) || PATTERN::ESCAPED) + ret[:UNRESERVED] = unreserved = opts.delete(:UNRESERVED) || PATTERN::UNRESERVED + ret[:RESERVED] = reserved = opts.delete(:RESERVED) || PATTERN::RESERVED + ret[:DOMLABEL] = opts.delete(:DOMLABEL) || PATTERN::DOMLABEL + ret[:TOPLABEL] = opts.delete(:TOPLABEL) || PATTERN::TOPLABEL + ret[:HOSTNAME] = hostname = opts.delete(:HOSTNAME) + + # RFC 2396 (Bundler::URI Generic Syntax) + # RFC 2732 (IPv6 Literal Addresses in URL's) + # RFC 2373 (IPv6 Addressing Architecture) + + # uric = reserved | unreserved | escaped + ret[:URIC] = uric = "(?:[#{unreserved}#{reserved}]|#{escaped})" + # uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" | + # "&" | "=" | "+" | "$" | "," + ret[:URIC_NO_SLASH] = uric_no_slash = "(?:[#{unreserved};?:@&=+$,]|#{escaped})" + # query = *uric + ret[:QUERY] = query = "#{uric}*" + # fragment = *uric + ret[:FRAGMENT] = fragment = "#{uric}*" + + # hostname = *( domainlabel "." ) toplabel [ "." ] + # reg-name = *( unreserved / pct-encoded / sub-delims ) # RFC3986 + unless hostname + ret[:HOSTNAME] = hostname = "(?:[a-zA-Z0-9\\-.]|%\\h\\h)+" + end + + # RFC 2373, APPENDIX B: + # IPv6address = hexpart [ ":" IPv4address ] + # IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT + # hexpart = hexseq | hexseq "::" [ hexseq ] | "::" [ hexseq ] + # hexseq = hex4 *( ":" hex4) + # hex4 = 1*4HEXDIG + # + # XXX: This definition has a flaw. "::" + IPv4address must be + # allowed too. Here is a replacement. + # + # IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT + ret[:IPV4ADDR] = ipv4addr = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}" + # hex4 = 1*4HEXDIG + hex4 = "[#{PATTERN::HEX}]{1,4}" + # lastpart = hex4 | IPv4address + lastpart = "(?:#{hex4}|#{ipv4addr})" + # hexseq1 = *( hex4 ":" ) hex4 + hexseq1 = "(?:#{hex4}:)*#{hex4}" + # hexseq2 = *( hex4 ":" ) lastpart + hexseq2 = "(?:#{hex4}:)*#{lastpart}" + # IPv6address = hexseq2 | [ hexseq1 ] "::" [ hexseq2 ] + ret[:IPV6ADDR] = ipv6addr = "(?:#{hexseq2}|(?:#{hexseq1})?::(?:#{hexseq2})?)" + + # IPv6prefix = ( hexseq1 | [ hexseq1 ] "::" [ hexseq1 ] ) "/" 1*2DIGIT + # unused + + # ipv6reference = "[" IPv6address "]" (RFC 2732) + ret[:IPV6REF] = ipv6ref = "\\[#{ipv6addr}\\]" + + # host = hostname | IPv4address + # host = hostname | IPv4address | IPv6reference (RFC 2732) + ret[:HOST] = host = "(?:#{hostname}|#{ipv4addr}|#{ipv6ref})" + # port = *digit + ret[:PORT] = port = '\d*' + # hostport = host [ ":" port ] + ret[:HOSTPORT] = hostport = "#{host}(?::#{port})?" + + # userinfo = *( unreserved | escaped | + # ";" | ":" | "&" | "=" | "+" | "$" | "," ) + ret[:USERINFO] = userinfo = "(?:[#{unreserved};:&=+$,]|#{escaped})*" + + # pchar = unreserved | escaped | + # ":" | "@" | "&" | "=" | "+" | "$" | "," + pchar = "(?:[#{unreserved}:@&=+$,]|#{escaped})" + # param = *pchar + param = "#{pchar}*" + # segment = *pchar *( ";" param ) + segment = "#{pchar}*(?:;#{param})*" + # path_segments = segment *( "/" segment ) + ret[:PATH_SEGMENTS] = path_segments = "#{segment}(?:/#{segment})*" + + # server = [ [ userinfo "@" ] hostport ] + server = "(?:#{userinfo}@)?#{hostport}" + # reg_name = 1*( unreserved | escaped | "$" | "," | + # ";" | ":" | "@" | "&" | "=" | "+" ) + ret[:REG_NAME] = reg_name = "(?:[#{unreserved}$,;:@&=+]|#{escaped})+" + # authority = server | reg_name + authority = "(?:#{server}|#{reg_name})" + + # rel_segment = 1*( unreserved | escaped | + # ";" | "@" | "&" | "=" | "+" | "$" | "," ) + ret[:REL_SEGMENT] = rel_segment = "(?:[#{unreserved};@&=+$,]|#{escaped})+" + + # scheme = alpha *( alpha | digit | "+" | "-" | "." ) + ret[:SCHEME] = scheme = "[#{PATTERN::ALPHA}][\\-+.#{PATTERN::ALPHA}\\d]*" + + # abs_path = "/" path_segments + ret[:ABS_PATH] = abs_path = "/#{path_segments}" + # rel_path = rel_segment [ abs_path ] + ret[:REL_PATH] = rel_path = "#{rel_segment}(?:#{abs_path})?" + # net_path = "//" authority [ abs_path ] + ret[:NET_PATH] = net_path = "//#{authority}(?:#{abs_path})?" + + # hier_part = ( net_path | abs_path ) [ "?" query ] + ret[:HIER_PART] = hier_part = "(?:#{net_path}|#{abs_path})(?:\\?(?:#{query}))?" + # opaque_part = uric_no_slash *uric + ret[:OPAQUE_PART] = opaque_part = "#{uric_no_slash}#{uric}*" + + # absoluteURI = scheme ":" ( hier_part | opaque_part ) + ret[:ABS_URI] = abs_uri = "#{scheme}:(?:#{hier_part}|#{opaque_part})" + # relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ] + ret[:REL_URI] = rel_uri = "(?:#{net_path}|#{abs_path}|#{rel_path})(?:\\?#{query})?" + + # Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] + ret[:URI_REF] = "(?:#{abs_uri}|#{rel_uri})?(?:##{fragment})?" + + ret[:X_ABS_URI] = " + (#{scheme}): (?# 1: scheme) + (?: + (#{opaque_part}) (?# 2: opaque) + | + (?:(?: + //(?: + (?:(?:(#{userinfo})@)? (?# 3: userinfo) + (?:(#{host})(?::(\\d*))?))? (?# 4: host, 5: port) + | + (#{reg_name}) (?# 6: registry) + ) + | + (?!//)) (?# XXX: '//' is the mark for hostport) + (#{abs_path})? (?# 7: path) + )(?:\\?(#{query}))? (?# 8: query) + ) + (?:\\#(#{fragment}))? (?# 9: fragment) + " + + ret[:X_REL_URI] = " + (?: + (?: + // + (?: + (?:(#{userinfo})@)? (?# 1: userinfo) + (#{host})?(?::(\\d*))? (?# 2: host, 3: port) + | + (#{reg_name}) (?# 4: registry) + ) + ) + | + (#{rel_segment}) (?# 5: rel_segment) + )? + (#{abs_path})? (?# 6: abs_path) + (?:\\?(#{query}))? (?# 7: query) + (?:\\#(#{fragment}))? (?# 8: fragment) + " + + ret + end + + # Constructs the default Hash of Regexp's. + def initialize_regexp(pattern) + ret = {} + + # for Bundler::URI::split + ret[:ABS_URI] = Regexp.new('\A\s*' + pattern[:X_ABS_URI] + '\s*\z', Regexp::EXTENDED) + ret[:REL_URI] = Regexp.new('\A\s*' + pattern[:X_REL_URI] + '\s*\z', Regexp::EXTENDED) + + # for Bundler::URI::extract + ret[:URI_REF] = Regexp.new(pattern[:URI_REF]) + ret[:ABS_URI_REF] = Regexp.new(pattern[:X_ABS_URI], Regexp::EXTENDED) + ret[:REL_URI_REF] = Regexp.new(pattern[:X_REL_URI], Regexp::EXTENDED) + + # for Bundler::URI::escape/unescape + ret[:ESCAPED] = Regexp.new(pattern[:ESCAPED]) + ret[:UNSAFE] = Regexp.new("[^#{pattern[:UNRESERVED]}#{pattern[:RESERVED]}]") + + # for Generic#initialize + ret[:SCHEME] = Regexp.new("\\A#{pattern[:SCHEME]}\\z") + ret[:USERINFO] = Regexp.new("\\A#{pattern[:USERINFO]}\\z") + ret[:HOST] = Regexp.new("\\A#{pattern[:HOST]}\\z") + ret[:PORT] = Regexp.new("\\A#{pattern[:PORT]}\\z") + ret[:OPAQUE] = Regexp.new("\\A#{pattern[:OPAQUE_PART]}\\z") + ret[:REGISTRY] = Regexp.new("\\A#{pattern[:REG_NAME]}\\z") + ret[:ABS_PATH] = Regexp.new("\\A#{pattern[:ABS_PATH]}\\z") + ret[:REL_PATH] = Regexp.new("\\A#{pattern[:REL_PATH]}\\z") + ret[:QUERY] = Regexp.new("\\A#{pattern[:QUERY]}\\z") + ret[:FRAGMENT] = Regexp.new("\\A#{pattern[:FRAGMENT]}\\z") + + ret + end + + def convert_to_uri(uri) + if uri.is_a?(Bundler::URI::Generic) + uri + elsif uri = String.try_convert(uri) + parse(uri) + else + raise ArgumentError, + "bad argument (expected Bundler::URI object or Bundler::URI string)" + end + end + + end # class Parser +end # module Bundler::URI diff --git a/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb b/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb new file mode 100644 index 00000000000..07ef4391c02 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb @@ -0,0 +1,125 @@ +# frozen_string_literal: false +module Bundler::URI + class RFC3986_Parser # :nodoc: + # Bundler::URI defined in RFC3986 + # this regexp is modified not to host is not empty string + RFC3986_URI = /\A(?(?[A-Za-z][+\-.0-9A-Za-z]*):(?\/\/(?(?:(?(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?(?\[(?:(?(?:\h{1,4}:){6}(?\h{1,4}:\h{1,4}|(?(?[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g\.\g\.\g))|::(?:\h{1,4}:){5}\g|\h{1,4}?::(?:\h{1,4}:){4}\g|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g|(?(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?\d*))?)(?(?:\/(?(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?\/(?:(?(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g)*)?)|(?\g(?:\/\g)*)|(?))(?:\?(?[^#]*))?(?:\#(?(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/ + RFC3986_relative_ref = /\A(?(?\/\/(?(?:(?(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?(?\[(?(?:\h{1,4}:){6}(?\h{1,4}:\h{1,4}|(?(?[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g\.\g\.\g))|::(?:\h{1,4}:){5}\g|\h{1,4}?::(?:\h{1,4}:){4}\g|(?:(?:\h{1,4}:){,1}\h{1,4})?::(?:\h{1,4}:){3}\g|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?v\h+\.[!$&-.0-;=A-Z_a-z~]+)\])|\g|(?(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?\d*))?)(?(?:\/(?(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?\/(?:(?(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g)*)?)|(?(?(?:%\h\h|[!$&-.0-9;=@-Z_a-z~])+)(?:\/\g)*)|(?))(?:\?(?[^#]*))?(?:\#(?(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/ + attr_reader :regexp + + def initialize + @regexp = default_regexp.each_value(&:freeze).freeze + end + + def split(uri) #:nodoc: + begin + uri = uri.to_str + rescue NoMethodError + raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri.inspect}" + end + uri.ascii_only? or + raise InvalidURIError, "Bundler::URI must be ascii only #{uri.dump}" + if m = RFC3986_URI.match(uri) + query = m["query".freeze] + scheme = m["scheme".freeze] + opaque = m["path-rootless".freeze] + if opaque + opaque << "?#{query}" if query + [ scheme, + nil, # userinfo + nil, # host + nil, # port + nil, # registry + nil, # path + opaque, + nil, # query + m["fragment".freeze] + ] + else # normal + [ scheme, + m["userinfo".freeze], + m["host".freeze], + m["port".freeze], + nil, # registry + (m["path-abempty".freeze] || + m["path-absolute".freeze] || + m["path-empty".freeze]), + nil, # opaque + query, + m["fragment".freeze] + ] + end + elsif m = RFC3986_relative_ref.match(uri) + [ nil, # scheme + m["userinfo".freeze], + m["host".freeze], + m["port".freeze], + nil, # registry, + (m["path-abempty".freeze] || + m["path-absolute".freeze] || + m["path-noscheme".freeze] || + m["path-empty".freeze]), + nil, # opaque + m["query".freeze], + m["fragment".freeze] + ] + else + raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri.inspect}" + end + end + + def parse(uri) # :nodoc: + scheme, userinfo, host, port, + registry, path, opaque, query, fragment = self.split(uri) + scheme_list = Bundler::URI.scheme_list + if scheme && scheme_list.include?(uc = scheme.upcase) + scheme_list[uc].new(scheme, userinfo, host, port, + registry, path, opaque, query, + fragment, self) + else + Generic.new(scheme, userinfo, host, port, + registry, path, opaque, query, + fragment, self) + end + end + + + def join(*uris) # :nodoc: + uris[0] = convert_to_uri(uris[0]) + uris.inject :merge + end + + @@to_s = Kernel.instance_method(:to_s) + def inspect + @@to_s.bind_call(self) + end + + private + + def default_regexp # :nodoc: + { + SCHEME: /\A[A-Za-z][A-Za-z0-9+\-.]*\z/, + USERINFO: /\A(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*\z/, + HOST: /\A(?:(?\[(?:(?(?:\h{1,4}:){6}(?\h{1,4}:\h{1,4}|(?(?[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g\.\g\.\g))|::(?:\h{1,4}:){5}\g|\h{,4}::(?:\h{1,4}:){4}\g|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g|(?(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*))\z/, + ABS_PATH: /\A\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*(?:\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*)*\z/, + REL_PATH: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+(?:\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*)*\z/, + QUERY: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*\z/, + FRAGMENT: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*\z/, + OPAQUE: /\A(?:[^\/].*)?\z/, + PORT: /\A[\x09\x0a\x0c\x0d ]*\d*[\x09\x0a\x0c\x0d ]*\z/, + } + end + + def convert_to_uri(uri) + if uri.is_a?(Bundler::URI::Generic) + uri + elsif uri = String.try_convert(uri) + parse(uri) + else + raise ArgumentError, + "bad argument (expected Bundler::URI object or Bundler::URI string)" + end + end + + end # class Parser +end # module Bundler::URI diff --git a/lib/bundler/vendor/uri/lib/uri/version.rb b/lib/bundler/vendor/uri/lib/uri/version.rb new file mode 100644 index 00000000000..56177ef1949 --- /dev/null +++ b/lib/bundler/vendor/uri/lib/uri/version.rb @@ -0,0 +1,6 @@ +module Bundler::URI + # :stopdoc: + VERSION_CODE = '001000'.freeze + VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze + # :startdoc: +end diff --git a/lib/bundler/vendored_uri.rb b/lib/bundler/vendored_uri.rb new file mode 100644 index 00000000000..905e8158e8e --- /dev/null +++ b/lib/bundler/vendored_uri.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +module Bundler; end +require_relative "vendor/uri/lib/uri" diff --git a/spec/bundler/fetcher/base_spec.rb b/spec/bundler/fetcher/base_spec.rb index df1245d44d0..02506591f37 100644 --- a/spec/bundler/fetcher/base_spec.rb +++ b/spec/bundler/fetcher/base_spec.rb @@ -36,7 +36,7 @@ class TestClass < described_class; end end describe "#fetch_uri" do - let(:remote_uri_obj) { URI("http://rubygems.org") } + let(:remote_uri_obj) { Bundler::URI("http://rubygems.org") } before { allow(subject).to receive(:remote_uri).and_return(remote_uri_obj) } @@ -49,10 +49,10 @@ class TestClass < described_class; end end context "when the remote uri's host is not rubygems.org" do - let(:remote_uri_obj) { URI("http://otherhost.org") } + let(:remote_uri_obj) { Bundler::URI("http://otherhost.org") } it "should return the remote uri" do - expect(subject.fetch_uri).to eq(URI("http://otherhost.org")) + expect(subject.fetch_uri).to eq(Bundler::URI("http://otherhost.org")) end end diff --git a/spec/bundler/fetcher/compact_index_spec.rb b/spec/bundler/fetcher/compact_index_spec.rb index f5ae6f4d776..c9419d3eb16 100644 --- a/spec/bundler/fetcher/compact_index_spec.rb +++ b/spec/bundler/fetcher/compact_index_spec.rb @@ -2,7 +2,7 @@ RSpec.describe Bundler::Fetcher::CompactIndex do let(:downloader) { double(:downloader) } - let(:display_uri) { URI("http://sampleuri.com") } + let(:display_uri) { Bundler::URI("http://sampleuri.com") } let(:remote) { double(:remote, :cache_slug => "lsjdf", :uri => display_uri) } let(:compact_index) { described_class.new(downloader, remote, display_uri) } diff --git a/spec/bundler/fetcher/dependency_spec.rb b/spec/bundler/fetcher/dependency_spec.rb index 081fdff34de..53249116cdb 100644 --- a/spec/bundler/fetcher/dependency_spec.rb +++ b/spec/bundler/fetcher/dependency_spec.rb @@ -2,7 +2,7 @@ RSpec.describe Bundler::Fetcher::Dependency do let(:downloader) { double(:downloader) } - let(:remote) { double(:remote, :uri => URI("http://localhost:5000")) } + let(:remote) { double(:remote, :uri => Bundler::URI("http://localhost:5000")) } let(:display_uri) { "http://sample_uri.com" } subject { described_class.new(downloader, remote, display_uri) } @@ -258,7 +258,7 @@ end describe "#dependency_api_uri" do - let(:uri) { URI("http://gem-api.com") } + let(:uri) { Bundler::URI("http://gem-api.com") } context "with gem names" do let(:gem_names) { %w[foo bar bundler rubocop] } diff --git a/spec/bundler/fetcher/downloader_spec.rb b/spec/bundler/fetcher/downloader_spec.rb index f985b889820..ba8451d9fa6 100644 --- a/spec/bundler/fetcher/downloader_spec.rb +++ b/spec/bundler/fetcher/downloader_spec.rb @@ -3,7 +3,7 @@ RSpec.describe Bundler::Fetcher::Downloader do let(:connection) { double(:connection) } let(:redirect_limit) { 5 } - let(:uri) { URI("http://www.uri-to-fetch.com/api/v2/endpoint") } + let(:uri) { Bundler::URI("http://www.uri-to-fetch.com/api/v2/endpoint") } let(:options) { double(:options) } subject { described_class.new(connection, redirect_limit) } @@ -41,19 +41,19 @@ before { http_response["location"] = "http://www.redirect-uri.com/api/v2/endpoint" } it "should try to fetch the redirect uri and iterate the # requests counter" do - expect(subject).to receive(:fetch).with(URI("http://www.uri-to-fetch.com/api/v2/endpoint"), options, 0).and_call_original - expect(subject).to receive(:fetch).with(URI("http://www.redirect-uri.com/api/v2/endpoint"), options, 1) + expect(subject).to receive(:fetch).with(Bundler::URI("http://www.uri-to-fetch.com/api/v2/endpoint"), options, 0).and_call_original + expect(subject).to receive(:fetch).with(Bundler::URI("http://www.redirect-uri.com/api/v2/endpoint"), options, 1) subject.fetch(uri, options, counter) end context "when the redirect uri and original uri are the same" do - let(:uri) { URI("ssh://username:password@www.uri-to-fetch.com/api/v2/endpoint") } + let(:uri) { Bundler::URI("ssh://username:password@www.uri-to-fetch.com/api/v2/endpoint") } before { http_response["location"] = "ssh://www.uri-to-fetch.com/api/v1/endpoint" } it "should set the same user and password for the redirect uri" do - expect(subject).to receive(:fetch).with(URI("ssh://username:password@www.uri-to-fetch.com/api/v2/endpoint"), options, 0).and_call_original - expect(subject).to receive(:fetch).with(URI("ssh://username:password@www.uri-to-fetch.com/api/v1/endpoint"), options, 1) + expect(subject).to receive(:fetch).with(Bundler::URI("ssh://username:password@www.uri-to-fetch.com/api/v2/endpoint"), options, 0).and_call_original + expect(subject).to receive(:fetch).with(Bundler::URI("ssh://username:password@www.uri-to-fetch.com/api/v1/endpoint"), options, 1) subject.fetch(uri, options, counter) end end @@ -84,7 +84,7 @@ end context "when the there are credentials provided in the request" do - let(:uri) { URI("http://user:password@www.uri-to-fetch.com") } + let(:uri) { Bundler::URI("http://user:password@www.uri-to-fetch.com") } it "should raise a Bundler::Fetcher::BadAuthenticationError that doesn't contain the password" do expect { subject.fetch(uri, options, counter) }. @@ -102,7 +102,7 @@ end context "when the there are credentials provided in the request" do - let(:uri) { URI("http://username:password@www.uri-to-fetch.com/api/v2/endpoint") } + let(:uri) { Bundler::URI("http://username:password@www.uri-to-fetch.com/api/v2/endpoint") } it "should raise a Bundler::Fetcher::FallbackError that doesn't contain the password" do expect { subject.fetch(uri, options, counter) }. @@ -137,7 +137,7 @@ context "when there is a user provided in the request" do context "and there is also a password provided" do context "that contains cgi escaped characters" do - let(:uri) { URI("http://username:password%24@www.uri-to-fetch.com/api/v2/endpoint") } + let(:uri) { Bundler::URI("http://username:password%24@www.uri-to-fetch.com/api/v2/endpoint") } it "should request basic authentication with the username and password" do expect(net_http_get).to receive(:basic_auth).with("username", "password$") @@ -146,7 +146,7 @@ end context "that is all unescaped characters" do - let(:uri) { URI("http://username:password@www.uri-to-fetch.com/api/v2/endpoint") } + let(:uri) { Bundler::URI("http://username:password@www.uri-to-fetch.com/api/v2/endpoint") } it "should request basic authentication with the username and proper cgi compliant password" do expect(net_http_get).to receive(:basic_auth).with("username", "password") subject.request(uri, options) @@ -155,7 +155,7 @@ end context "and there is no password provided" do - let(:uri) { URI("http://username@www.uri-to-fetch.com/api/v2/endpoint") } + let(:uri) { Bundler::URI("http://username@www.uri-to-fetch.com/api/v2/endpoint") } it "should request basic authentication with just the user" do expect(net_http_get).to receive(:basic_auth).with("username", nil) @@ -164,7 +164,7 @@ end context "that contains cgi escaped characters" do - let(:uri) { URI("http://username%24@www.uri-to-fetch.com/api/v2/endpoint") } + let(:uri) { Bundler::URI("http://username%24@www.uri-to-fetch.com/api/v2/endpoint") } it "should request basic authentication with the proper cgi compliant password user" do expect(net_http_get).to receive(:basic_auth).with("username$", nil) @@ -244,7 +244,7 @@ end context "when the there are credentials provided in the request" do - let(:uri) { URI("http://username:password@www.uri-to-fetch.com/api/v2/endpoint") } + let(:uri) { Bundler::URI("http://username:password@www.uri-to-fetch.com/api/v2/endpoint") } before do allow(net_http_get).to receive(:basic_auth).with("username", "password") end diff --git a/spec/bundler/fetcher/index_spec.rb b/spec/bundler/fetcher/index_spec.rb index d5ededae3ea..5ecd7d9e059 100644 --- a/spec/bundler/fetcher/index_spec.rb +++ b/spec/bundler/fetcher/index_spec.rb @@ -18,7 +18,7 @@ context "error handling" do shared_examples_for "the error is properly handled" do - let(:remote_uri) { URI("http://remote-uri.org") } + let(:remote_uri) { Bundler::URI("http://remote-uri.org") } before do allow(subject).to receive(:remote_uri).and_return(remote_uri) end diff --git a/spec/bundler/fetcher_spec.rb b/spec/bundler/fetcher_spec.rb index 9176eb32f0d..539179db43a 100644 --- a/spec/bundler/fetcher_spec.rb +++ b/spec/bundler/fetcher_spec.rb @@ -3,7 +3,7 @@ require "bundler/fetcher" RSpec.describe Bundler::Fetcher do - let(:uri) { URI("https://example.com") } + let(:uri) { Bundler::URI("https://example.com") } let(:remote) { double("remote", :uri => uri, :original_uri => nil) } subject(:fetcher) { Bundler::Fetcher.new(remote) } @@ -45,7 +45,7 @@ end context "when a rubygems source mirror is set" do - let(:orig_uri) { URI("http://zombo.com") } + let(:orig_uri) { Bundler::URI("http://zombo.com") } let(:remote_with_mirror) do double("remote", :uri => uri, :original_uri => orig_uri, :anonymized_uri => uri) end diff --git a/spec/bundler/mirror_spec.rb b/spec/bundler/mirror_spec.rb index 76b697c4d29..4a8a0c7c484 100644 --- a/spec/bundler/mirror_spec.rb +++ b/spec/bundler/mirror_spec.rb @@ -36,12 +36,12 @@ it "takes a string for the uri but returns an uri object" do mirror.uri = "http://localhost:9292" - expect(mirror.uri).to eq(URI("http://localhost:9292")) + expect(mirror.uri).to eq(Bundler::URI("http://localhost:9292")) end it "takes an uri object for the uri" do - mirror.uri = URI("http://localhost:9293") - expect(mirror.uri).to eq(URI("http://localhost:9293")) + mirror.uri = Bundler::URI("http://localhost:9293") + expect(mirror.uri).to eq(Bundler::URI("http://localhost:9293")) end context "without a uri" do @@ -145,7 +145,7 @@ end RSpec.describe Bundler::Settings::Mirrors do - let(:localhost_uri) { URI("http://localhost:9292") } + let(:localhost_uri) { Bundler::URI("http://localhost:9292") } context "with a just created mirror" do let(:mirrors) do @@ -260,7 +260,7 @@ before { mirrors.parse("mirror.all.fallback_timeout", "true") } it "returns the source uri, not localhost" do - expect(mirrors.for("http://whatever.com").uri).to eq(URI("http://whatever.com/")) + expect(mirrors.for("http://whatever.com").uri).to eq(Bundler::URI("http://whatever.com/")) end end end @@ -270,7 +270,7 @@ context "without a fallback timeout" do it "returns the uri that is not mirrored" do - expect(mirrors.for("http://whatever.com").uri).to eq(URI("http://whatever.com/")) + expect(mirrors.for("http://whatever.com").uri).to eq(Bundler::URI("http://whatever.com/")) end it "returns localhost for rubygems.org" do @@ -282,11 +282,11 @@ before { mirrors.parse("mirror.http://rubygems.org/.fallback_timeout", "true") } it "returns the uri that is not mirrored" do - expect(mirrors.for("http://whatever.com").uri).to eq(URI("http://whatever.com/")) + expect(mirrors.for("http://whatever.com").uri).to eq(Bundler::URI("http://whatever.com/")) end it "returns rubygems.org for rubygems.org" do - expect(mirrors.for("http://rubygems.org/").uri).to eq(URI("http://rubygems.org/")) + expect(mirrors.for("http://rubygems.org/").uri).to eq(Bundler::URI("http://rubygems.org/")) end end end diff --git a/spec/bundler/rubygems_integration_spec.rb b/spec/bundler/rubygems_integration_spec.rb index ce2b1000884..11fa2f4e0d7 100644 --- a/spec/bundler/rubygems_integration_spec.rb +++ b/spec/bundler/rubygems_integration_spec.rb @@ -44,7 +44,7 @@ describe "#download_gem" do let(:bundler_retry) { double(Bundler::Retry) } let(:retry) { double("Bundler::Retry") } - let(:uri) { URI.parse("https://foo.bar") } + let(:uri) { Bundler::URI.parse("https://foo.bar") } let(:path) { Gem.path.first } let(:spec) do spec = Bundler::RemoteSpecification.new("Foo", Gem::Version.new("2.5.2"), @@ -73,7 +73,7 @@ let(:prerelease_specs_response) { Marshal.dump(["prerelease_specs"]) } context "when a rubygems source mirror is set" do - let(:orig_uri) { URI("http://zombo.com") } + let(:orig_uri) { Bundler::URI("http://zombo.com") } let(:remote_with_mirror) { double("remote", :uri => uri, :original_uri => orig_uri) } it "sets the 'X-Gemfile-Source' header containing the original source" do diff --git a/spec/bundler/settings_spec.rb b/spec/bundler/settings_spec.rb index 2a285fdcf37..b83d768477a 100644 --- a/spec/bundler/settings_spec.rb +++ b/spec/bundler/settings_spec.rb @@ -180,7 +180,7 @@ end describe "#mirror_for" do - let(:uri) { URI("https://rubygems.org/") } + let(:uri) { Bundler::URI("https://rubygems.org/") } context "with no configured mirror" do it "returns the original URI" do @@ -193,7 +193,7 @@ end context "with a configured mirror" do - let(:mirror_uri) { URI("https://rubygems-mirror.org/") } + let(:mirror_uri) { Bundler::URI("https://rubygems-mirror.org/") } before { settings.set_local "mirror.https://rubygems.org/", mirror_uri.to_s } @@ -214,7 +214,7 @@ end context "with a file URI" do - let(:mirror_uri) { URI("file:/foo/BAR/baz/qUx/") } + let(:mirror_uri) { Bundler::URI("file:/foo/BAR/baz/qUx/") } it "returns the mirror URI" do expect(settings.mirror_for(uri)).to eq(mirror_uri) @@ -232,7 +232,7 @@ end describe "#credentials_for" do - let(:uri) { URI("https://gemserver.example.org/") } + let(:uri) { Bundler::URI("https://gemserver.example.org/") } let(:credentials) { "username:password" } context "with no configured credentials" do @@ -292,7 +292,7 @@ it "reads older keys without trailing slashes" do settings.set_local "mirror.https://rubygems.org", "http://rubygems-mirror.org" expect(settings.mirror_for("https://rubygems.org/")).to eq( - URI("http://rubygems-mirror.org/") + Bundler::URI("http://rubygems-mirror.org/") ) end diff --git a/spec/bundler/source/rubygems/remote_spec.rb b/spec/bundler/source/rubygems/remote_spec.rb index 52fb4e7f1c1..07ce4f968e9 100644 --- a/spec/bundler/source/rubygems/remote_spec.rb +++ b/spec/bundler/source/rubygems/remote_spec.rb @@ -11,8 +11,8 @@ def remote(uri) allow(Digest(:MD5)).to receive(:hexdigest).with(duck_type(:to_s)) {|string| "MD5HEX(#{string})" } end - let(:uri_no_auth) { URI("https://gems.example.com") } - let(:uri_with_auth) { URI("https://#{credentials}@gems.example.com") } + let(:uri_no_auth) { Bundler::URI("https://gems.example.com") } + let(:uri_with_auth) { Bundler::URI("https://#{credentials}@gems.example.com") } let(:credentials) { "username:password" } context "when the original URI has no credentials" do @@ -89,11 +89,11 @@ def remote(uri) end context "when the original URI has only a username" do - let(:uri) { URI("https://SeCrEt-ToKeN@gem.fury.io/me/") } + let(:uri) { Bundler::URI("https://SeCrEt-ToKeN@gem.fury.io/me/") } describe "#anonymized_uri" do it "returns the URI without username and password" do - expect(remote(uri).anonymized_uri).to eq(URI("https://gem.fury.io/me/")) + expect(remote(uri).anonymized_uri).to eq(Bundler::URI("https://gem.fury.io/me/")) end end @@ -105,9 +105,9 @@ def remote(uri) end context "when a mirror with inline credentials is configured for the URI" do - let(:uri) { URI("https://rubygems.org/") } - let(:mirror_uri_with_auth) { URI("https://username:password@rubygems-mirror.org/") } - let(:mirror_uri_no_auth) { URI("https://rubygems-mirror.org/") } + let(:uri) { Bundler::URI("https://rubygems.org/") } + let(:mirror_uri_with_auth) { Bundler::URI("https://username:password@rubygems-mirror.org/") } + let(:mirror_uri_no_auth) { Bundler::URI("https://rubygems-mirror.org/") } before { Bundler.settings.temporary("mirror.https://rubygems.org/" => mirror_uri_with_auth.to_s) } @@ -131,9 +131,9 @@ def remote(uri) end context "when a mirror with configured credentials is configured for the URI" do - let(:uri) { URI("https://rubygems.org/") } - let(:mirror_uri_with_auth) { URI("https://#{credentials}@rubygems-mirror.org/") } - let(:mirror_uri_no_auth) { URI("https://rubygems-mirror.org/") } + let(:uri) { Bundler::URI("https://rubygems.org/") } + let(:mirror_uri_with_auth) { Bundler::URI("https://#{credentials}@rubygems-mirror.org/") } + let(:mirror_uri_no_auth) { Bundler::URI("https://rubygems-mirror.org/") } before do Bundler.settings.temporary("mirror.https://rubygems.org/" => mirror_uri_no_auth.to_s) diff --git a/spec/bundler/source_list_spec.rb b/spec/bundler/source_list_spec.rb index a78b80ec3ba..93159998c6f 100644 --- a/spec/bundler/source_list_spec.rb +++ b/spec/bundler/source_list_spec.rb @@ -125,8 +125,8 @@ it "adds the provided remote to the beginning of the aggregate source" do source_list.add_rubygems_remote("https://othersource.org") expect(returned_source.remotes).to eq [ - URI("https://othersource.org/"), - URI("https://rubygems.org/"), + Bundler::URI("https://othersource.org/"), + Bundler::URI("https://rubygems.org/"), ] end end diff --git a/spec/bundler/uri_credentials_filter_spec.rb b/spec/bundler/uri_credentials_filter_spec.rb index fe52d16306c..466c1b8594b 100644 --- a/spec/bundler/uri_credentials_filter_spec.rb +++ b/spec/bundler/uri_credentials_filter_spec.rb @@ -16,7 +16,7 @@ let(:credentials) { "oauth_token:x-oauth-basic@" } it "returns the uri without the oauth token" do - expect(subject.credential_filtered_uri(uri).to_s).to eq(URI("https://x-oauth-basic@github.com/company/private-repo").to_s) + expect(subject.credential_filtered_uri(uri).to_s).to eq(Bundler::URI("https://x-oauth-basic@github.com/company/private-repo").to_s) end it_behaves_like "original type of uri is maintained" @@ -26,7 +26,7 @@ let(:credentials) { "oauth_token:x@" } it "returns the uri without the oauth token" do - expect(subject.credential_filtered_uri(uri).to_s).to eq(URI("https://x@github.com/company/private-repo").to_s) + expect(subject.credential_filtered_uri(uri).to_s).to eq(Bundler::URI("https://x@github.com/company/private-repo").to_s) end it_behaves_like "original type of uri is maintained" @@ -37,7 +37,7 @@ let(:credentials) { "username1:hunter3@" } it "returns the uri without the password" do - expect(subject.credential_filtered_uri(uri).to_s).to eq(URI("https://username1@github.com/company/private-repo").to_s) + expect(subject.credential_filtered_uri(uri).to_s).to eq(Bundler::URI("https://username1@github.com/company/private-repo").to_s) end it_behaves_like "original type of uri is maintained" @@ -55,7 +55,7 @@ end context "uri is a uri object" do - let(:uri) { URI("https://#{credentials}github.com/company/private-repo") } + let(:uri) { Bundler::URI("https://#{credentials}github.com/company/private-repo") } it_behaves_like "sensitive credentials in uri are filtered out" end @@ -90,7 +90,7 @@ describe "#credential_filtered_string" do let(:str_to_filter) { "This is a git message containing a uri #{uri}!" } let(:credentials) { "" } - let(:uri) { URI("https://#{credentials}github.com/company/private-repo") } + let(:uri) { Bundler::URI("https://#{credentials}github.com/company/private-repo") } context "with a uri that contains credentials" do let(:credentials) { "oauth_token:x-oauth-basic@" } diff --git a/spec/bundler/vendored_persistent_spec.rb b/spec/bundler/vendored_persistent_spec.rb index b4d68c2ea0e..3ed899dbcfd 100644 --- a/spec/bundler/vendored_persistent_spec.rb +++ b/spec/bundler/vendored_persistent_spec.rb @@ -23,14 +23,14 @@ shared_examples_for "does not warn" do it "does not warn" do allow(Bundler.ui).to receive(:warn).never - subject.warn_old_tls_version_rubygems_connection(URI(uri), connection) + subject.warn_old_tls_version_rubygems_connection(Bundler::URI(uri), connection) end end shared_examples_for "does warn" do |*expected| it "warns" do expect(Bundler.ui).to receive(:warn).with(*expected) - subject.warn_old_tls_version_rubygems_connection(URI(uri), connection) + subject.warn_old_tls_version_rubygems_connection(Bundler::URI(uri), connection) end end diff --git a/spec/realworld/edgecases_spec.rb b/spec/realworld/edgecases_spec.rb index 53d9f9a0261..a91e6a359e4 100644 --- a/spec/realworld/edgecases_spec.rb +++ b/spec/realworld/edgecases_spec.rb @@ -8,7 +8,7 @@ def rubygems_version(name, requirement) require "#{lib_dir}/bundler/source/rubygems/remote" require "#{lib_dir}/bundler/fetcher" rubygem = Bundler.ui.silence do - source = Bundler::Source::Rubygems::Remote.new(URI("https://rubygems.org")) + source = Bundler::Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org")) fetcher = Bundler::Fetcher.new(source) index = fetcher.specs([#{name.dump}], nil) index.search(Gem::Dependency.new(#{name.dump}, #{requirement.dump})).last diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ba21d22fbda..0a49b46aaaf 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -7,7 +7,7 @@ require "bundler/psyched_yaml" require "bundler/vendored_fileutils" -require "uri" +require "bundler/vendored_uri" require "digest" if File.expand_path(__FILE__) =~ %r{([^\w/\.:\-])} diff --git a/spec/support/path.rb b/spec/support/path.rb index 1c142e2643e..eea3161b15a 100644 --- a/spec/support/path.rb +++ b/spec/support/path.rb @@ -100,8 +100,6 @@ def file_uri_for(path) protocol = "file://" root = Gem.win_platform? ? "/" : "" - return protocol + "localhost" + root + path.to_s if RUBY_VERSION < "2.5" - protocol + root + path.to_s end From 02a4f65a2582f91951218ca904d3b02eb0c2761a Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 13 Dec 2019 15:27:37 +0000 Subject: [PATCH 23/31] Merge #7475 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7475: Delay deprecation of `bundle config` and `bundle update` without args r=hsbt a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem I was thinking about the upcoming release of bundler 2.1.0, and I'm not convinced about these two deprecations. I'm not necessarily against them, but these command are very common IMO, and we'll be making them harder to run. Again, maybe for good reasons, but still. That will be combined with the fact that: * In this same release, we'll be enabling all of the other deprecations. * Ruby 2.7 will include bundler 2.1 and ruby 2.7 will also come with a lot of warnings about keyword arguments. ### What was your diagnosis of the problem? My diagnosis was that I think it's better to postpone these two deprecations for now. Get the other deprecations going and get user feedback about them, and then worry about these two later. ### What is your fix for the problem, implemented in this PR? My fix is to delay both deprecations. ### Why did you choose this fix out of the possible options? I chose this fix because I don't want to be too annoying to users at this moment. Co-authored-by: David Rodríguez (cherry picked from commit 69a88cf6e8bb2aeebd2b378fc9719eec2f3a7fef) --- lib/bundler/cli/config.rb | 2 +- lib/bundler/cli/update.rb | 2 +- lib/bundler/feature_flag.rb | 2 +- spec/other/major_deprecation_spec.rb | 18 +++++++++--------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/bundler/cli/config.rb b/lib/bundler/cli/config.rb index 78e035aa023..8d2aba09162 100644 --- a/lib/bundler/cli/config.rb +++ b/lib/bundler/cli/config.rb @@ -25,7 +25,7 @@ def base(name = nil, *value) ["config", "get", ARGV[1]] end - SharedHelpers.major_deprecation 2, + SharedHelpers.major_deprecation 3, "Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle #{new_args.join(" ")}` instead." Base.new(options, name, value, self).run diff --git a/lib/bundler/cli/update.rb b/lib/bundler/cli/update.rb index afd386bd546..529dd9c94d1 100644 --- a/lib/bundler/cli/update.rb +++ b/lib/bundler/cli/update.rb @@ -22,7 +22,7 @@ def run if Bundler.feature_flag.update_requires_all_flag? raise InvalidOption, "To update everything, pass the `--all` flag." end - SharedHelpers.major_deprecation 2, "Pass --all to `bundle update` to update everything" + SharedHelpers.major_deprecation 3, "Pass --all to `bundle update` to update everything" elsif !full_update && options[:all] raise InvalidOption, "Cannot specify --all along with specific options." end diff --git a/lib/bundler/feature_flag.rb b/lib/bundler/feature_flag.rb index 5e1932e6260..01739ec4aaa 100644 --- a/lib/bundler/feature_flag.rb +++ b/lib/bundler/feature_flag.rb @@ -46,7 +46,7 @@ def self.settings_method(name, key, &default) settings_flag(:specific_platform) { bundler_3_mode? } settings_flag(:suppress_install_using_messages) { bundler_3_mode? } settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? } - settings_flag(:update_requires_all_flag) { bundler_3_mode? } + settings_flag(:update_requires_all_flag) { bundler_4_mode? } settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_3_mode? } settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install } diff --git a/spec/other/major_deprecation_spec.rb b/spec/other/major_deprecation_spec.rb index f743bccb92f..df2fdd263a9 100644 --- a/spec/other/major_deprecation_spec.rb +++ b/spec/other/major_deprecation_spec.rb @@ -127,7 +127,7 @@ bundle! "config" end - it "warns", :bundler => "2" do + it "warns", :bundler => "3" do expect(deprecations).to include("Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle config list` instead.") end @@ -139,7 +139,7 @@ bundle! "config waka" end - it "warns", :bundler => "2" do + it "warns", :bundler => "3" do expect(deprecations).to include("Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle config get waka` instead.") end @@ -151,7 +151,7 @@ bundle! "config waka wakapun" end - it "warns", :bundler => "2" do + it "warns", :bundler => "3" do expect(deprecations).to include("Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle config set waka wakapun` instead.") end @@ -163,7 +163,7 @@ bundle! "config --local waka wakapun" end - it "warns", :bundler => "2" do + it "warns", :bundler => "3" do expect(deprecations).to include("Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle config set --local waka wakapun` instead.") end @@ -175,7 +175,7 @@ bundle! "config --global waka wakapun" end - it "warns", :bundler => "2" do + it "warns", :bundler => "3" do expect(deprecations).to include("Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle config set --global waka wakapun` instead.") end @@ -187,7 +187,7 @@ bundle! "config --delete waka" end - it "warns", :bundler => "2" do + it "warns", :bundler => "3" do expect(deprecations).to include("Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle config unset waka` instead.") end @@ -199,7 +199,7 @@ bundle! "config --delete --local waka" end - it "warns", :bundler => "2" do + it "warns", :bundler => "3" do expect(deprecations).to include("Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle config unset --local waka` instead.") end @@ -211,7 +211,7 @@ bundle! "config --delete --global waka" end - it "warns", :bundler => "2" do + it "warns", :bundler => "3" do expect(deprecations).to include("Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle config unset --global waka` instead.") end @@ -227,7 +227,7 @@ G end - it "warns when no options are given", :bundler => "2" do + it "warns when no options are given", :bundler => "3" do bundle! "update" expect(deprecations).to include("Pass --all to `bundle update` to update everything") end From bd0111aae3a516a34d33a642c2e8424bc50f1604 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 13 Dec 2019 16:11:58 +0000 Subject: [PATCH 24/31] Merge #7477 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7477: Skip `did_you_mean` and `delegate` failures on MRI 2.7 r=deivid-rodriguez a=deivid-rodriguez # What was the end-user problem that led to this PR? `ruby-head` build [is broken again](https://travis-ci.org/bundler/bundler/jobs/624581155). ### What was your diagnosis of the problem? Ruby 2.7 will turn `did_you_mean` into a default gem. That means that bundler tests that make sure that an arbritary version of default gems can be specified in the `Gemfile` will now run against `did_you_mean`. And this doesn't work because `did_you_mean` is activated in ruby's `prelude.rb`, way before `bundler/setup` is required, so the latest version will always be activated, regardless of what the user specifies. If these versions are not the same, a gem activation conflict error will happen. Note that this problem is not specific to ruby 2.7, it simply gets triggered by the change of making it a default gem, but it would also happen on older versions if the user `did_you_mean` version specified in the `Gemfile` does not match the latest version installed on her system. As a consequence of this, we also get activation trouble because `did_you_mean` depends on `delegate` which is also a default gem on ruby 2.7. This problem _is_ specific to ruby 2.7 because `delegate` was not gemified before that, but can probably be workarounded by removing the `delegate` dependendcy from `did_you_mean`. ### What is your fix for the problem, implemented in this PR? My "fix" allow these failures, because there's not much we can do about this at the moment. However, I'd like to ping @yuki24 and ask how difficult would be to remove the dependency on `delegate` from `did_you_mean`, because that would fix the issue with the `delegate` gem. Co-authored-by: David Rodríguez (cherry picked from commit 3bd06e7a8bb427945b9a0c7c108c02bd96d7c1c9) --- spec/runtime/setup_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/runtime/setup_spec.rb b/spec/runtime/setup_spec.rb index 8769b00426c..53300af618c 100644 --- a/spec/runtime/setup_spec.rb +++ b/spec/runtime/setup_spec.rb @@ -1203,7 +1203,7 @@ def lock_with(ruby_version = nil) describe "default gem activation" do let(:exemptions) do if Gem::Version.new(Gem::VERSION) >= Gem::Version.new("2.7") - [] + %w[delegate did_you_mean] else %w[io-console openssl] end << "bundler" From fc867e3f1c58b0dc84d3b4446f62f73d8ab01af6 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 29 Nov 2019 20:07:40 +0000 Subject: [PATCH 25/31] Merge #7418 7418: Restore previous BUNDLE_GEMFILE in bundler/inline r=deivid-rodriguez a=fatkodima [Without spacing changes](https://github.com/bundler/bundler/pull/7418/files?w=1) Closes #7159 Co-authored-by: fatkodima (cherry picked from commit 4367f9ada53f72537309987772f48d357bbd5e72) --- lib/bundler/inline.rb | 67 ++++++++++++++++++++----------------- spec/runtime/inline_spec.rb | 17 ++++++++++ 2 files changed, 53 insertions(+), 31 deletions(-) diff --git a/lib/bundler/inline.rb b/lib/bundler/inline.rb index 152d7d3f609..5b2ddb7db68 100644 --- a/lib/bundler/inline.rb +++ b/lib/bundler/inline.rb @@ -37,43 +37,48 @@ def gemfile(install = false, options = {}, &gemfile) ui.level = "silent" if opts.delete(:quiet) raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty? - old_root = Bundler.method(:root) - bundler_module = class << Bundler; self; end - bundler_module.send(:remove_method, :root) - def Bundler.root - Bundler::SharedHelpers.pwd.expand_path - end - Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile" - - Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins? - builder = Bundler::Dsl.new - builder.instance_eval(&gemfile) + begin + old_root = Bundler.method(:root) + bundler_module = class << Bundler; self; end + bundler_module.send(:remove_method, :root) + def Bundler.root + Bundler::SharedHelpers.pwd.expand_path + end + old_gemfile = ENV["BUNDLE_GEMFILE"] + Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile" - Bundler.settings.temporary(:frozen => false) do - definition = builder.to_definition(nil, true) - def definition.lock(*); end - definition.validate_runtime! + Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins? + builder = Bundler::Dsl.new + builder.instance_eval(&gemfile) - missing_specs = proc do - definition.missing_specs? - end + Bundler.settings.temporary(:frozen => false) do + definition = builder.to_definition(nil, true) + def definition.lock(*); end + definition.validate_runtime! - Bundler.ui = install ? ui : Bundler::UI::Silent.new - if install || missing_specs.call - Bundler.settings.temporary(:inline => true, :disable_platform_warnings => true) do - installer = Bundler::Installer.install(Bundler.root, definition, :system => true) - installer.post_install_messages.each do |name, message| - Bundler.ui.info "Post-install message from #{name}:\n#{message}" + Bundler.ui = install ? ui : Bundler::UI::Silent.new + if install || definition.missing_specs? + Bundler.settings.temporary(:inline => true, :disable_platform_warnings => true) do + installer = Bundler::Installer.install(Bundler.root, definition, :system => true) + installer.post_install_messages.each do |name, message| + Bundler.ui.info "Post-install message from #{name}:\n#{message}" + end end end + + runtime = Bundler::Runtime.new(nil, definition) + runtime.setup.require + end + ensure + if bundler_module + bundler_module.send(:remove_method, :root) + bundler_module.send(:define_method, :root, old_root) end - runtime = Bundler::Runtime.new(nil, definition) - runtime.setup.require - end -ensure - if bundler_module - bundler_module.send(:remove_method, :root) - bundler_module.send(:define_method, :root, old_root) + if old_gemfile + ENV["BUNDLE_GEMFILE"] = old_gemfile + else + ENV.delete("BUNDLE_GEMFILE") + end end end diff --git a/spec/runtime/inline_spec.rb b/spec/runtime/inline_spec.rb index afb9c3d180c..94d8b086a29 100644 --- a/spec/runtime/inline_spec.rb +++ b/spec/runtime/inline_spec.rb @@ -316,4 +316,21 @@ def confirm(msg, newline = nil) expect(err).to be_empty end + + it "preserves previous BUNDLE_GEMFILE value" do + ENV["BUNDLE_GEMFILE"] = "" + script <<-RUBY + gemfile do + source "#{file_uri_for(gem_repo1)}" + gem "rack" + end + + puts "BUNDLE_GEMFILE is empty" if ENV["BUNDLE_GEMFILE"].empty? + system("#{Gem.ruby} -w -e '42'") # this should see original value of BUNDLE_GEMFILE + exit $?.exitstatus + RUBY + + expect(last_command).to be_success + expect(out).to include("BUNDLE_GEMFILE is empty") + end end From d1c4e5dc26468fb4127ae5dbdb2db4751b5970d3 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Fri, 13 Dec 2019 19:03:52 +0000 Subject: [PATCH 26/31] Merge #7478 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7478: Revert "Write & read dummy gems binarily" r=deivid-rodriguez a=deivid-rodriguez This reverts commit f11c4757a17bea029e1a83ad67c425ccf16133ff. ### What was the end-user problem that led to this PR? The problem was that since #7451, azure logs are flooded with messages like ``` The file will have its original line endings in your working directory warning: LF will be replaced by CRLF in foo.gemspec. ``` This makes it hard to scan for other potential errors. ### What was your diagnosis of the problem? My diagnosis was that some commit in that PR introduced this warnings. ### What is your fix for the problem, implemented in this PR? My fix is to revert the offending commit. Co-authored-by: David Rodríguez (cherry picked from commit f143253656981d64fac8b3c781172c716e3a3f4e) --- spec/install/redownload_spec.rb | 2 +- spec/support/builders.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/install/redownload_spec.rb b/spec/install/redownload_spec.rb index c880b8bb150..818c33bd613 100644 --- a/spec/install/redownload_spec.rb +++ b/spec/install/redownload_spec.rb @@ -17,7 +17,7 @@ bundle! :install, flag => true expect(out).to include "Installing rack 1.0.0" - expect(rack_lib.binread).to eq("RACK = '1.0.0'\n") + expect(rack_lib.open(&:read)).to eq("RACK = '1.0.0'\n") expect(the_bundle).to include_gems "rack 1.0.0" end diff --git a/spec/support/builders.rb b/spec/support/builders.rb index 331c0d11d2f..c7f299487c1 100644 --- a/spec/support/builders.rb +++ b/spec/support/builders.rb @@ -620,7 +620,7 @@ def @spec.validate(*); end @files.each do |file, source| file = Pathname.new(path).join(file) FileUtils.mkdir_p(file.dirname) - File.open(file, "wb") {|f| f.puts source } + File.open(file, "w") {|f| f.puts source } end @spec.files = @files.keys path From 2b781e5ab96f5eeefa069f6503aba4250a2627f0 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Sat, 14 Dec 2019 12:09:55 +0000 Subject: [PATCH 27/31] Merge #7480 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7480: Vendor thor 1.0.0 r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that `thor` 1.0.0 has been released, so we should vendor it. ### What is your fix for the problem, implemented in this PR? My fix is to vendor it. Co-authored-by: David Rodríguez (cherry picked from commit 935c7272ba0f17f81823e704b54627b75cf7f913) --- lib/bundler/vendor/thor/lib/thor/base.rb | 22 +++++++++----- .../vendor/thor/lib/thor/nested_context.rb | 29 +++++++++++++++++++ lib/bundler/vendor/thor/lib/thor/version.rb | 2 +- 3 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 lib/bundler/vendor/thor/lib/thor/nested_context.rb diff --git a/lib/bundler/vendor/thor/lib/thor/base.rb b/lib/bundler/vendor/thor/lib/thor/base.rb index bd2ebb61565..9ba52433782 100644 --- a/lib/bundler/vendor/thor/lib/thor/base.rb +++ b/lib/bundler/vendor/thor/lib/thor/base.rb @@ -2,6 +2,7 @@ require_relative "core_ext/hash_with_indifferent_access" require_relative "error" require_relative "invocation" +require_relative "nested_context" require_relative "parser" require_relative "shell" require_relative "line_editor" @@ -418,14 +419,20 @@ def remove_command(*names) # remove_command :this_is_not_a_command # end # - def no_commands - @no_commands = true - yield - ensure - @no_commands = false + def no_commands(&block) + no_commands_context.enter(&block) end + alias_method :no_tasks, :no_commands + def no_commands_context + @no_commands_context ||= NestedContext.new + end + + def no_commands? + no_commands_context.entered? + end + # Sets the namespace for the Bundler::Thor or Bundler::Thor::Group class. By default the # namespace is retrieved from the class name. If your Bundler::Thor class is named # Scripts::MyScript, the help method, for example, will be called as: @@ -607,7 +614,7 @@ def find_and_refresh_command(name) #:nodoc: def inherited(klass) super(klass) Bundler::Thor::Base.register_klass_file(klass) - klass.instance_variable_set(:@no_commands, false) + klass.instance_variable_set(:@no_commands, 0) end # Fire this callback whenever a method is added. Added methods are @@ -624,8 +631,7 @@ def method_added(meth) # Return if it's not a public instance method return unless public_method_defined?(meth.to_sym) - @no_commands ||= false - return if @no_commands || !create_command(meth) + return if no_commands? || !create_command(meth) is_thor_reserved_word?(meth, :command) Bundler::Thor::Base.register_klass_file(self) diff --git a/lib/bundler/vendor/thor/lib/thor/nested_context.rb b/lib/bundler/vendor/thor/lib/thor/nested_context.rb new file mode 100644 index 00000000000..fd36b9d43fa --- /dev/null +++ b/lib/bundler/vendor/thor/lib/thor/nested_context.rb @@ -0,0 +1,29 @@ +class Bundler::Thor + class NestedContext + def initialize + @depth = 0 + end + + def enter + push + + yield + ensure + pop + end + + def entered? + @depth > 0 + end + + private + + def push + @depth += 1 + end + + def pop + @depth -= 1 + end + end +end diff --git a/lib/bundler/vendor/thor/lib/thor/version.rb b/lib/bundler/vendor/thor/lib/thor/version.rb index 98f2b790811..7750d27637c 100644 --- a/lib/bundler/vendor/thor/lib/thor/version.rb +++ b/lib/bundler/vendor/thor/lib/thor/version.rb @@ -1,3 +1,3 @@ class Bundler::Thor - VERSION = "0.20.3" + VERSION = "1.0.0" end From acf122dc63f90174e5d6cd0e71a51768fc5007e4 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Sat, 14 Dec 2019 16:33:40 +0000 Subject: [PATCH 28/31] Merge #7482 7482: Fixed test failures with gem command path on ruby core repo r=deivid-rodriguez a=hsbt ### What was the end-user problem that led to this PR? Some of the examples failed with ruby-core repository. ### What was your diagnosis of the problem? The ruby-core repository used `gem` commands under the its repository named `bin/gem` directory. But the current examples points `gem` command with a global path. ### What is your fix for the problem, implemented in this PR? I fixed them used by `ruby_core?` helper methods. Co-authored-by: Hiroshi SHIBATA (cherry picked from commit 4045ba4bb1b19c8c43178daae1918f38d11c6af6) --- spec/bundler/gem_helper_spec.rb | 2 +- spec/commands/exec_spec.rb | 2 +- spec/support/path.rb | 6 +++++- spec/support/rubygems_ext.rb | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/spec/bundler/gem_helper_spec.rb b/spec/bundler/gem_helper_spec.rb index c01d65d5dd7..29e10d64f81 100644 --- a/spec/bundler/gem_helper_spec.rb +++ b/spec/bundler/gem_helper_spec.rb @@ -235,7 +235,7 @@ def mock_build_message(name, version) end it "uses Kernel.system" do - expect(Kernel).to receive(:system).with("gem", "push", app_gem_path.to_s, "--host", "http://example.org").and_return(true) + expect(Kernel).to receive(:system).with(gem_bin, "push", app_gem_path.to_s, "--host", "http://example.org").and_return(true) Rake.application["release"].invoke end diff --git a/spec/commands/exec_spec.rb b/spec/commands/exec_spec.rb index a5d67c6d682..c1d6e4c25a7 100644 --- a/spec/commands/exec_spec.rb +++ b/spec/commands/exec_spec.rb @@ -57,7 +57,7 @@ it "works when exec'ing to rubygems" do install_gemfile 'gem "rack"' - bundle "exec gem --version" + bundle "exec #{gem_cmd} --version" expect(out).to eq(Gem::VERSION) end diff --git a/spec/support/path.rb b/spec/support/path.rb index eea3161b15a..645da52c97e 100644 --- a/spec/support/path.rb +++ b/spec/support/path.rb @@ -21,8 +21,12 @@ def bindir @bindir ||= root.join(ruby_core? ? "libexec" : "exe") end + def gem_cmd + @gem_cmd ||= ruby_core? ? root.join("bin/gem") : "gem" + end + def gem_bin - @gem_bin ||= ruby_core? ? ENV["GEM_COMMAND"] : "#{Gem.ruby} -S gem --backtrace" + @gem_bin ||= ruby_core? ? ENV["GEM_COMMAND"] : "gem" end def spec_dir diff --git a/spec/support/rubygems_ext.rb b/spec/support/rubygems_ext.rb index 7e9e8328c58..ee9c750a522 100644 --- a/spec/support/rubygems_ext.rb +++ b/spec/support/rubygems_ext.rb @@ -99,7 +99,7 @@ def install_gems(gems) no_reqs.map!(&:first) reqs.map! {|name, req| "'#{name}:#{req}'" } deps = reqs.concat(no_reqs).join(" ") - gem = Path.gem_bin + gem = ENV["GEM_COMMAND"] || "#{Gem.ruby} -S gem --backtrace" cmd = "#{gem} install #{deps} --no-document --conservative" system(cmd) || raise("Installing gems #{deps} for the tests to use failed!") end From 9e84656672fdc6d11f54c659c338365c72e3f825 Mon Sep 17 00:00:00 2001 From: Bundlerbot Date: Sat, 14 Dec 2019 14:54:04 +0000 Subject: [PATCH 29/31] Merge #7483 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7483: Delegate should be supported now r=deivid-rodriguez a=deivid-rodriguez ### What was the end-user problem that led to this PR? The problem was that delegate is now supported since `did_you_mean` drop its dependency on it at https://github.com/ruby/ruby/commit/e2708068ad65f7f9986adf4fb3a4fa660f430a5a. ### What was your diagnosis of the problem? My diagnosis was that we can test that arbitrary `delegate` versions can be included in Gemfiles again. ### What is your fix for the problem, implemented in this PR? My fix removes `delegate` from the exemptions. Co-authored-by: David Rodríguez (cherry picked from commit fc2b63cfc20a225b066993db2bf4600aca11eabb) --- spec/runtime/setup_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/runtime/setup_spec.rb b/spec/runtime/setup_spec.rb index 53300af618c..befc5f9d090 100644 --- a/spec/runtime/setup_spec.rb +++ b/spec/runtime/setup_spec.rb @@ -1203,7 +1203,7 @@ def lock_with(ruby_version = nil) describe "default gem activation" do let(:exemptions) do if Gem::Version.new(Gem::VERSION) >= Gem::Version.new("2.7") - %w[delegate did_you_mean] + %w[did_you_mean] else %w[io-console openssl] end << "bundler" From e3f30d2cf51bd8dbaf4b794c5ad76f6339ccc87a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 Dec 2019 20:07:22 +0100 Subject: [PATCH 30/31] Version 2.1.0 --- lib/bundler/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bundler/version.rb b/lib/bundler/version.rb index 4cf11c5fb5e..417b21f18a7 100644 --- a/lib/bundler/version.rb +++ b/lib/bundler/version.rb @@ -1,7 +1,7 @@ # frozen_string_literal: false module Bundler - VERSION = "2.1.0.pre.3".freeze + VERSION = "2.1.0".freeze def self.bundler_major_version @bundler_major_version ||= VERSION.split(".").first.to_i From c40d5e15898ae5679f89969ec22a2efb9b4f68c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Rodr=C3=ADguez?= Date: Fri, 13 Dec 2019 20:08:36 +0100 Subject: [PATCH 31/31] Changelog for 2.1.0 --- CHANGELOG.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24e2daa913b..1393d19942b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ +## 2.1.0 (December 15, 2019) + +Features: + + - Add support for new default gems. In particular, + + * `open3` [#7455](https://github.com/bundler/bundler/pull/7455) + * `cgi`: [#7456](https://github.com/bundler/bundler/pull/7456) + * `uri` [#7460](https://github.com/bundler/bundler/pull/7460) + + plus other PRs removing or lazily loading usages of these gems from other places to not interfere with user's choice, such as [#7471](https://github.com/bundler/bundler/pull/7471) or [#7473](https://github.com/bundler/bundler/pull/7473) + +Bugfixes: + + - Fix `bundle exec rake install` failing [#7474](https://github.com/bundler/bundler/pull/7474) + - Fix `bundle exec`'ing to rubygems being silent [#7442](https://github.com/bundler/bundler/pull/7442) + - Restore previous `BUNDLE_GEMFILE` in `bundler/inline` [#7418](https://github.com/bundler/bundler/pull/7418) + - Fix error when using `gem` DSL's `:glob` option for selecting gemspecs from a specific source [#7419](https://github.com/bundler/bundler/pull/7419) + +Changes: + + - `bundle config` no longer warns when using "old interface" (might be deprecated again in the future) [#7475](https://github.com/bundler/bundler/pull/7475) + - `bundle update` no longer warns when used without arguments (might be deprecated again in the future) [#7475](https://github.com/bundler/bundler/pull/7475) + ## 2.1.0.pre.3 (November 12, 2019) Features: