From c286c66f57e4fd716fe1746363f8c7cf4205cee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Tue, 10 Apr 2018 16:07:47 +0200 Subject: [PATCH] Move Settings to its own file, isolate it from Rails and introduce Gitlab.root MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- config/initializers/1_settings.rb | 130 +----------------------------- config/initializers/2_app.rb | 2 +- lib/gitlab.rb | 4 + lib/settings.rb | 126 +++++++++++++++++++++++++++++ spec/fast_spec_helper.rb | 27 ++----- spec/lib/gitlab_spec.rb | 6 ++ 6 files changed, 144 insertions(+), 151 deletions(-) create mode 100644 lib/settings.rb diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index dc7999ac556..53e3c50df5f 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -1,131 +1,5 @@ -# rubocop:disable GitlabSecurity/PublicSend - -require_dependency Rails.root.join('lib/gitlab') # Load Gitlab as soon as possible - -class Settings < Settingslogic - source ENV.fetch('GITLAB_CONFIG') { "#{Rails.root}/config/gitlab.yml" } - namespace Rails.env - - class << self - def gitlab_on_standard_port? - on_standard_port?(gitlab) - end - - def host_without_www(url) - host(url).sub('www.', '') - end - - def build_gitlab_ci_url - custom_port = - if on_standard_port?(gitlab) - nil - else - ":#{gitlab.port}" - end - - [ - gitlab.protocol, - "://", - gitlab.host, - custom_port, - gitlab.relative_url_root - ].join('') - end - - def build_pages_url - base_url(pages).join('') - end - - def build_gitlab_shell_ssh_path_prefix - user_host = "#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}" - - if gitlab_shell.ssh_port != 22 - "ssh://#{user_host}:#{gitlab_shell.ssh_port}/" - else - if gitlab_shell.ssh_host.include? ':' - "[#{user_host}]:" - else - "#{user_host}:" - end - end - end - - def build_base_gitlab_url - base_url(gitlab).join('') - end - - def build_gitlab_url - (base_url(gitlab) + [gitlab.relative_url_root]).join('') - end - - # check that values in `current` (string or integer) is a contant in `modul`. - def verify_constant_array(modul, current, default) - values = default || [] - unless current.nil? - values = [] - current.each do |constant| - values.push(verify_constant(modul, constant, nil)) - end - values.delete_if { |value| value.nil? } - end - - values - end - - # check that `current` (string or integer) is a contant in `modul`. - def verify_constant(modul, current, default) - constant = modul.constants.find { |name| modul.const_get(name) == current } - value = constant.nil? ? default : modul.const_get(constant) - if current.is_a? String - value = modul.const_get(current.upcase) rescue default - end - - value - end - - def absolute(path) - File.expand_path(path, Rails.root) - end - - private - - def base_url(config) - custom_port = on_standard_port?(config) ? nil : ":#{config.port}" - - [ - config.protocol, - "://", - config.host, - custom_port - ] - end - - def on_standard_port?(config) - config.port.to_i == (config.https ? 443 : 80) - end - - # Extract the host part of the given +url+. - def host(url) - url = url.downcase - url = "http://#{url}" unless url.start_with?('http') - - # Get rid of the path so that we don't even have to encode it - url_without_path = url.sub(%r{(https?://[^/]+)/?.*}, '\1') - - URI.parse(url_without_path).host - end - - # Runs every minute in a random ten-minute period on Sundays, to balance the - # load on the server receiving these pings. The usage ping is safe to run - # multiple times because of a 24 hour exclusive lock. - def cron_for_usage_ping - hour = rand(24) - minute = rand(6) - - "#{minute}0-#{minute}9 #{hour} * * 0" - end - end -end +require_dependency File.expand_path('../../lib/gitlab', __dir__) # Load Gitlab as soon as possible +require_dependency File.expand_path('../../lib/settings', __dir__) # Load Settings as soon as possible # Default settings Settings['ldap'] ||= Settingslogic.new({}) diff --git a/config/initializers/2_app.rb b/config/initializers/2_app.rb index d6775d0a4ec..9d43239f7d3 100644 --- a/config/initializers/2_app.rb +++ b/config/initializers/2_app.rb @@ -5,6 +5,6 @@ module Gitlab Settings end - VERSION = File.read(Rails.root.join("VERSION")).strip.freeze + VERSION = File.read(Gitlab.root.join("VERSION")).strip.freeze REVISION = Gitlab::Popen.popen(%W(#{config.git.bin_path} log --pretty=format:%h -n 1)).first.chomp.freeze end diff --git a/lib/gitlab.rb b/lib/gitlab.rb index f6629982512..a51ea0afbd9 100644 --- a/lib/gitlab.rb +++ b/lib/gitlab.rb @@ -5,6 +5,10 @@ module Gitlab APP_DIRS_PATTERN = %r{^/?(app|config|ee|lib|spec|\(\w*\))} SUBDOMAIN_REGEX = %r{\Ahttps://[a-z0-9]+\.gitlab\.com\z} + def self.root + Pathname.new(File.expand_path('..', __dir__)) + end + def self.com? # Check `gl_subdomain?` as well to keep parity with gitlab.com Gitlab.config.gitlab.url == COM_URL || gl_subdomain? diff --git a/lib/settings.rb b/lib/settings.rb new file mode 100644 index 00000000000..bc688eaf121 --- /dev/null +++ b/lib/settings.rb @@ -0,0 +1,126 @@ +require_dependency 'gitlab' + +class Settings < Settingslogic + source ENV.fetch('GITLAB_CONFIG') { Gitlab.root.join('config/gitlab.yml') } + namespace ENV.fetch('GITLAB_ENV') { Rails.env } + + class << self + def gitlab_on_standard_port? + on_standard_port?(gitlab) + end + + def host_without_www(url) + host(url).sub('www.', '') + end + + def build_gitlab_ci_url + custom_port = + if on_standard_port?(gitlab) + nil + else + ":#{gitlab.port}" + end + + [ + gitlab.protocol, + "://", + gitlab.host, + custom_port, + gitlab.relative_url_root + ].join('') + end + + def build_pages_url + base_url(pages).join('') + end + + def build_gitlab_shell_ssh_path_prefix + user_host = "#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}" + + if gitlab_shell.ssh_port != 22 + "ssh://#{user_host}:#{gitlab_shell.ssh_port}/" + else + if gitlab_shell.ssh_host.include? ':' + "[#{user_host}]:" + else + "#{user_host}:" + end + end + end + + def build_base_gitlab_url + base_url(gitlab).join('') + end + + def build_gitlab_url + (base_url(gitlab) + [gitlab.relative_url_root]).join('') + end + + # check that values in `current` (string or integer) is a contant in `modul`. + def verify_constant_array(modul, current, default) + values = default || [] + unless current.nil? + values = [] + current.each do |constant| + values.push(verify_constant(modul, constant, nil)) + end + values.delete_if { |value| value.nil? } + end + + values + end + + # check that `current` (string or integer) is a contant in `modul`. + def verify_constant(modul, current, default) + constant = modul.constants.find { |name| modul.const_get(name) == current } + value = constant.nil? ? default : modul.const_get(constant) + if current.is_a? String + value = modul.const_get(current.upcase) rescue default + end + + value + end + + def absolute(path) + File.expand_path(path, Rails.root) + end + + private + + def base_url(config) + custom_port = on_standard_port?(config) ? nil : ":#{config.port}" + + [ + config.protocol, + "://", + config.host, + custom_port + ] + end + + def on_standard_port?(config) + config.port.to_i == (config.https ? 443 : 80) + end + + # Extract the host part of the given +url+. + def host(url) + url = url.downcase + url = "http://#{url}" unless url.start_with?('http') + + # Get rid of the path so that we don't even have to encode it + url_without_path = url.sub(%r{(https?://[^/]+)/?.*}, '\1') + + URI.parse(url_without_path).host + end + + # Runs every minute in a random ten-minute period on Sundays, to balance the + # load on the server receiving these pings. The usage ping is safe to run + # multiple times because of a 24 hour exclusive lock. + def cron_for_usage_ping + hour = rand(24) + minute = rand(6) + + "#{minute}0-#{minute}9 #{hour} * * 0" + end + end +end diff --git a/spec/fast_spec_helper.rb b/spec/fast_spec_helper.rb index 32eb8db0fa5..b3fe76fb150 100644 --- a/spec/fast_spec_helper.rb +++ b/spec/fast_spec_helper.rb @@ -2,8 +2,9 @@ require 'bundler/setup' require 'settingslogic' -ENV["RAILS_ENV"] = 'test' -ENV["IN_MEMORY_APPLICATION_SETTINGS"] = 'true' +ENV['GITLAB_ENV'] = 'test' +ENV['RAILS_ENV'] = 'test' +ENV['IN_MEMORY_APPLICATION_SETTINGS'] = 'true' unless Kernel.respond_to?(:require_dependency) module Kernel @@ -11,27 +12,9 @@ unless Kernel.respond_to?(:require_dependency) end end -unless defined?(Rails) - module Rails - def self.root - Pathname.new(File.expand_path('')) - end - - # Copied from https://github.com/rails/rails/blob/v4.2.10/railties/lib/rails.rb#L59-L61 - def self.env - @_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development") - end - end -end - -# Settings is used in config/initializers/2_app.rb -class Settings < Settingslogic - source Rails.root.join('config/gitlab.yml') - namespace Rails.env -end - -# Defines Gitlab and Gitlab.config +# Defines Gitlab and Gitlab.config which are at the center of the app unless defined?(Gitlab) && Gitlab.respond_to?(:config) + require_relative '../lib/settings' require_relative '../config/initializers/2_app' end diff --git a/spec/lib/gitlab_spec.rb b/spec/lib/gitlab_spec.rb index e734c12f6dd..da146e24893 100644 --- a/spec/lib/gitlab_spec.rb +++ b/spec/lib/gitlab_spec.rb @@ -3,6 +3,12 @@ require 'fast_spec_helper' require_dependency 'gitlab' describe Gitlab do + describe '.root' do + it 'returns the root path of the app' do + expect(described_class.root).to eq(Pathname.new(File.expand_path('../..', __dir__))) + end + end + describe '.com?' do it 'is true when on GitLab.com' do stub_config_setting(url: 'https://gitlab.com')