1
|
|
|
<?php declare(strict_types=1); |
2
|
|
|
|
3
|
|
|
namespace Shopware\Psh\Config; |
4
|
|
|
|
5
|
|
|
class ConfigMerger |
6
|
|
|
{ |
7
|
|
|
/** |
8
|
|
|
* @param Config $config |
9
|
|
|
* @param Config|null $override |
10
|
|
|
* @return Config |
11
|
|
|
*/ |
12
|
|
|
public function merge(Config $config, Config $override = null): Config |
13
|
|
|
{ |
14
|
|
|
if ($override === null) { |
15
|
|
|
return $config; |
16
|
|
|
} |
17
|
|
|
|
18
|
|
|
$header = $config->getHeader(); |
19
|
|
|
$defaultEnvironment = $config->getDefaultEnvironment(); |
20
|
|
|
$environments = $config->getEnvironments(); |
21
|
|
|
|
22
|
|
|
if ($override->getHeader()) { |
23
|
|
|
$header = $override->getHeader(); |
24
|
|
|
} |
25
|
|
|
|
26
|
|
|
if ($override->getEnvironments()) { |
27
|
|
|
$environments = $this->mergeConfigEnvironments($config, $override); |
28
|
|
|
} |
29
|
|
|
|
30
|
|
|
if ($override->getDefaultEnvironment()) { |
31
|
|
|
$defaultEnvironment = $override->getDefaultEnvironment(); |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
return new Config($header, $defaultEnvironment, $environments, $config->getParams()); |
35
|
|
|
} |
36
|
|
|
|
37
|
|
|
/** |
38
|
|
|
* @param Config $config |
39
|
|
|
* @param Config $override |
40
|
|
|
* @return array |
41
|
|
|
*/ |
42
|
|
|
private function mergeConfigEnvironments(Config $config, Config $override): array |
43
|
|
|
{ |
44
|
|
|
$environments = []; |
45
|
|
|
|
46
|
|
|
$foundEnvironments = array_keys(array_merge($config->getEnvironments(), $override->getEnvironments())); |
47
|
|
|
|
48
|
|
|
foreach ($foundEnvironments as $name) { |
49
|
|
View Code Duplication |
if (!isset($override->getEnvironments()[$name])) { |
|
|
|
|
50
|
|
|
$environments[$name] = $config->getEnvironments()[$name]; |
51
|
|
|
|
52
|
|
|
continue; |
53
|
|
|
} |
54
|
|
|
|
55
|
|
View Code Duplication |
if (!isset($config->getEnvironments()[$name])) { |
|
|
|
|
56
|
|
|
$environments[$name] = $override->getEnvironments()[$name]; |
57
|
|
|
|
58
|
|
|
continue; |
59
|
|
|
} |
60
|
|
|
|
61
|
|
|
$environments[$name] = $this |
62
|
|
|
->mergeEnvironments($config->getEnvironments()[$name], $override->getEnvironments()[$name]); |
63
|
|
|
} |
64
|
|
|
|
65
|
|
|
return $environments; |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
private function mergeEnvironments(ConfigEnvironment $original, ConfigEnvironment $override): ConfigEnvironment |
69
|
|
|
{ |
70
|
|
|
return new ConfigEnvironment( |
71
|
|
|
$this->overrideHidden($original, $override), |
72
|
|
|
$this->overrideScriptsPaths($original, $override), |
73
|
|
|
$this->mergeDynamicVariables($original, $override), |
74
|
|
|
$this->mergeConstants($original, $override), |
75
|
|
|
$this->overrideTemplates($original, $override), |
76
|
|
|
$this->mergeDotenvPaths($original, $override) |
77
|
|
|
); |
78
|
|
|
} |
79
|
|
|
|
80
|
|
|
/** |
81
|
|
|
* @param ConfigEnvironment $configEnvironment |
82
|
|
|
* @param ConfigEnvironment $overrideEnv |
83
|
|
|
* @return array |
84
|
|
|
*/ |
85
|
|
|
private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array |
86
|
|
|
{ |
87
|
|
|
return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables()); |
88
|
|
|
} |
89
|
|
|
|
90
|
|
|
/** |
91
|
|
|
* @param ConfigEnvironment $configEnvironment |
92
|
|
|
* @param ConfigEnvironment $overrideConfigEnv |
93
|
|
|
* @return ScriptsPath[] |
94
|
|
|
*/ |
95
|
|
|
private function mergeDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array |
96
|
|
|
{ |
97
|
|
|
return array_merge($configEnvironment->getDotenvPaths(), $overrideConfigEnv->getDotenvPaths()); |
98
|
|
|
} |
99
|
|
|
|
100
|
|
|
/** |
101
|
|
|
* @param ConfigEnvironment $configEnvironment |
102
|
|
|
* @param ConfigEnvironment $overrideConfigEnv |
103
|
|
|
* @return ScriptsPath[] |
104
|
|
|
*/ |
105
|
|
|
private function overrideScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array |
106
|
|
|
{ |
107
|
|
|
if ($overrideConfigEnv->getAllScriptsPaths()) { |
108
|
|
|
return $overrideConfigEnv->getAllScriptsPaths(); |
109
|
|
|
} |
110
|
|
|
|
111
|
|
|
return $configEnvironment->getAllScriptsPaths(); |
112
|
|
|
} |
113
|
|
|
|
114
|
|
|
/** |
115
|
|
|
* @param ConfigEnvironment $configEnvironment |
116
|
|
|
* @param ConfigEnvironment $overrideConfigEnv |
117
|
|
|
* @return array |
118
|
|
|
*/ |
119
|
|
|
private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array |
120
|
|
|
{ |
121
|
|
|
return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants()); |
122
|
|
|
} |
123
|
|
|
|
124
|
|
|
/** |
125
|
|
|
* @param ConfigEnvironment $configEnvironment |
126
|
|
|
* @param $overrideConfigEnv |
127
|
|
|
* @return array |
128
|
|
|
*/ |
129
|
|
|
private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array |
130
|
|
|
{ |
131
|
|
|
if ($overrideConfigEnv->getTemplates()) { |
132
|
|
|
return $overrideConfigEnv->getTemplates(); |
133
|
|
|
} |
134
|
|
|
|
135
|
|
|
return $configEnvironment->getTemplates(); |
136
|
|
|
} |
137
|
|
|
|
138
|
|
|
private function overrideHidden(ConfigEnvironment $originalConfigEnv, ConfigEnvironment $overrideEnv): bool |
139
|
|
|
{ |
140
|
|
|
if ($overrideEnv->isHidden()) { |
141
|
|
|
return true; |
142
|
|
|
} |
143
|
|
|
|
144
|
|
|
return $originalConfigEnv->isHidden(); |
145
|
|
|
} |
146
|
|
|
} |
147
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.