Commit 99a6f0e7 authored by Tai Lee's avatar Tai Lee Committed by Claude Paroz
Browse files

Fixed #20354 -- `makemessages` no longer crashes with `UnicodeDecodeError`

Handle the `UnicodeDecodeError` exception, send a warning to `stdout` with the
file name and location, and continue processing other files.
parent 1ad83145
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -294,7 +294,10 @@ class Command(NoArgsCommand):
            os.unlink(potfile)

        for f in file_list:
            try:
                f.process(self, potfile, self.domain, self.keep_pot)
            except UnicodeDecodeError:
                self.stdout.write("UnicodeDecodeError: skipped file %s in %s" % (f.file, f.dirpath))
        return potfile

    def find_files(self, root):
+15 −7
Original line number Diff line number Diff line
@@ -30,6 +30,10 @@ class ExtractorTests(SimpleTestCase):
            return
        shutil.rmtree(dname)

    def rmfile(self, filepath):
        if os.path.exists(filepath):
            os.remove(filepath)

    def tearDown(self):
        os.chdir(self.test_dir)
        try:
@@ -126,18 +130,22 @@ class BasicExtractorTests(ExtractorTests):
        # Check that the temporary file was cleaned up
        self.assertFalse(os.path.exists('./templates/template_with_error.tpl.py'))

    def test_unicode_decode_error(self):
        os.chdir(self.test_dir)
        shutil.copyfile('./not_utf8.sample', './not_utf8.txt')
        self.addCleanup(self.rmfile, os.path.join(self.test_dir, 'not_utf8.txt'))
        stdout = StringIO()
        management.call_command('makemessages', locale=LOCALE, stdout=stdout)
        self.assertIn("UnicodeDecodeError: skipped file not_utf8.txt in .",
                      force_text(stdout.getvalue()))

    def test_extraction_warning(self):
        """test xgettext warning about multiple bare interpolation placeholders"""
        os.chdir(self.test_dir)
        shutil.copyfile('./code.sample', './code_sample.py')
        self.addCleanup(self.rmfile, os.path.join(self.test_dir, 'code_sample.py'))
        stdout = StringIO()
        try:
        management.call_command('makemessages', locale=LOCALE, stdout=stdout)
        finally:
            try:
                os.remove('./code_sample.py')
            except OSError:
                pass
        self.assertIn("code_sample.py:4", force_text(stdout.getvalue()))

    def test_template_message_context_extractor(self):
+1 −0
Original line number Diff line number Diff line
Copyright (c) 2009 yvind Sean Kinsey, oyvind@kinsey.no
 No newline at end of file