@@ -86,28 +86,43 @@ def dump_settings(settings, file_to_dump):
8686 return dumped
8787
8888
89- def upgrade_settings (defaults , current , key = None ):
90- upgraded = False
91- res = CommentedMap ()
92- for k , v in defaults .items ():
93- if k not in current :
94- res [k ] = v
95- upgraded = True
96- log .info ("Added field: \' %s%s\' ." , k , '' if not key else ' to \' %s\' .' % key )
97- else :
98- res [k ] = current [k ]
99-
100- if hasattr (v , 'items' ):
101- if k in current :
102- sub_upgrade , res [k ] = upgrade_settings (v , current [k ], k )
103- if sub_upgrade :
104- upgraded = True
105- else :
106- res [k ] = v
107- upgraded = True
108-
109- return upgraded , res
110-
89+ def _inner_upgrade (settings1 , settings2 , key = None , overwrite = False ):
90+ sub_upgraded = False
91+ merged = settings2 .copy ()
92+
93+ if isinstance (settings1 , dict ):
94+ for k , v in settings1 .items ():
95+ # missing k
96+ if k not in settings2 :
97+ merged [k ] = v
98+ sub_upgraded = True
99+ if not key :
100+ log .info ("Added %r setting: %s" , str (k ), str (v ))
101+ else :
102+ log .info ("Added %r to setting %r: %s" , str (k ), str (key ), str (v ))
103+ continue
104+
105+ # iterate children
106+ if isinstance (v , dict ) or isinstance (v , list ):
107+ merged [k ], did_upgrade = _inner_upgrade (settings1 [k ], settings2 [k ], key = k ,
108+ overwrite = overwrite )
109+ sub_upgraded = did_upgrade if did_upgrade else sub_upgraded
110+ elif settings1 [k ] != settings2 [k ] and overwrite :
111+ merged = settings1
112+ sub_upgraded = True
113+ elif isinstance (settings1 , list ) and key :
114+ for v in settings1 :
115+ if v not in settings2 :
116+ merged .append (v )
117+ sub_upgraded = True
118+ log .info ("Added to setting %r: %s" , str (key ), str (v ))
119+ continue
120+
121+ return merged , sub_upgraded
122+
123+ def upgrade_settings (defaults , currents ):
124+ upgraded_settings , upgraded = _inner_upgrade (defaults , currents )
125+ return upgraded , upgraded_settings
111126
112127############################################################
113128# MAIN
0 commit comments