Añade el plugin Redmine Git Hosting 5.0.0

This commit is contained in:
Manuel Cillero 2021-03-20 13:29:16 +01:00
parent cfa0d58b18
commit a3bddad233
458 changed files with 30396 additions and 1 deletions

View file

@ -0,0 +1,26 @@
module BaseForm
extend ActiveSupport::Concern
included do
include ActiveModel::Validations
include ActiveModel::Validations::Callbacks
include ActiveModel::Conversion
extend ActiveModel::Naming
end
def persisted?
false
end
def submit(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
if valid?
valid_form_submitted if respond_to?(:valid_form_submitted)
true
else
false
end
end
end

View file

@ -0,0 +1,39 @@
class MoveRepositoryForm
include BaseForm
attr_reader :repository
attr_accessor :project_id
validates_presence_of :project_id
validate :repository_is_movable
validate :target_project
validate :repository_uniqueness
def initialize(repository)
@repository = repository
end
def project
@project ||= Project.find_by_id(project_id)
end
def valid_form_submitted
repository.update_attribute(:project_id, project.id)
RedmineGitHosting::GitoliteAccessor.move_repository(repository)
end
private
def repository_is_movable
errors.add(:base, :identifier_empty) unless repository.movable?
end
def target_project
errors.add(:base, :wrong_target_project) if repository.project == project
end
def repository_uniqueness
new_repo = project.repositories.find_by_identifier(repository.identifier)
errors.add(:base, :identifier_taken) unless new_repo.nil?
end
end

View file

@ -0,0 +1,59 @@
class PluginSettingsForm
class << self
def add_accessor(*args)
@accessors ||= []
args.each do |accessor|
@accessors << accessor
attr_accessor accessor
end
end
def all_accessors
@accessors
end
end
include BaseForm
include PluginSettingsValidation::CacheConfig
include PluginSettingsValidation::GitoliteAccessConfig
include PluginSettingsValidation::GitoliteConfig
include PluginSettingsValidation::HooksConfig
include PluginSettingsValidation::MailingListConfig
include PluginSettingsValidation::RedmineConfig
include PluginSettingsValidation::SshConfig
include PluginSettingsValidation::StorageConfig
attr_reader :plugin
def initialize(plugin)
@plugin = plugin
end
def params
Hash[self.class.all_accessors.map { |v| [v, send(v)] }]
end
private
def current_setting(setting)
Setting.plugin_redmine_git_hosting[setting]
end
def strip_value(value)
return '' if value.nil?
value.strip
end
def filter_email_list(list)
list.select(&:present?).select { |m| valid_email?(m) }
end
def valid_email?(email)
RedmineGitHosting::Validators.valid_email?(email)
end
def convert_time(time)
(time.to_f * 10).to_i / 10.0
end
end

View file

@ -0,0 +1,18 @@
module PluginSettingsValidation
module CacheConfig
extend ActiveSupport::Concern
included do
# Gitolite Cache Config
add_accessor :gitolite_cache_max_time,
:gitolite_cache_max_size,
:gitolite_cache_max_elements,
:gitolite_cache_adapter
validates :gitolite_cache_max_time, presence: true, numericality: { only_integer: true }
validates :gitolite_cache_max_size, presence: true, numericality: { only_integer: true }
validates :gitolite_cache_max_elements, presence: true, numericality: { only_integer: true }
validates :gitolite_cache_adapter, presence: true, inclusion: { in: GitCache.adapters }
end
end
end

View file

@ -0,0 +1,37 @@
module PluginSettingsValidation
module GitoliteAccessConfig
extend ActiveSupport::Concern
included do
# Gitolite Access Config
add_accessor :ssh_server_domain,
:http_server_domain,
:https_server_domain,
:http_server_subdir,
:gitolite_daemon_by_default,
:gitolite_http_by_default
before_validation do
self.ssh_server_domain = strip_value(ssh_server_domain)
self.http_server_domain = strip_value(http_server_domain)
self.https_server_domain = strip_value(https_server_domain)
self.http_server_subdir = strip_value(http_server_subdir)
end
validates :ssh_server_domain, presence: true, format: { with: RedmineGitHosting::Validators::DOMAIN_REGEX }
validates :http_server_domain, presence: true, format: { with: RedmineGitHosting::Validators::DOMAIN_REGEX }
validates :https_server_domain, format: { with: RedmineGitHosting::Validators::DOMAIN_REGEX }, allow_blank: true
validates :gitolite_daemon_by_default, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :gitolite_http_by_default, presence: true, inclusion: { in: %w[0 1 2 3] }, numericality: { only_integer: true }
validate :http_server_subdir_is_relative
end
private
def http_server_subdir_is_relative
errors.add(:http_server_subdir, 'must be relative') if http_server_subdir.starts_with?('/')
end
end
end

View file

@ -0,0 +1,61 @@
module PluginSettingsValidation
module GitoliteConfig
extend ActiveSupport::Concern
included do
# Gitolite Config File
add_accessor :gitolite_config_file,
:gitolite_identifier_prefix,
:gitolite_identifier_strip_user_id
# Gitolite Global Config
add_accessor :gitolite_temp_dir,
:gitolite_recycle_bin_expiration_time,
:gitolite_log_level,
:git_config_username,
:git_config_email
before_validation do
self.gitolite_config_file = strip_value(gitolite_config_file)
self.gitolite_identifier_prefix = strip_value(gitolite_identifier_prefix)
self.gitolite_temp_dir = strip_value(gitolite_temp_dir)
self.git_config_username = strip_value(git_config_username)
self.git_config_email = strip_value(git_config_email)
self.gitolite_recycle_bin_expiration_time = strip_value(gitolite_recycle_bin_expiration_time)
end
# Validates Gitolite Config File
validates :gitolite_identifier_strip_user_id, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
# Validates Gitolite Global Config
validates :gitolite_temp_dir, presence: true
validates :gitolite_recycle_bin_expiration_time, presence: true, numericality: true
validates :gitolite_log_level, presence: true, inclusion: { in: RedmineGitHosting::FileLogger::LOG_LEVELS }
validates :git_config_username, presence: true
validates :git_config_email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }
validate :gitolite_config_file_is_relative
validate :tmp_dir_is_absolute
after_validation do
self.gitolite_recycle_bin_expiration_time = convert_time(gitolite_recycle_bin_expiration_time)
if gitolite_config_file == RedmineGitHosting::Config::GITOLITE_DEFAULT_CONFIG_FILE
self.gitolite_identifier_strip_user_id = 'false'
self.gitolite_identifier_prefix = RedmineGitHosting::Config::GITOLITE_IDENTIFIER_DEFAULT_PREFIX
end
end
end
private
def gitolite_config_file_is_relative
errors.add(:gitolite_config_file, 'must be relative') if gitolite_config_file.starts_with?('/')
end
def tmp_dir_is_absolute
errors.add(:gitolite_temp_dir, 'must be absolute') unless gitolite_temp_dir.starts_with?('/')
end
end
end

