Sha256: 0fd3c6fb207689b3691c4b975839bd44cde1cc480abc8f328666c98a9d723888

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

class DeleteDuplicateCommits < ActiveRecord::Migration
  def up
    commits_by_sha = Hash.new { |hash, sha| hash[sha] = [] }
    select_rows("SELECT id, sha FROM commits").each do |(id, sha)|
      commits_by_sha[sha].push(id)
    end
    commits_by_sha.keep_if { |sha, ids| ids.length > 1 }
    
    puts "\e[33;1m#{Commit.count}\e[0;33m commits total; \e[1m#{commits_by_sha.values.flatten.count}\e[0;33m share \e[1m#{commits_by_sha.keys.count}\e[0;33m shas\e[0m"
    
    ids_to_delete = []
    commits_by_sha.each do |sha, ids|
      release_ids = select_values("SELECT release_id FROM commits_releases WHERE commit_id IN (#{ids.join(", ")})").uniq
      ticket_ids = select_values("SELECT ticket_id FROM commits_tickets WHERE commit_id IN (#{ids.join(", ")})").uniq
      committer_ids = select_values("SELECT user_id FROM commits_users WHERE commit_id IN (#{ids.join(", ")})").uniq
      
      id_to_keep = ids.shift
      ids_to_delete.concat ids
      
      commit = Commit.find(id_to_keep)
      commit.release_ids = Release.where(id: release_ids).pluck(:id)
      commit.ticket_ids = Ticket.where(id: ticket_ids).pluck(:id)
      commit.committer_ids = User.where(id: committer_ids).pluck(:id)
    end
    
    execute "DELETE FROM commits WHERE commits.id IN (#{ids_to_delete.join(", ")})" if ids_to_delete.any?
    
    puts "\e[33;1m#{Commit.count}\e[0;33m commits left\e[0m"
  end
  
  def down
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
houston-core-0.5.0.beta1 db/migrate/20131112010815_delete_duplicate_commits.rb