Welcome to mirror list, hosted at ThFree Co, Russian Federation.

local.rb « uploads « models « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: bd295a6683868656c08765d44606bc34cf2d52b7 (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
45
46
47
48
49
50
51
52
53
54
55
56
57
# frozen_string_literal: true

module Uploads
  class Local < Base
    def keys(relation)
      relation.includes(:model).find_each.map(&:absolute_path)
    end

    def delete_keys(keys)
      keys.each do |path|
        delete_file(path)
      end
    end

    private

    def delete_file(path)
      unless exists?(path)
        logger.warn("File '#{path}' doesn't exist, skipping")
        return
      end

      unless in_uploads?(path)
        message = "Path '#{path}' is not in uploads dir, skipping"
        logger.warn(message)
        Gitlab::ErrorTracking.track_and_raise_for_dev_exception(
          RuntimeError.new(message), uploads_dir: storage_dir)
        return
      end

      FileUtils.rm(path)
      delete_dir!(File.dirname(path))
    end

    def exists?(path)
      path.present? && File.exist?(path)
    end

    def in_uploads?(path)
      path.start_with?(storage_dir)
    end

    def delete_dir!(path)
      Dir.rmdir(path)
    rescue Errno::ENOENT
      # Ignore: path does not exist
    rescue Errno::ENOTDIR
      # Ignore: path is not a dir
    rescue Errno::ENOTEMPTY, Errno::EEXIST
      # Ignore: dir is not empty
    end

    def storage_dir
      @storage_dir ||= File.realpath(Gitlab.config.uploads.storage_path)
    end
  end
end