From 5586ff5784a917840c7069e70a521e13e66749c1 Mon Sep 17 00:00:00 2001
From: Yorick Peterse <yorickpeterse@gmail.com>
Date: Tue, 22 Nov 2016 13:12:23 +0100
Subject: [PATCH] Handle orphans when removing soft deleted groups

There may be more tables but these were the tables that were problematic
for GitLab.com due to foreign key constraints (without cascading
deletes).
---
 .../20161117114805_remove_undeleted_groups.rb | 41 +++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/db/migrate/20161117114805_remove_undeleted_groups.rb b/db/migrate/20161117114805_remove_undeleted_groups.rb
index ebc2d974ae0..696914f8e4d 100644
--- a/db/migrate/20161117114805_remove_undeleted_groups.rb
+++ b/db/migrate/20161117114805_remove_undeleted_groups.rb
@@ -5,6 +5,47 @@ class RemoveUndeletedGroups < ActiveRecord::Migration
   DOWNTIME = false
 
   def up
+    execute <<-EOF.strip_heredoc
+    DELETE FROM projects
+    WHERE namespace_id IN (
+      SELECT id FROM (
+        SELECT id
+        FROM namespaces
+        WHERE deleted_at IS NOT NULL
+      ) namespace_ids
+    );
+    EOF
+
+    if defined?(Gitlab::License)
+      # EE adds these columns but we have to make sure this data is cleaned up
+      # here before we run the DELETE below. An alternative would be patching
+      # this migration in EE but this will only result in a mess and confusing
+      # migrations.
+      execute <<-EOF.strip_heredoc
+      DELETE FROM protected_branch_push_access_levels
+      WHERE group_id IN (
+        SELECT id FROM (
+          SELECT id
+          FROM namespaces
+          WHERE deleted_at IS NOT NULL
+        ) namespace_ids
+      );
+      EOF
+
+      execute <<-EOF.strip_heredoc
+      DELETE FROM protected_branch_merge_access_levels
+      WHERE group_id IN (
+        SELECT id FROM (
+          SELECT id
+          FROM namespaces
+          WHERE deleted_at IS NOT NULL
+        ) namespace_ids
+      );
+      EOF
+    end
+
+    # This removes namespaces that were supposed to be soft deleted but still
+    # reside in the database.
     execute "DELETE FROM namespaces WHERE deleted_at IS NOT NULL;"
   end
 
-- 
GitLab