diff options
author | Tristan Van Berkom <tristan.vanberkom@codethink.co.uk> | 2017-02-26 18:56:53 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.vanberkom@codethink.co.uk> | 2017-02-26 18:56:53 +0900 |
commit | 692d3c542108ecbd9b6207f8f90068ba89e6da03 (patch) | |
tree | 93ad7c45ee6c1e8f7366100e8211b5893ec85a6b /buildstream/_yaml.py | |
parent | 96a4d48c6e97bb0ee432f71ee2c587ae9e8be2cd (diff) | |
download | buildstream-692d3c542108ecbd9b6207f8f90068ba89e6da03.tar.gz |
_yaml.py: Added copy_tree parameter to _yaml.load()
By default this is false now, this avoids a deep copy when
a deep copy is unneeded, it's only needed when we need to
preserve the original copy for later calls to _yaml.dump()
Diffstat (limited to 'buildstream/_yaml.py')
-rw-r--r-- | buildstream/_yaml.py | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/buildstream/_yaml.py b/buildstream/_yaml.py index e37f47fe0..35bcd4877 100644 --- a/buildstream/_yaml.py +++ b/buildstream/_yaml.py @@ -181,12 +181,14 @@ class CompositePolicy(Enum): # Args: # filename (str): The YAML file to load # shortname (str): The filename in shorthand for error reporting (or None) +# copy_tree (bool): Whether to make a copy, preserving the original toplevels +# for later serialization # # Returns (dict): A loaded copy of the YAML file with provenance information # # Raises: LoadError # -def load(filename, shortname=None): +def load(filename, shortname=None, copy_tree=False): try: with open(filename) as f: @@ -210,7 +212,7 @@ def load(filename, shortname=None): if not shortname: shortname = filename - return node_decorated_copy(shortname, contents) + return node_decorated_copy(shortname, contents, copy_tree=copy_tree) # Dumps a previously loaded YAML node to a file @@ -234,11 +236,15 @@ def dump(node, filename): # Args: # filename (str): The filename # toplevel (node): The toplevel dictionary node +# copy_tree (bool): Whether to load a copy and preserve the original # # Returns: A copy of the toplevel decorated with Provinance # -def node_decorated_copy(filename, toplevel): - result = copy.deepcopy(toplevel) +def node_decorated_copy(filename, toplevel, copy_tree=False): + if copy_tree: + result = copy.deepcopy(toplevel) + else: + result = toplevel node_decorate_dict(filename, result, toplevel, toplevel) @@ -250,6 +256,9 @@ def node_decorate_dict(filename, target, source, toplevel): target[PROVENANCE_KEY] = provenance for key, value in source.items(): + if key == PROVENANCE_KEY: + continue + member = MemberProvenance(filename, source, key, toplevel) provenance.members[key] = member |