View file

@ -0,0 +1,22 @@
module PluginSettingsValidation
module HooksConfig
extend ActiveSupport::Concern
included do
# Gitolite Hooks Config
add_accessor :gitolite_overwrite_existing_hooks,
:gitolite_hooks_are_asynchronous,
:gitolite_hooks_debug,
:gitolite_hooks_url
before_validation do
self.gitolite_hooks_url = strip_value(gitolite_hooks_url)
end
validates :gitolite_overwrite_existing_hooks, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :gitolite_hooks_are_asynchronous, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :gitolite_hooks_debug, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :gitolite_hooks_url, presence: true, format: { with: URI::DEFAULT_PARSER.make_regexp(%w[http https]) }
end
end
end

View file

@ -0,0 +1,34 @@
module PluginSettingsValidation
module MailingListConfig
extend ActiveSupport::Concern
included do
# Git Mailing List Config
add_accessor :gitolite_notify_by_default,
:gitolite_notify_global_prefix,
:gitolite_notify_global_sender_address,
:gitolite_notify_global_include,
:gitolite_notify_global_exclude
before_validation do
self.gitolite_notify_global_include = filter_email_list(gitolite_notify_global_include)
self.gitolite_notify_global_exclude = filter_email_list(gitolite_notify_global_exclude)
end
validates :gitolite_notify_by_default, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :gitolite_notify_global_sender_address, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }
validate :git_notifications_intersection
end
private
# Validate intersection of global_include/global_exclude
#
def git_notifications_intersection
intersection = gitolite_notify_global_include & gitolite_notify_global_exclude
return unless intersection.count.positive?
errors.add(:base, 'duplicated entries detected in gitolite_notify_global_include and gitolite_notify_global_exclude')
end
end
end

