diff --git a/CHANGES.txt b/CHANGES.txt index f208dcbafb84a47cc931635f7133c8a14fc9072c..7c081329c77e3c3edf509c97efc8ae1583a305e2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -14,6 +14,11 @@ Global * TODO: Porting to python3 +Configuration +------------- + +* Fixed job config corruption while overriding namelists in another job + Templates --------- diff --git a/mkexp b/mkexp index fa2c4a20715842bf713f0e9976d8723052d362c9..18740082caabc83ee5a179f0596f699763eb942c 100755 --- a/mkexp +++ b/mkexp @@ -6,6 +6,7 @@ # import codecs +import copy import os import re import stat @@ -477,7 +478,7 @@ def extend(subjob, jobs_config, extended_jobs): # Add parent config if extended_job: - pre_config.merge(jobs_config[extended_job]) + pre_config.merge(copy.deepcopy(jobs_config[extended_job])) # Add actual subjob config pre_config.merge(subconfig) @@ -534,8 +535,8 @@ for subjob, subconfig in jobs_config.iteritems(): # Prepare namelists for inclusion in scripts var_format = job_config['JOB'].get('.var_format', '${%s}') var_list = set() - job_config['jobs'] = {} - job_config['jobs'].merge(jobs_config.dict()) + del job_config['jobs'] + job_config['jobs'] = copy.deepcopy(jobs_config) job_config.walk(format_vars, log=var_list, fmt=var_format) job_config['VARIABLES_'] = var_list for namelist, groups in job_config['namelists'].iteritems(): diff --git a/test.py b/test.py index 11dc24f029d8ba2bd577d0ec9b72d98bb4fca810..c06e83adfe046eed2dae198e0c471f280781ec40 100644 --- a/test.py +++ b/test.py @@ -1173,6 +1173,55 @@ class InheritanceTestCase(MkexpSimpleTestCase): result = align(result) self.assertMultiLineEqual(expecteds[i-1], result) + def test_namelist_override(self): + writeconfig(self.exp_id, """ + EXP_TYPE = + [namelists] + [[namelist]] + [[[group]]] + var = 999 + [jobs] + [[job]] + [[job1]] + .extends = job + [[[namelists]]] + [[[[namelist]]]] + [[[[[group]]]]] + var = 1 + [[job2]] + .extends = job1 + [[[namelists]]] + [[[[namelist]]]] + [[[[[group]]]]] + var = 2 + """) + writetemplate(self.exp_id, 'job', """ + %{NAMELIST} + """) + expecteds = { + 'job': align(""" + &group + var = 999 + / + """), + 'job1': align(""" + &group + var = 1 + / + """), + 'job2': align(""" + &group + var = 2 + / + """) + } + ignore = output(script("mkexp "+self.exp_id+".config")) + for i in ('job', 'job1', 'job2'): + result = readfile(join("test", "experiments", self.exp_id, + self.exp_id+"."+i)) + result = align(result) + self.assertMultiLineEqual(expecteds[i], result) + class JobSiblingsTestCase(MkexpSimpleTestCase): def test_sibling_lookup(self):