summaryrefslogtreecommitdiff
path: root/db/post_migrate/20170502101023_clean_up_pending_delete_projects.rb
blob: dd812964902b0a1cce4e01c623f71a8fe29cb6d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.

class CleanUpPendingDeleteProjects < ActiveRecord::Migration
  include Gitlab::Database::MigrationHelpers

  DOWNTIME = false

  disable_ddl_transaction!

  def up
    Project.unscoped.where(pending_delete: true).each { |project| delete_project(project, admin) }
  end

  def down
    # noop
  end

  private

  def delete_project(project)
    project.team.truncate

    unlink_fork(project) if project.forked?

    [:events, :issues, :merge_requests, :labels, :milestones, :notes, :snippets].each do |thing|
      project.send(thing).delete_all
    end

    # Override Project#remove_pages for this instance so it doesn't do anything
    def project.remove_pages
    end

    project.destroy!
  end

  def unlink_fork(project)
    merge_requests = project.forked_from_project.merge_requests.opened.from_project(project)

    merge_requests.update_all(state: 'closed')

    project.forked_project_link.destroy
  end
end