mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-11 05:39:41 +02:00
This was needed since when we have job-defaults and later on a test set for
``
run-on-projects:
by-test-platform:
...
``
We were ending up with both the list of by-* being extended but also
any array in that list also being extended (like `default: ['a', 'b']`
was getting extended to also have the new values for default)
This is not only usually wrong but very very likely not what the author wanted.
Differential Revision: https://phabricator.services.mozilla.com/D22708
--HG--
extra : moz-landing-system : lando
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
|
|
import copy
|
|
|
|
|
|
def merge_to(source, dest):
|
|
'''
|
|
Merge dict and arrays (override scalar values)
|
|
|
|
Keys from source override keys from dest, and elements from lists in source
|
|
are appended to lists in dest.
|
|
|
|
:param dict source: to copy from
|
|
:param dict dest: to copy to (modified in place)
|
|
'''
|
|
|
|
for key, value in source.items():
|
|
if isinstance(value, dict) and len(value) == 1 and \
|
|
value.keys()[0].startswith('by-'):
|
|
# Do not merge by-* values as this is likely to confuse someone
|
|
dest[key] = value
|
|
continue
|
|
|
|
# Override mismatching or empty types
|
|
if type(value) != type(dest.get(key)): # noqa
|
|
dest[key] = source[key]
|
|
continue
|
|
|
|
# Merge dict
|
|
if isinstance(value, dict):
|
|
merge_to(value, dest[key])
|
|
continue
|
|
|
|
if isinstance(value, list):
|
|
dest[key] = dest[key] + source[key]
|
|
continue
|
|
|
|
dest[key] = source[key]
|
|
|
|
return dest
|
|
|
|
|
|
def merge(*objects):
|
|
'''
|
|
Merge the given objects, using the semantics described for merge_to, with
|
|
objects later in the list taking precedence. From an inheritance
|
|
perspective, "parents" should be listed before "children".
|
|
|
|
Returns the result without modifying any arguments.
|
|
'''
|
|
if len(objects) == 1:
|
|
return copy.deepcopy(objects[0])
|
|
return merge_to(objects[-1], merge(*objects[:-1]))
|