# HG changeset patch # User cmlenz # Date 1201877192 0 # Node ID 654b632e548256771b6624c975773446661a09cf # Parent 5c0bda4f20b1b25b0be23615ca0db0c9efd63a91 Merging catalogs would sometimes mix translations from different runs. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ * Fixed catalogs' charset values not being recognized (ticket #66). * Fixed fuzzy matching when updating message catalogs (ticket #82). + * Fixed bug in catalog updating, that in some cases pulled in + translations from different catalogs based on the same template. Version 0.9.1 diff --git a/babel/messages/catalog.py b/babel/messages/catalog.py --- a/babel/messages/catalog.py +++ b/babel/messages/catalog.py @@ -92,6 +92,11 @@ return cmp(self.id, obj.id[0]) return cmp(self.id, obj.id) + def clone(self): + return Message(self.id, self.string, self.locations, self.flags, + self.auto_comments, self.user_comments, + self.previous_id, self.lineno) + def fuzzy(self): return 'fuzzy' in self.flags fuzzy = property(fuzzy, doc="""\ @@ -624,6 +629,7 @@ fuzzy_matches = set() def _merge(message, oldkey, newkey): + message = message.clone() fuzzy = False if oldkey != newkey: fuzzy = True diff --git a/babel/messages/tests/catalog.py b/babel/messages/tests/catalog.py --- a/babel/messages/tests/catalog.py +++ b/babel/messages/tests/catalog.py @@ -174,6 +174,17 @@ cat.update(tmpl, no_fuzzy_matching=True) self.assertEqual(2, len(cat.obsolete)) + def test_update_no_template_mutation(self): + tmpl = catalog.Catalog() + tmpl.add('foo') + cat1 = catalog.Catalog() + cat1.add('foo', 'Voh') + cat1.update(tmpl) + cat2 = catalog.Catalog() + cat2.update(tmpl) + + self.assertEqual(None, cat2['foo'].string) + self.assertEqual(False, cat2['foo'].fuzzy) def suite(): suite = unittest.TestSuite()