From: Cheryl Sabella Date: Tue, 12 Jun 2018 20:37:51 +0000 (-0400) Subject: bpo-32108: Don't clear configparser values if key is assigned to itself (GH-7588) X-Git-Tag: v3.8.0a1~1572 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=33cd058f21d0673253c88cea70388282918992bc;p=thirdparty%2FPython%2Fcpython.git bpo-32108: Don't clear configparser values if key is assigned to itself (GH-7588) --- diff --git a/Lib/configparser.py b/Lib/configparser.py index ea788aec5100..4a16101c7a3a 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -963,7 +963,8 @@ class RawConfigParser(MutableMapping): def __setitem__(self, key, value): # To conform with the mapping protocol, overwrites existing values in # the section. - + if key in self and self[key] is value: + return # XXX this is not atomic if read_dict fails at any point. Then again, # no update method in configparser is atomic in this implementation. if key == self.default_section: diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py index f4df622050b9..f16da116a745 100644 --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -850,12 +850,18 @@ boolean {0[0]} NO self.assertEqual(set(cf['section3'].keys()), {'named'}) self.assertNotIn('name3', cf['section3']) self.assertEqual(cf.sections(), ['section1', 'section2', 'section3']) + # For bpo-32108, assigning default_section to itself. + cf[self.default_section] = cf[self.default_section] + self.assertNotEqual(set(cf[self.default_section].keys()), set()) cf[self.default_section] = {} self.assertEqual(set(cf[self.default_section].keys()), set()) self.assertEqual(set(cf['section1'].keys()), {'name1'}) self.assertEqual(set(cf['section2'].keys()), {'name22'}) self.assertEqual(set(cf['section3'].keys()), set()) self.assertEqual(cf.sections(), ['section1', 'section2', 'section3']) + # For bpo-32108, assigning section to itself. + cf['section2'] = cf['section2'] + self.assertEqual(set(cf['section2'].keys()), {'name22'}) def test_invalid_multiline_value(self): if self.allow_no_value: diff --git a/Misc/NEWS.d/next/Library/2018-06-10-12-15-26.bpo-32108.iEkvh0.rst b/Misc/NEWS.d/next/Library/2018-06-10-12-15-26.bpo-32108.iEkvh0.rst new file mode 100644 index 000000000000..154d88471f6a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-06-10-12-15-26.bpo-32108.iEkvh0.rst @@ -0,0 +1 @@ +In configparser, don't clear section when it is assigned to itself.