Skip to content

Commit

Permalink
Fixed #20354 -- makemessages no longer crashes with `UnicodeDecodeE…
Browse files Browse the repository at this point in the history
…rror`

Handle the `UnicodeDecodeError` exception, send a warning to `stdout` with the
file name and location, and continue processing other files.
  • Loading branch information
Tai Lee authored and claudep committed May 7, 2013
1 parent 1ad8314 commit 99a6f0e
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 8 deletions.
5 changes: 4 additions & 1 deletion django/core/management/commands/makemessages.py
Expand Up @@ -294,7 +294,10 @@ def build_pot_file(self, localedir):
os.unlink(potfile) os.unlink(potfile)


for f in file_list: for f in file_list:
f.process(self, potfile, self.domain, self.keep_pot) 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 return potfile


def find_files(self, root): def find_files(self, root):
Expand Down
22 changes: 15 additions & 7 deletions tests/i18n/commands/extraction.py
Expand Up @@ -30,6 +30,10 @@ def _rmrf(self, dname):
return return
shutil.rmtree(dname) shutil.rmtree(dname)


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

def tearDown(self): def tearDown(self):
os.chdir(self.test_dir) os.chdir(self.test_dir)
try: try:
Expand Down Expand Up @@ -126,18 +130,22 @@ def test_extraction_error(self):
# Check that the temporary file was cleaned up # Check that the temporary file was cleaned up
self.assertFalse(os.path.exists('./templates/template_with_error.tpl.py')) 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): def test_extraction_warning(self):
"""test xgettext warning about multiple bare interpolation placeholders""" """test xgettext warning about multiple bare interpolation placeholders"""
os.chdir(self.test_dir) os.chdir(self.test_dir)
shutil.copyfile('./code.sample', './code_sample.py') shutil.copyfile('./code.sample', './code_sample.py')
self.addCleanup(self.rmfile, os.path.join(self.test_dir, 'code_sample.py'))
stdout = StringIO() stdout = StringIO()
try: management.call_command('makemessages', locale=LOCALE, stdout=stdout)
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())) self.assertIn("code_sample.py:4", force_text(stdout.getvalue()))


def test_template_message_context_extractor(self): def test_template_message_context_extractor(self):
Expand Down
1 change: 1 addition & 0 deletions tests/i18n/commands/not_utf8.sample
@@ -0,0 +1 @@
Copyright (c) 2009 �yvind Sean Kinsey, oyvind@kinsey.no

0 comments on commit 99a6f0e

Please sign in to comment.