Move Settings to its own file, isolate it from Rails and introduce Gitlab.root
Signed-off-by: Rémy Coutable <remy@rymai.me>
This commit is contained in:
parent
fe919f95b1
commit
c286c66f57
|
@ -1,131 +1,5 @@
|
||||||
# rubocop:disable GitlabSecurity/PublicSend
|
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
|
||||||
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
|
|
||||||
|
|
||||||
# Default settings
|
# Default settings
|
||||||
Settings['ldap'] ||= Settingslogic.new({})
|
Settings['ldap'] ||= Settingslogic.new({})
|
||||||
|
|
|
@ -5,6 +5,6 @@ module Gitlab
|
||||||
Settings
|
Settings
|
||||||
end
|
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
|
REVISION = Gitlab::Popen.popen(%W(#{config.git.bin_path} log --pretty=format:%h -n 1)).first.chomp.freeze
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,10 @@ module Gitlab
|
||||||
APP_DIRS_PATTERN = %r{^/?(app|config|ee|lib|spec|\(\w*\))}
|
APP_DIRS_PATTERN = %r{^/?(app|config|ee|lib|spec|\(\w*\))}
|
||||||
SUBDOMAIN_REGEX = %r{\Ahttps://[a-z0-9]+\.gitlab\.com\z}
|
SUBDOMAIN_REGEX = %r{\Ahttps://[a-z0-9]+\.gitlab\.com\z}
|
||||||
|
|
||||||
|
def self.root
|
||||||
|
Pathname.new(File.expand_path('..', __dir__))
|
||||||
|
end
|
||||||
|
|
||||||
def self.com?
|
def self.com?
|
||||||
# Check `gl_subdomain?` as well to keep parity with gitlab.com
|
# Check `gl_subdomain?` as well to keep parity with gitlab.com
|
||||||
Gitlab.config.gitlab.url == COM_URL || gl_subdomain?
|
Gitlab.config.gitlab.url == COM_URL || gl_subdomain?
|
||||||
|
|
|
@ -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
|
|
@ -2,8 +2,9 @@ require 'bundler/setup'
|
||||||
|
|
||||||
require 'settingslogic'
|
require 'settingslogic'
|
||||||
|
|
||||||
ENV["RAILS_ENV"] = 'test'
|
ENV['GITLAB_ENV'] = 'test'
|
||||||
ENV["IN_MEMORY_APPLICATION_SETTINGS"] = 'true'
|
ENV['RAILS_ENV'] = 'test'
|
||||||
|
ENV['IN_MEMORY_APPLICATION_SETTINGS'] = 'true'
|
||||||
|
|
||||||
unless Kernel.respond_to?(:require_dependency)
|
unless Kernel.respond_to?(:require_dependency)
|
||||||
module Kernel
|
module Kernel
|
||||||
|
@ -11,27 +12,9 @@ unless Kernel.respond_to?(:require_dependency)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
unless defined?(Rails)
|
# Defines Gitlab and Gitlab.config which are at the center of the app
|
||||||
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
|
|
||||||
unless defined?(Gitlab) && Gitlab.respond_to?(:config)
|
unless defined?(Gitlab) && Gitlab.respond_to?(:config)
|
||||||
|
require_relative '../lib/settings'
|
||||||
require_relative '../config/initializers/2_app'
|
require_relative '../config/initializers/2_app'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,12 @@ require 'fast_spec_helper'
|
||||||
require_dependency 'gitlab'
|
require_dependency 'gitlab'
|
||||||
|
|
||||||
describe Gitlab do
|
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
|
describe '.com?' do
|
||||||
it 'is true when on GitLab.com' do
|
it 'is true when on GitLab.com' do
|
||||||
stub_config_setting(url: 'https://gitlab.com')
|
stub_config_setting(url: 'https://gitlab.com')
|
||||||
|
|
Loading…
Reference in New Issue