From 2df1024b9b55d5d150ebf042f56fb93596d0836c Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Mon, 27 Apr 2015 00:16:08 +0200 Subject: [PATCH] Added Rake task to remove duplicate screenshots --- lib/tasks/remove_image_duplicates.rake | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 lib/tasks/remove_image_duplicates.rake diff --git a/lib/tasks/remove_image_duplicates.rake b/lib/tasks/remove_image_duplicates.rake new file mode 100644 index 0000000..b606fef --- /dev/null +++ b/lib/tasks/remove_image_duplicates.rake @@ -0,0 +1,31 @@ +namespace :debshots do + desc "Remove duplicate images" + + task :remove_duplicate_images => :environment do + Rails.logger = Logger.new(STDOUT) + Rails.logger.level = Logger::INFO + #Rails.logger.level = Logger::DEBUG + + Rails.logger.info "Removing packages with 'nil' screenshots" + + Screenshot.where(image_fingerprint: nil).each do |ss| + Rails.logger.info "Destroying screenshots #{ss.id} of package #{ss.package.name} that has nil data" + ss.destroy + end + + Rails.logger.info "Removing packages with duplicate screenshot checksums" + + loop do + destroyed = 0 + Screenshot.select(:package_id, :image_fingerprint).group(:package_id, :image_fingerprint).having("count(*) > 1").each do |ss| + # Look again for screenshots of this fingerprint. + # This extra step may seem stupid but the above query lead to package_id=NULL results sometimes. + del = Screenshot.find_by(image_fingerprint: ss.image_fingerprint) + Rails.logger.info "Destroying duplicate screenshots #{del.id} of package #{del.package.name}" + del.destroy + destroyed += 1 + end + break if destroyed == 0 + end + end +end