]> source.dussan.org Git - redmine.git/commitdiff
scm: git: fix creating and updating repository
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Thu, 3 May 2012 11:48:33 +0000 (11:48 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Thu, 3 May 2012 11:48:33 +0000 (11:48 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9616 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/repositories_controller.rb
app/models/repository.rb
test/functional/repositories_git_controller_test.rb

index f02bd8b70c4bf83a3490039df7bdfad0d89d40ec..1fb708355f903c9ab6dae36375a5468c2a126f44 100644 (file)
@@ -46,7 +46,11 @@ class RepositoriesController < ApplicationController
   end
 
   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
     if request.post? && @repository.save
       redirect_to settings_project_path(@project, :tab => 'repositories')
@@ -59,7 +63,11 @@ class RepositoriesController < ApplicationController
   end
 
   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
     if request.put? && @repository.save
       redirect_to settings_project_path(@project, :tab => 'repositories')
@@ -68,6 +76,20 @@ class RepositoriesController < ApplicationController
     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
     @committers = @repository.committers
     @users = @project.users
index 7efbc0c26a2f7c41d41ca25b093ee1144ec96449..b0bf0d2a771b0c9025f1790dc9945a253f759459 100644 (file)
@@ -56,28 +56,6 @@ class Repository < ActiveRecord::Base
     super(attr_name, *args)
   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
   def url=(arg)
     write_attribute(:url, arg ? arg.to_s.strip : nil)
index da82f9026f2d49f61105a93a3d20cb02da6d87c9..860d436fecbe6185ca419ad23f0488ff1c0d1dc2 100644 (file)
@@ -57,6 +57,35 @@ class RepositoriesGitControllerTest < ActionController::TestCase
     Setting.default_language = 'en'
   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)
     def test_get_new
       @request.session[:user_id] = 1