| #!/usr/bin/env lucicfg |
| # Copyright 2020 The Flutter Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """ |
| Library for handling copying objects in LUCI's starlark. |
| """ |
| |
| def _is_dict(o): |
| return type(o) == type({}) |
| |
| def _is_list(o): |
| return type(o) == type([]) |
| |
| def _simulate_recursion_for_deepcopy_depth_4(x): |
| """Helper method for deepcopy().""" |
| if _is_dict(x) or _is_list(x): |
| fail("Cannot make a deep copy of containers nested too deeply: %s" % x) |
| return x |
| |
| def _simulate_recursion_for_deepcopy_depth_3(x): |
| """Helper method for deepcopy().""" |
| if _is_dict(x): |
| return {key: _simulate_recursion_for_deepcopy_depth_4(value) for key, value in x.items()} |
| if _is_list(x): |
| return [_simulate_recursion_for_deepcopy_depth_4(elem) for elem in x] |
| return x |
| |
| def _simulate_recursion_for_deepcopy_depth_2(x): |
| """Helper method for deepcopy().""" |
| if _is_dict(x): |
| return {key: _simulate_recursion_for_deepcopy_depth_3(value) for key, value in x.items()} |
| if _is_list(x): |
| return [_simulate_recursion_for_deepcopy_depth_3(elem) for elem in x] |
| return x |
| |
| def _simulate_recursion_for_deepcopy_depth_1(x): |
| """Helper method for deepcopy().""" |
| if _is_dict(x): |
| return {key: _simulate_recursion_for_deepcopy_depth_2(value) for key, value in x.items()} |
| if _is_list(x): |
| return [_simulate_recursion_for_deepcopy_depth_2(elem) for elem in x] |
| return x |
| |
| def _deepcopy(x): |
| """Returns a copy of the argument, making a deep copy if it is a container. |
| |
| (Copied from http://google3/borg/test/util.bzl?l=34&rcl=222116979) |
| Args: |
| x (object): value to copy. If it is a container with nested |
| containers as elements, the maximum nesting depth is restricted |
| to three (e.g., [[[3]]] is okay, but not [[[[4]]]]). If it is a |
| struct, it is treated as a value type, i.e., only a shallow copy |
| is made. |
| Returns: |
| A copy of the argument. |
| """ |
| if _is_dict(x): |
| return {key: _simulate_recursion_for_deepcopy_depth_1(value) for key, value in x.items()} |
| if _is_list(x): |
| return [_simulate_recursion_for_deepcopy_depth_1(elem) for elem in x] |
| return x |
| |
| copy = struct( |
| deepcopy = _deepcopy, |
| ) |