summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2016-04-28 21:18:55 +0200
committerClaude Paroz <claude@2xlibre.net>2016-04-30 12:11:11 +0200
commit4a6bdff43047acbf8743ad8b332e37e529898c27 (patch)
tree7d6d516f745f12bdb0a5105401360f04e71023e5
parentcd2ac512e6f4bd0bb848d9cb65b1831b63116531 (diff)
[1.9.x] Fixed #26341 -- Fixed makemessages breaking location comments for HTML files
Thanks Sylvain Garancher for the report and Veranika Sabiashchanskaya for the initial patch. Backport of b16b124996 from master.
-rw-r--r--django/core/management/commands/makemessages.py15
-rw-r--r--docs/releases/1.9.6.txt3
-rw-r--r--tests/i18n/commands/__init__.py3
-rw-r--r--tests/i18n/commands/templates/test.html3
-rw-r--r--tests/i18n/test_extraction.py15
5 files changed, 32 insertions, 7 deletions
diff --git a/django/core/management/commands/makemessages.py b/django/core/management/commands/makemessages.py
index 866e325816..f200a58784 100644
--- a/django/core/management/commands/makemessages.py
+++ b/django/core/management/commands/makemessages.py
@@ -147,13 +147,18 @@ class BuildFile(object):
# Remove '.py' suffix
if os.name == 'nt':
# Preserve '.\' prefix on Windows to respect gettext behavior
- old = '#: ' + self.work_path
- new = '#: ' + self.path
+ old_path = self.work_path
+ new_path = self.path
else:
- old = '#: ' + self.work_path[2:]
- new = '#: ' + self.path[2:]
+ old_path = self.work_path[2:]
+ new_path = self.path[2:]
- return msgs.replace(old, new)
+ return re.sub(
+ r'^(#: .*)(' + re.escape(old_path) + r')',
+ r'\1' + new_path,
+ msgs,
+ flags=re.MULTILINE
+ )
def cleanup(self):
"""
diff --git a/docs/releases/1.9.6.txt b/docs/releases/1.9.6.txt
index 769d04945a..f701d08df9 100644
--- a/docs/releases/1.9.6.txt
+++ b/docs/releases/1.9.6.txt
@@ -27,3 +27,6 @@ Bugfixes
* Restored conversion of an empty string to null when saving values of
``GenericIPAddressField`` on SQLite and MySQL (:ticket:`26557`).
+
+* Fixed a ``makemessages`` regression where temporary ``.py`` extensions were
+ leaked in source file paths (:ticket:`26341`).
diff --git a/tests/i18n/commands/__init__.py b/tests/i18n/commands/__init__.py
index 0b3acf5b4d..39ce6d7a17 100644
--- a/tests/i18n/commands/__init__.py
+++ b/tests/i18n/commands/__init__.py
@@ -12,3 +12,6 @@ number = 3
dummy3 = ungettext("%(number)s Foo", "%(number)s Foos", number) % {'number': number}
dummy4 = _('Size')
+
+# This string is intentionally duplicated in test.html
+dummy5 = _('This literal should be included.')
diff --git a/tests/i18n/commands/templates/test.html b/tests/i18n/commands/templates/test.html
index dde42d3fdd..90970598b9 100644
--- a/tests/i18n/commands/templates/test.html
+++ b/tests/i18n/commands/templates/test.html
@@ -70,6 +70,9 @@ continued here.{% endcomment %}
{% trans "Translatable literal #7.1g"|add:2 context "context #7.1g" as var %}
{% trans "Translatable literal #7.1h" | add:"foo" | add:2 context "context #7.1h" as var %}
+<!-- Source file inside a msgid, should be left as-is. -->
+{% trans "#: templates/test.html.py" %}
+
{% blocktrans context "Special blocktrans context #1" %}Translatable literal #8a{% endblocktrans %}
{% blocktrans count 2 context "Special blocktrans context #2" %}Translatable literal #8b-singular{% plural %}Translatable literal #8b-plural{% endblocktrans %}
{% blocktrans context "Special blocktrans context #3" count 2 %}Translatable literal #8c-singular{% plural %}Translatable literal #8c-plural{% endblocktrans %}
diff --git a/tests/i18n/test_extraction.py b/tests/i18n/test_extraction.py
index f72aa00771..2673c93288 100644
--- a/tests/i18n/test_extraction.py
+++ b/tests/i18n/test_extraction.py
@@ -635,8 +635,19 @@ class LocationCommentsTests(ExtractorTests):
# #16903 -- Standard comment with source file relative path should be present
self.assertLocationCommentPresent(self.PO_FILE, 'Translatable literal #6b', 'templates', 'test.html')
- # #21208 -- Leaky paths in comments on Windows e.g. #: path\to\file.html.py:123
- self.assertLocationCommentNotPresent(self.PO_FILE, None, 'templates', 'test.html.py')
+ def test_location_comments_for_templatized_files(self):
+ """
+ Ensure no leaky paths in comments, e.g. #: path\to\file.html.py:123
+ Refs #21209/#26341.
+ """
+ os.chdir(self.test_dir)
+ management.call_command('makemessages', locale=[LOCALE], verbosity=0)
+ self.assertTrue(os.path.exists(self.PO_FILE))
+ with open(self.PO_FILE, 'r') as fp:
+ po_contents = force_text(fp.read())
+ self.assertMsgId('#: templates/test.html.py', po_contents)
+ self.assertLocationCommentNotPresent(self.PO_FILE, None, '.html.py')
+ self.assertLocationCommentPresent(self.PO_FILE, 5, 'templates', 'test.html')
class KeepPotFileExtractorTests(ExtractorTests):