2727
2828#include " yaml.h"
2929
30- void merge (yaml &to, const yaml &from, const YamlMergeFlags &flags)
30+ // no links allowed
31+ // to do this we call YAML::Clone()
32+ void merge (yaml &dst, const yaml &src, const YamlMergeFlags &flags)
3133{
32- if (!from .IsDefined ())
34+ if (!src .IsDefined ())
3335 return ;
3436
35- // if 'to ' node is not a map, make it so
36- if (!to .IsMap ())
37- to = yaml ();
37+ // if 'dst ' node is not a map, make it so
38+ if (!dst .IsMap ())
39+ dst = yaml ();
3840
39- for (auto &f : from )
41+ for (auto &f : src )
4042 {
4143 auto sf = f.first .as <String>();
4244 auto ff = f.second .Type ();
4345
4446 bool found = false ;
45- for (auto t : to )
47+ for (auto t : dst )
4648 {
4749 const auto st = t.first .as <String>();
4850 if (sf == st)
@@ -57,11 +59,11 @@ void merge(yaml &to, const yaml &from, const YamlMergeFlags &flags)
5759 yaml nn;
5860 nn.push_back (t.second );
5961 nn.push_back (f.second );
60- to [st] = nn;
62+ dst [st] = nn;
6163 break ;
6264 }
6365 case YamlMergeFlags::OverwriteScalars:
64- to [st] = from [sf];
66+ dst [st] = YAML::Clone (src [sf]) ;
6567 break ;
6668 case YamlMergeFlags::DontTouchScalars:
6769 break ;
@@ -75,12 +77,12 @@ void merge(yaml &to, const yaml &from, const YamlMergeFlags &flags)
7577 {
7678 yaml nn = YAML::Clone (f);
7779 nn.push_back (t.second );
78- to [st] = nn;
80+ dst [st] = nn;
7981 }
8082 else if (ff == YAML::NodeType::Sequence && ft == YAML::NodeType::Sequence)
8183 {
8284 for (auto &fv : f)
83- t.second .push_back (fv );
85+ t.second .push_back (YAML::Clone (fv) );
8486 }
8587 else if (ff == YAML::NodeType::Map && ft == YAML::NodeType::Map)
8688 merge (t.second , f.second );
@@ -91,16 +93,19 @@ void merge(yaml &to, const yaml &from, const YamlMergeFlags &flags)
9193 }
9294 if (!found)
9395 {
94- to [sf] = f.second ;
96+ dst [sf] = YAML::Clone ( f.second ) ;
9597 }
9698 }
9799}
98100
99- void prepare_yaml_config (yaml & root)
101+ void prepare_yaml_config (yaml root)
100102{
101103 // can be all node checks from config, project, settings moved here?
102104
103- //
105+ // no effect
106+ if (!root.IsMap ())
107+ return ;
108+
104109 auto prjs = root[" projects" ];
105110 if (prjs.IsDefined () && !prjs.IsMap ())
106111 throw std::runtime_error (" 'projects' should be a map" );
@@ -151,7 +156,7 @@ void prepare_yaml_config(yaml &root)
151156 CHECK_BSI (" post_alias" );
152157#undef CHECK_BSI
153158
154- root[kv.first ] = kv.second ;
159+ root[kv.first ] = YAML::Clone ( kv.second ) ;
155160 }
156161 }
157162 }
@@ -165,8 +170,9 @@ void prepare_yaml_config(yaml &root)
165170 {
166171 YamlMergeFlags flags;
167172 flags.scalar_scalar = YamlMergeFlags::DontTouchScalars;
168- merge (prj, root[" source" ], flags);
169- merge (prj, root[" version" ], flags);
173+ merge (prj.second [" source" ], root[" source" ], flags);
174+ if (!prj.second [" version" ].IsDefined () && root[" version" ].IsDefined ())
175+ prj.second [" version" ] = YAML::Clone (root[" version" ]);
170176 }
171177 }
172178 }
0 commit comments