diff options
author | Samuel Giddins <segiddins@segiddins.me> | 2017-04-24 11:25:52 +0200 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2017-04-24 11:25:52 +0200 |
commit | f4fb8cbb7387cca873390cde5e57cce3c6007ca9 (patch) | |
tree | 687b10c6821aa0099c1b81ea58a37d01aeec8482 | |
parent | 29a0e80c9f9fa745c0adaf4de6366b4f582e8a51 (diff) | |
download | bundler-seg-config-mirror-fallback-timeout.tar.gz |
[Settings] Allow configuring a mirror fallback timeout without a trailing slashseg-config-mirror-fallback-timeout
-rw-r--r-- | lib/bundler/mirror.rb | 9 | ||||
-rw-r--r-- | lib/bundler/settings.rb | 24 | ||||
-rw-r--r-- | spec/bundler/settings_spec.rb | 10 |
3 files changed, 36 insertions, 7 deletions
diff --git a/lib/bundler/mirror.rb b/lib/bundler/mirror.rb index 97a6776adb..9903e158ab 100644 --- a/lib/bundler/mirror.rb +++ b/lib/bundler/mirror.rb @@ -37,7 +37,7 @@ module Bundler mirror = if config.all? @all else - (@mirrors[config.uri] = @mirrors[config.uri] || Mirror.new) + @mirrors[config.uri] ||= Mirror.new end config.update_mirror(mirror) end @@ -45,7 +45,8 @@ module Bundler private def fetch_valid_mirror_for(uri) - mirror = (@mirrors[URI(uri.to_s.downcase)] || @mirrors[URI(uri.to_s).host] || Mirror.new(uri)).validate!(@prober) + mirror = @mirrors[uri.to_s.downcase] || @mirrors[URI(uri.to_s).host] || Mirror.new(uri) + mirror.validate!(@prober) mirror = Mirror.new(uri) unless mirror.valid? mirror end @@ -71,7 +72,7 @@ module Bundler @uri = if uri.nil? nil else - URI(uri.to_s) + URI(uri.to_s.downcase) end @valid = nil end @@ -117,7 +118,7 @@ module Bundler def initialize(config_line, value) uri, fallback = - config_line.match(%r{^mirror\.(all|.+?)(\.fallback_timeout)?\/?$}).captures + config_line.match(%r{\Amirror\.(all|.+?)(\.fallback_timeout)?\/?\z}).captures @fallback = !fallback.nil? @all = false if uri == "all" diff --git a/lib/bundler/settings.rb b/lib/bundler/settings.rb index 7339f721ad..3612023cb2 100644 --- a/lib/bundler/settings.rb +++ b/lib/bundler/settings.rb @@ -140,7 +140,7 @@ module Bundler def gem_mirrors all.inject(Mirrors.new) do |mirrors, k| - mirrors.parse(k, self[k]) if k =~ /^mirror\./ + mirrors.parse(k, self[k]) if k.start_with?("mirror.") mirrors end end @@ -321,16 +321,34 @@ module Bundler end end + PER_URI_OPTIONS = %w( + fallback_timeout + ).freeze + + NORMALIZE_URI_OPTIONS_PATTERN = + / + \A + (\w+\.)? # optional prefix key + (https?.*?) # URI + (\.#{Regexp.union(PER_URI_OPTIONS)})? # optional suffix key + \z + /ix + # TODO: duplicates Rubygems#normalize_uri # TODO: is this the correct place to validate mirror URIs? def self.normalize_uri(uri) uri = uri.to_s - uri = "#{uri}/" unless uri =~ %r{/\Z} + if uri =~ NORMALIZE_URI_OPTIONS_PATTERN + prefix = $1 + uri = $2 + suffix = $3 + end + uri = "#{uri}/" unless uri.end_with?("/") uri = URI(uri) unless uri.absolute? raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri) end - uri + "#{prefix}#{uri}#{suffix}".downcase end end end diff --git a/spec/bundler/settings_spec.rb b/spec/bundler/settings_spec.rb index 020897882c..ec01827500 100644 --- a/spec/bundler/settings_spec.rb +++ b/spec/bundler/settings_spec.rb @@ -251,6 +251,16 @@ that would suck --ehhh=oh geez it looks like i might have broken bundler somehow URI("http://rubygems-mirror.org/") ) end + + it "normalizes URIs with a fallback_timeout option" do + settings["mirror.https://rubygems.org/.fallback_timeout"] = "true" + expect(settings.all).to include("mirror.https://rubygems.org/.fallback_timeout") + end + + it "normalizes URIs with a fallback_timeout option without a trailing slash" do + settings["mirror.https://rubygems.org.fallback_timeout"] = "true" + expect(settings.all).to include("mirror.https://rubygems.org/.fallback_timeout") + end end describe "BUNDLE_ keys format" do |