summaryrefslogtreecommitdiff
path: root/lib/gitlab/import_export/config.rb
blob: f6cd4eb5e0c06b9286d598afd3e0f0d43ecddf99 (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# frozen_string_literal: true

module Gitlab
  module ImportExport
    class Config
      # Returns a Hash of the YAML file, including EE specific data if EE is
      # used.
      def to_h
        hash = parse_yaml
        ee_hash = hash['ee']

        if merge? && ee_hash
          ee_hash.each do |key, value|
            if key == 'project_tree'
              merge_project_tree(value, hash[key])
            else
              merge_attributes_list(value, hash[key])
            end
          end
        end

        # We don't want to expose this section after this point, as it is no
        # longer needed.
        hash.delete('ee')

        hash
      end

      # Merges a project relationships tree into the target tree.
      #
      # @param [Array<Hash|Symbol>] source_values
      # @param [Array<Hash|Symbol>] target_values
      def merge_project_tree(source_values, target_values)
        source_values.each do |value|
          if value.is_a?(Hash)
            # Examples:
            #
            # { 'project_tree' => [{ 'labels' => [...] }] }
            # { 'notes' => [:author, { 'events' => [:push_event_payload] }] }
            value.each do |key, val|
              target = target_values
                .find { |h| h.is_a?(Hash) && h[key] }

              if target
                merge_project_tree(val, target[key])
              else
                target_values << { key => val.dup }
              end
            end
          else
            # Example: :priorities, :author, etc
            target_values << value
          end
        end
      end

      # Merges a Hash containing a flat list of attributes, such as the entries
      # in a `excluded_attributes` section.
      #
      # @param [Hash] source_values
      # @param [Hash] target_values
      def merge_attributes_list(source_values, target_values)
        source_values.each do |key, values|
          target_values[key] ||= []
          target_values[key].concat(values)
        end
      end

      def merge?
        Gitlab.ee?
      end

      def parse_yaml
        YAML.load_file(Gitlab::ImportExport.config_file)
      end
    end
  end
end