From d075df56d3cfb15a5d11550d86229f5b8001fbe7 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Sun, 30 Dec 2012 14:26:19 +0200
Subject: [PATCH] Improve perfomance of removeing group

---
 app/controllers/admin/groups_controller.rb |  2 ++
 app/models/group.rb                        |  4 ++++
 app/models/users_project.rb                | 19 +++++++++++++++++++
 app/roles/team.rb                          |  3 ++-
 4 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb
index 54c69138a3a58..90dbda3eeeafb 100644
--- a/app/controllers/admin/groups_controller.rb
+++ b/app/controllers/admin/groups_controller.rb
@@ -73,6 +73,8 @@ def project_teams_update
   end
 
   def destroy
+    @group.truncate_teams
+
     @group.destroy
 
     redirect_to admin_groups_path, notice: 'Group was successfully deleted.'
diff --git a/app/models/group.rb b/app/models/group.rb
index f16c70a686408..8ba92980a9b2e 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -29,4 +29,8 @@ def users
   def human_name
     name
   end
+
+  def truncate_teams
+    UsersProject.truncate_teams(project_ids)
+  end
 end
diff --git a/app/models/users_project.rb b/app/models/users_project.rb
index 23b83f5203dac..b8aacb329537a 100644
--- a/app/models/users_project.rb
+++ b/app/models/users_project.rb
@@ -56,6 +56,25 @@ def add_users_into_projects(project_ids, user_ids, project_access)
       false
     end
 
+    def truncate_teams(project_ids)
+      UsersProject.transaction do
+        users_projects = UsersProject.where(project_id: project_ids)
+        users_projects.each do |users_project|
+          users_project.skip_git = true
+          users_project.destroy
+        end
+        Gitlab::Gitolite.new.update_repositories(Project.where(id: project_ids))
+      end
+
+      true
+    rescue
+      false
+    end
+
+    def truncate_team project
+      truncate_teams [project.id]
+    end
+
     def import_team(source_project, target_project)
       source_team = source_project.users_projects.all
       target_team = target_project.users_projects.all
diff --git a/app/roles/team.rb b/app/roles/team.rb
index 0e4312445900c..a228e2176a4c4 100644
--- a/app/roles/team.rb
+++ b/app/roles/team.rb
@@ -47,7 +47,8 @@ def delete_users_ids_from_team(users_ids)
     UsersProject.bulk_delete(self, users_ids)
   end
 
+  # Remove all users from project team
   def truncate_team
-    UsersProject.bulk_delete(self, self.users.map(&:id))
+    UsersProject.truncate_team(self)
   end
 end
-- 
GitLab