#20422 closed Bug (fixed)
makemessages ignores "ignore patterns"
Reported by: | Vsevolod Novikov | Owned by: | Claude Paroz |
---|---|---|---|
Component: | Core (Management commands) | Version: | 1.5 |
Severity: | Normal | Keywords: | ignore, pattern |
Cc: | bmispelon@… | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
The default ignore pattern set contains '.*','*~', and 'CVS' patterns. As I was expecting, it should mean that any file having file NAME like these patterns, should be ignored.
Really, the makemessages management command ignores only project root files having file names like these.
As a result, the makemessages makes such unexpected things like walking through all .svn directories except root, or trying to analyze binary Mac OS X - specific file descriptors like '._adminoverride.js'
The reason for such inconsistency is a function is_ignored() defined in the makemessages.py.
While the django 1.5 declares this function in a module context, the current trunk defines it in a context of the find_files() function (it is not important, but makes creating ready-to-use patch harder).
Anyway, the only line required to be fixed is:
if fnmatch.fnmatchcase(path, pattern):
which should be replaced by:
if fnmatch.fnmatchcase(os.path.split(path)[-1], pattern):
This simple change makes makemessages command working with ignore patterns as expected.
The applied patch has been created for django version 1.5.1-final:
>>> import django >>> django.VERSION (1, 5, 1, 'final', 0)
Attachments (1)
Change History (10)
by , 12 years ago
Attachment: | django-makemessages-ignore-patterns-1.5.patch added |
---|
comment:1 by , 12 years ago
Cc: | added |
---|---|
Triage Stage: | Unreviewed → Accepted |
Hi,
I added some tests and rewrote the is_ignored
function a bit (using the builtin any
instead of the loop).
I made a pull request out of it: https://github.com/django/django/pull/1076
Thank you for the report and the original patch.
comment:2 by , 12 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
Triage Stage: | Accepted → Ready for checkin |
comment:3 by , 12 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
comment:4 by , 11 years ago
Patch needs improvement: | set |
---|---|
Resolution: | fixed |
Status: | closed → new |
Version: | 1.5 → 1.6 |
Unfortunately the assumption that "file NAME like these patterns, should be ignored" was not correct. According to the documentation the --ignore pattern should "ignore files or directories matching" (https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-option---ignore)
The example given in the docs actually uses patterns with paths:
django-admin.py makemessages --locale=en_US --ignore=apps/* --ignore=secret/*.html
The applied patch breaks this behaviour by using filename = os.path.basename(path)
Being able to exclude paths is important to eg. easily exclude certain apps in a project from translation.
EDIT:
I looked at the code and I see now that as usual things are not that simple and why the tests still worked after that patch.
There is a test checking for ignore_dir/*
which works, but there is none like ignore_dir/*.html
.
My usecase (that broke with 1.6) was a pattern like apps/*/admin.py
to ignore messages in admin (of all apps) when generating po files for customers, who are only supposed to translate messages from views and templates. Using the full path for pattern matching makes that work again, but maybe i am not seeing the complete picture here.
comment:5 by , 11 years ago
Patch needs improvement: | unset |
---|---|
Version: | 1.6 → 1.5 |
Could you please open a new ticket as the fix for this one has already been released? Thanks.
comment:6 by , 11 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
patch for django-1.5.1-final