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
|