scm: git: fix creating and updating repository

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9616 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Toshi MARUYAMA 2012-05-03 11:48:33 +00:00
parent 36ee2b24bd
commit 2c28d6b5d1
3 changed files with 53 additions and 24 deletions

View File

@ -46,7 +46,11 @@ class RepositoriesController < ApplicationController
end end
def create def create
@repository = Repository.factory(params[:repository_scm], params[:repository]) attrs = pickup_extra_info
@repository = Repository.factory(params[:repository_scm], attrs[:attrs])
if attrs[:attrs_extra].keys.any?
@repository.merge_extra_info(attrs[:attrs_extra])
end
@repository.project = @project @repository.project = @project
if request.post? && @repository.save if request.post? && @repository.save
redirect_to settings_project_path(@project, :tab => 'repositories') redirect_to settings_project_path(@project, :tab => 'repositories')
@ -59,7 +63,11 @@ class RepositoriesController < ApplicationController
end end
def update def update
@repository.attributes = params[:repository] attrs = pickup_extra_info
@repository.attributes = attrs[:attrs]
if attrs[:attrs_extra].keys.any?
@repository.merge_extra_info(attrs[:attrs_extra])
end
@repository.project = @project @repository.project = @project
if request.put? && @repository.save if request.put? && @repository.save
redirect_to settings_project_path(@project, :tab => 'repositories') redirect_to settings_project_path(@project, :tab => 'repositories')
@ -68,6 +76,20 @@ class RepositoriesController < ApplicationController
end end
end end
def pickup_extra_info
p = {}
p_extra = {}
params[:repository].each do |k, v|
if k =~ /^extra_/
p_extra[k] = v
else
p[k] = v
end
end
{:attrs => p, :attrs_extra => p_extra}
end
private :pickup_extra_info
def committers def committers
@committers = @repository.committers @committers = @repository.committers
@users = @project.users @users = @project.users

View File

@ -56,28 +56,6 @@ class Repository < ActiveRecord::Base
super(attr_name, *args) super(attr_name, *args)
end end
alias :attributes_without_extra_info= :attributes=
def attributes=(new_attributes)
return if new_attributes.nil?
attributes = new_attributes.dup
attributes.stringify_keys!
p = {}
p_extra = {}
attributes.each do |k, v|
if k =~ /^extra_/
p_extra[k] = v
else
p[k] = v
end
end
send :attributes_without_extra_info=, p
if p_extra.keys.any?
merge_extra_info(p_extra)
end
end
# Removes leading and trailing whitespace # Removes leading and trailing whitespace
def url=(arg) def url=(arg)
write_attribute(:url, arg ? arg.to_s.strip : nil) write_attribute(:url, arg ? arg.to_s.strip : nil)

View File

@ -57,6 +57,35 @@ class RepositoriesGitControllerTest < ActionController::TestCase
Setting.default_language = 'en' Setting.default_language = 'en'
end end
def test_create_and_update
@request.session[:user_id] = 1
assert_difference 'Repository.count' do
post :create, :project_id => 'subproject1',
:repository_scm => 'Git',
:repository => {
:url => '/test',
:is_default => '0',
:identifier => 'test-create',
:extra_report_last_commit => '1',
}
end
assert_response 302
repository = Repository.first(:order => 'id DESC')
assert_kind_of Repository::Git, repository
assert_equal '/test', repository.url
assert_equal true, repository.extra_report_last_commit
put :update, :id => repository.id,
:repository => {
:extra_report_last_commit => '0',
:identifier => 'test-update',
}
assert_response 302
repo2 = Repository.find(repository.id)
assert_equal 'test-update', repo2.identifier
assert_equal false, repo2.extra_report_last_commit
end
if File.directory?(REPOSITORY_PATH) if File.directory?(REPOSITORY_PATH)
def test_get_new def test_get_new
@request.session[:user_id] = 1 @request.session[:user_id] = 1