View file

@ -0,0 +1,55 @@
module PluginSettingsValidation
module RedmineConfig
extend ActiveSupport::Concern
included do
# Redmine Config
add_accessor :redmine_has_rw_access_on_all_repos,
:all_projects_use_git,
:init_repositories_on_create,
:delete_git_repositories,
:download_revision_enabled,
:gitolite_use_sidekiq
# This params work together!
# When hierarchical_organisation = true, unique_repo_identifier MUST be false
# When hierarchical_organisation = false, unique_repo_identifier MUST be true
add_accessor :hierarchical_organisation, :unique_repo_identifier
# hierarchical_organisation and unique_repo_identifier are now combined
#
before_validation do
self.unique_repo_identifier = if Additionals.true? hierarchical_organisation
'false'
else
'true'
end
## If we don't auto-create repository, we cannot create README file
self.init_repositories_on_create = 'false' unless Additionals.true? all_projects_use_git
end
validates :redmine_has_rw_access_on_all_repos, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :all_projects_use_git, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :init_repositories_on_create, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :delete_git_repositories, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :download_revision_enabled, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :gitolite_use_sidekiq, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :hierarchical_organisation, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validates :unique_repo_identifier, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
validate :check_for_duplicated_repo
end
private
# Check duplication if we are switching from a mode to another
#
def check_for_duplicated_repo
return if Additionals.true?(hierarchical_organisation)
return unless Repository::Xitolite.have_duplicated_identifier?
errors.add(:base, 'Detected non-unique repository identifiers. Cannot switch to flat mode')
end
end
end

View file

@ -0,0 +1,33 @@
module PluginSettingsValidation
module SshConfig
extend ActiveSupport::Concern
included do
# Gitolite SSH Config
add_accessor :gitolite_user,
:gitolite_server_host,
:gitolite_server_port,
:gitolite_ssh_private_key,
:gitolite_ssh_public_key
before_validation do
self.gitolite_user = strip_value(gitolite_user)
self.gitolite_server_host = strip_value(gitolite_server_host)
self.gitolite_server_port = strip_value(gitolite_server_port)
self.gitolite_ssh_private_key = strip_value(gitolite_ssh_private_key)
self.gitolite_ssh_public_key = strip_value(gitolite_ssh_public_key)
end
validates :gitolite_user, :gitolite_server_host, :gitolite_ssh_private_key, :gitolite_ssh_public_key,
presence: true
validates :gitolite_server_port,
presence: true,
numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 65_536 }
validates_each :gitolite_ssh_private_key, :gitolite_ssh_public_key do |record, attr, value|
record.errors.add(attr, 'must exists on filesystem') unless File.exist? value
end
end
end
end

View file

@ -0,0 +1,26 @@
module PluginSettingsValidation
module StorageConfig
extend ActiveSupport::Concern
PATHS_TO_VALIDATE = %i[gitolite_global_storage_dir gitolite_redmine_storage_dir gitolite_recycle_bin_dir].freeze
included do
# Gitolite Storage Config
add_accessor :gitolite_global_storage_dir,
:gitolite_redmine_storage_dir,
:gitolite_recycle_bin_dir
before_validation do
self.gitolite_global_storage_dir = strip_value(gitolite_global_storage_dir)
self.gitolite_redmine_storage_dir = strip_value(gitolite_redmine_storage_dir)
self.gitolite_recycle_bin_dir = strip_value(gitolite_recycle_bin_dir)
end
validates_presence_of :gitolite_global_storage_dir, :gitolite_recycle_bin_dir
validates_each PATHS_TO_VALIDATE do |record, attr, value|
record.errors.add(attr, 'must be relative') if value.starts_with?('/')
end
end
end
end