Añade plugin Redmine Git Hosting 4.0.2
This commit is contained in:
parent
472cb1ea76
commit
bdd66d941f
494 changed files with 36768 additions and 0 deletions
26
plugins/redmine_git_hosting/app/forms/base_form.rb
Normal file
26
plugins/redmine_git_hosting/app/forms/base_form.rb
Normal 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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,39 @@
|
|||
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,
|
||||
:show_repositories_url,
|
||||
: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 :show_repositories_url, presence: true, inclusion: { in: RedmineGitHosting::Validators::BOOLEAN_FIELDS }
|
||||
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
|
|
@ -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::Logger::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
|
|
@ -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::regexp(%w[http https]) }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -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
|
|
@ -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
|
|
@ -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, presence: true
|
||||
validates :gitolite_server_host, 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 :gitolite_ssh_private_key, presence: true
|
||||
validates :gitolite_ssh_public_key, presence: true
|
||||
|
||||
validates_each :gitolite_ssh_private_key, :gitolite_ssh_public_key do |record, attr, value|
|
||||
record.errors.add(attr, 'must exists on filesystem') unless File.exists?(value)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue