summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2008-07-13 21:55:13 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2008-07-13 21:55:13 +0000
commitfc07ba2a99fd7610f33de44e529ac7e518f48586 (patch)
tree890874d846bf86c7b53586f706c41031945f86af
parent0eba42423af05a5507b8b1889b6904d5d5a5f79c (diff)
downloadredmine-fc07ba2a99fd7610f33de44e529ac7e518f48586.tar.gz
redmine-fc07ba2a99fd7610f33de44e529ac7e518f48586.zip
Clear changesets and changes with raw sql when deleting a repository (#1627).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1666 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/models/repository.rb11
-rw-r--r--test/unit/repository_test.rb10
2 files changed, 20 insertions, 1 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 2a8728f92..9768e3e3c 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -17,9 +17,13 @@
class Repository < ActiveRecord::Base
belongs_to :project
- has_many :changesets, :dependent => :destroy, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"
+ has_many :changesets, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"
has_many :changes, :through => :changesets
+ # Raw SQL to delete changesets and changes in the database
+ # has_many :changesets, :dependent => :destroy is too slow for big repositories
+ before_destroy :clear_changesets
+
# Checks if the SCM is enabled when creating a repository
validate_on_create { |r| r.errors.add(:type, :activerecord_error_invalid) unless Setting.enabled_scm.include?(r.class.name.demodulize) }
@@ -127,4 +131,9 @@ class Repository < ActiveRecord::Base
root_url.strip!
true
end
+
+ def clear_changesets
+ connection.delete("DELETE FROM changes WHERE changes.changeset_id IN (SELECT changesets.id FROM changesets WHERE changesets.repository_id = #{id})")
+ connection.delete("DELETE FROM changesets WHERE changesets.repository_id = #{id}")
+ end
end
diff --git a/test/unit/repository_test.rb b/test/unit/repository_test.rb
index 03d836ef7..9ea9fdd45 100644
--- a/test/unit/repository_test.rb
+++ b/test/unit/repository_test.rb
@@ -45,6 +45,16 @@ class RepositoryTest < Test::Unit::TestCase
assert_equal repository, project.repository
end
+ def test_destroy
+ changesets = Changeset.count(:all, :conditions => "repository_id = 10")
+ changes = Change.count(:all, :conditions => "repository_id = 10", :include => :changeset)
+ assert_difference 'Changeset.count', -changesets do
+ assert_difference 'Change.count', -changes do
+ Repository.find(10).destroy
+ end
+ end
+ end
+
def test_should_not_create_with_disabled_scm
# disable Subversion
Setting.enabled_scm = ['Darcs', 'Git']