Allow automatic creation of manageable repositories through a setting

This commit allows manageable repositories to be automatically created
by default whenever a new project is created and the repository module
is activated.

Relevant work package: https://community.openproject.org/work_packages/21277
pull/3372/head
Oliver Günther 9 years ago
parent a5e625cb4a
commit 3ccde73519
  1. 20
      app/assets/javascripts/settings.js.erb
  2. 2
      app/controllers/repositories_controller.rb
  3. 17
      app/models/enabled_module.rb
  4. 17
      app/views/settings/_repositories.html.erb
  5. 5
      config/locales/en.yml
  6. 5
      config/settings.yml
  7. 5
      lib/open_project/scm/manager.rb
  8. 56
      spec/legacy/unit/enabled_module_spec.rb
  9. 148
      spec/models/enabled_module_spec.rb

@ -27,8 +27,18 @@ See doc/COPYRIGHT.rdoc for more details.
++#%>
jQuery(document).ready(function($) {
$('#settings_session_ttl_enabled').on('change', function(){
$('#settings_session_ttl_container').toggle($(this).is(':checked'));
}).trigger('change');
});
(function($) {
$(function() {
$('#settings_session_ttl_enabled').on('change', function(){
$('#settings_session_ttl_container').toggle($(this).is(':checked'));
}).trigger('change');
$('#settings_repositories_automatic_managed_repos').change(function() {
var checked = this.checked;
$('#settings_repositories_automatic_managed_vendor').prop('disabled', function() {
return !checked;
})
});
});
}(jQuery));

@ -45,8 +45,8 @@ class RepositoriesController < ApplicationController
default_search_scope :changesets
before_filter :find_project_by_project_id
before_filter :find_repository, except: [:edit, :update, :create, :destroy, :destroy_info]
before_filter :authorize
before_filter :find_repository, except: [:edit, :update, :create, :destroy, :destroy_info]
accept_key_auth :revisions
rescue_from OpenProject::Scm::Exceptions::ScmError, with: :show_error_command_failed

@ -47,6 +47,23 @@ class EnabledModule < ActiveRecord::Base
if project && project.wiki.nil?
Wiki.create(project: project, start_page: 'Wiki')
end
when 'repository'
if project &&
project.repository.nil? &&
Setting.repositories_automatic_managed_repos?
create_managed_repository
end
end
end
def create_managed_repository
params = {
scm_vendor: Setting.repositories_automatic_managed_vendor,
scm_type: Repository.managed_type
}
service = Scm::RepositoryFactoryService.new(project,
ActionController::Parameters.new(params))
service.build_and_save
end
end

@ -51,6 +51,23 @@ See doc/COPYRIGHT.rdoc for more details.
<div class="form--field"><%= setting_text_field :repository_log_display_limit, :size => 6 %></div>
<div class="form--field"><%= setting_check_box :repository_authentication_caching_enabled %></div>
</section>
<fieldset class="form--fieldset"><legend class="form--fieldset-legend"><%= l('repositories.settings.automatic_managed_repos') %></legend>
<div class="form--field"><%= setting_check_box :repositories_automatic_managed_repos %></div>
<div class="form--field">
<%= styled_label_tag :repositories_automatic_managed_vendor, l(:setting_repositories_automatic_managed_vendor) %>
<div class="form--field-container">
<%= setting_select :repositories_automatic_managed_vendor,
[[
"--- #{l(:actionview_instancetag_blank_option)} ---",
'',
{ disabled: true, selected: true }
]] + OpenProject::Scm::Manager.manageable,
disabled: !Setting.repositories_automatic_managed_repos?,
required: true,
label: false %>
</div>
</div>
</fieldset>
<fieldset class="form--fieldset"><legend class="form--fieldset-legend"><%= l(:text_work_packages_ref_in_commit_messages) %></legend>
<div class="form--field">
<%= setting_text_field :commit_ref_keywords, :size => 30 %>

@ -1309,6 +1309,9 @@ en:
path: "Path to Git repository"
path_encoding: "Path encoding"
go_to_revision: "Go to revision"
settings:
automatic_managed_repos: "Automatic creation of managed repositories"
automatic_managed_repos_text: "With the following configuration options, you can automatically create a managed repository of the selected vendor whenever a new project is created."
scm_vendor: "Source control management system"
scm_type: "Repository type"
scm_types:
@ -1393,6 +1396,8 @@ en:
setting_per_page_options: "Objects per page options"
setting_plain_text_mail: "Plain text mail (no HTML)"
setting_protocol: "Protocol"
setting_repositories_automatic_managed_repos: "Setup managed repositories on project creation"
setting_repositories_automatic_managed_vendor: "Automatic repository vendor type"
setting_repositories_encodings: "Repositories encodings"
setting_repository_authentication_caching_enabled: "Enable caching for authentication request of version control software"
setting_repository_log_display_limit: "Maximum number of revisions displayed on file log"

