BigW Consortium Gitlab

uploads.rake 1.18 KB
Newer Older
1 2 3 4
namespace :gitlab do
  namespace :uploads do
    desc 'GitLab | Uploads | Check integrity of uploaded files'
    task check: :environment do
5
      puts 'Checking integrity of uploaded files'
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

      uploads_batches do |batch|
        batch.each do |upload|
          puts "- Checking file (#{upload.id}): #{upload.absolute_path}".color(:green)

          if upload.exist?
            check_checksum(upload)
          else
            puts "  * File does not exist on the file system".color(:red)
          end
        end
      end

      puts 'Done!'
    end

    def batch_size
      ENV.fetch('BATCH', 200).to_i
    end

    def calculate_checksum(absolute_path)
      Digest::SHA256.file(absolute_path).hexdigest
    end

    def check_checksum(upload)
      checksum = calculate_checksum(upload.absolute_path)

      if checksum != upload.checksum
        puts "  * File checksum (#{checksum}) does not match the one in the database (#{upload.checksum})".color(:red)
      end
    end

    def uploads_batches(&block)
      Upload.all.in_batches(of: batch_size, start: ENV['ID_FROM'], finish: ENV['ID_TO']) do |relation| # rubocop: disable Cop/InBatches
        yield relation
      end
    end
  end
end