@ -137,6 +137,11 @@ sys_api_key:
default: ''
repository_authentication_caching_enabled:
default: 1
repositories_automatic_managed_repos:
default: 0
format: bool
repositories_automatic_managed_vendor:
default: ''
commit_ref_keywords:
default: 'refs,references,IssueID'
commit_fix_keywords:

@ -46,6 +46,11 @@ module OpenProject
registered.select { |scm| Setting.enabled_scm.include?(scm) }
end
# Return all manageable vendors
def manageable
enabled.select { |_, vendor| vendor.manageable? }.keys
end
# Add a new SCM adapter and repository
def add(scm_name)
# Force model lookup to avoid

@ -1,56 +0,0 @@
#-- encoding: UTF-8
#-- copyright
# OpenProject is a project management system.
# Copyright (C) 2012-2015 the OpenProject Foundation (OPF)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
require 'legacy_spec_helper'
describe EnabledModule do
it 'should enabling_wiki_should_create_a_wiki' do
CustomField.delete_all
FactoryGirl.create(:type_standard)
project = Project.create!(name: 'Project with wiki', identifier: 'wikiproject')
assert_nil project.wiki
project.enabled_module_names = ['wiki']
wiki = FactoryGirl.create :wiki, project: project
project.reload
assert_not_nil project.wiki
assert_equal 'Wiki', project.wiki.start_page
end
it 'should reenabling_wiki_should_not_create_another_wiki' do
project = FactoryGirl.create :project
wiki = FactoryGirl.create :wiki, project: project
project.reload
assert_not_nil project.wiki
project.enabled_module_names = []
project.reload
assert_no_difference 'Wiki.count' do
project.enabled_module_names = ['wiki']
end
assert_not_nil project.wiki
end
end

@ -0,0 +1,148 @@
#-- encoding: UTF-8
#-- copyright
# OpenProject is a project management system.
# Copyright (C) 2012-2015 the OpenProject Foundation (OPF)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
require 'spec_helper'
describe EnabledModule, type: :model do
# Force reload, as association is not always(?) showing
let(:project) { FactoryGirl.create(:project, enabled_module_names: modules).reload }
describe '#wiki' do
let(:modules) { %w[wiki] }
it 'creates a wiki' do
expect(project.wiki).not_to be_nil
expect(project.wiki.start_page).to eq('Wiki')
end
it 'should not create a separate wiki when one exists already' do
expect(project.wiki).to_not be_nil
expect {
project.enabled_module_names = []
project.reload
}.to_not change { Wiki.count }
expect {
project.enabled_module_names = ['wiki']
}.to_not change { Wiki.count }
expect(project.wiki).to_not be_nil
end
context 'with disabled module' do
let(:modules) { [] }
it 'does not create a wiki' do
expect(project.wiki).to be_nil
end
it 'creates a wiki when the module is enabled at a later time' do
project.enabled_module_names = ['wiki']
project.reload
expect(project.wiki).to_not be_nil
expect(project.wiki.start_page).to eq('Wiki')
end
end
end
describe '#repository' do
let(:modules) { %w[repository] }
let(:vendor) { nil }
before do
allow(Setting).to receive(:repositories_automatic_managed_repos?).and_return(setting)
allow(Setting).to receive(:repositories_automatic_managed_vendor).and_return(vendor)
end
shared_examples 'does not create a repository when one exists' do
let!(:repository) { FactoryGirl.create(:repository_git, project: project) }
it 'should not create a separate repository when one exists already' do
project.reload
expect(project.repository).to_not be_nil
expect {
project.enabled_module_names = []
project.reload
}.to_not change { Repository.count }
expect {
project.enabled_module_names = ['repository']
}.to_not change { Repository.count }
expect(project.repository).to_not be_nil
end
end
context 'with disabled setting' do
let(:setting) { false }
it 'does not create a repository' do
expect(project.repository).to be_nil
end
it_behaves_like 'does not create a repository when one exists'
end
context 'with enabled setting' do
let(:setting) { true }
let(:vendor) { 'Git' }
before do
allow(Setting).to receive(:enabled_scm).and_return(['Git'])
end
it 'creates a repository of the given vendor' do
expect(project.repository).not_to be_nil
expect(project.repository.vendor).to eq('Git')
expect(project.repository.managed?).to be true
end
it 'does not remove the repository when setting is removed' do
project.enabled_module_names = []
project.reload
expect(project.repository).not_to be_nil
end
it_behaves_like 'does not create a repository when one exists'
end
context 'with invalid setting' do
let(:setting) { true }
let(:vendor) { 'some weird vendor' }
it 'does not create a repository' do
expect(project.repository).to be_nil
end
end
end
end
Loading…
Cancel
Save