From 8f75d21a2e6d255848ae441d858c6ea819e3d100 Mon Sep 17 00:00:00 2001 From: Daniel Wiesmann Date: Fri, 13 Jul 2018 21:48:19 +0100 Subject: [PATCH] Fixed #28566 -- Added path matching to collectstatic ignore patterns. --- .../staticfiles/management/commands/collectstatic.py | 2 +- django/contrib/staticfiles/utils.py | 4 ++++ docs/ref/contrib/staticfiles.txt | 9 +++++++-- docs/releases/2.2.txt | 3 ++- tests/staticfiles_tests/apps/staticfiles_config.py | 2 +- .../apps/test/static/test/vendor/module.js | 0 tests/staticfiles_tests/test_management.py | 5 +++-- 7 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 tests/staticfiles_tests/apps/test/static/test/vendor/module.js diff --git a/django/contrib/staticfiles/management/commands/collectstatic.py b/django/contrib/staticfiles/management/commands/collectstatic.py index 4aeabb8d70..6e11b984a7 100644 --- a/django/contrib/staticfiles/management/commands/collectstatic.py +++ b/django/contrib/staticfiles/management/commands/collectstatic.py @@ -80,7 +80,7 @@ class Command(BaseCommand): ignore_patterns = options['ignore_patterns'] if options['use_default_ignore_patterns']: ignore_patterns += apps.get_app_config('staticfiles').ignore_patterns - self.ignore_patterns = list(set(ignore_patterns)) + self.ignore_patterns = list(set(os.path.normpath(p) for p in ignore_patterns)) self.post_process = options['post_process'] def collect(self): diff --git a/django/contrib/staticfiles/utils.py b/django/contrib/staticfiles/utils.py index d4025cf124..3d28c90f47 100644 --- a/django/contrib/staticfiles/utils.py +++ b/django/contrib/staticfiles/utils.py @@ -22,10 +22,14 @@ def get_files(storage, ignore_patterns=None, location=''): ignore_patterns = [] directories, files = storage.listdir(location) for fn in files: + # Match only the basename. if matches_patterns(fn, ignore_patterns): continue if location: fn = os.path.join(location, fn) + # Match the full file path. + if matches_patterns(fn, ignore_patterns): + continue yield fn for dir in directories: if matches_patterns(dir, ignore_patterns): diff --git a/docs/ref/contrib/staticfiles.txt b/docs/ref/contrib/staticfiles.txt index 2c300a1d03..ce8d157ff2 100644 --- a/docs/ref/contrib/staticfiles.txt +++ b/docs/ref/contrib/staticfiles.txt @@ -94,8 +94,13 @@ Some commonly used options are: .. django-admin-option:: --ignore PATTERN, -i PATTERN - Ignore files or directories matching this glob-style pattern. Use multiple - times to ignore more. + Ignore files, directories, or paths matching this glob-style pattern. Use + multiple times to ignore more. When specifying a path, always use forward + slashes, even on Windows. + + .. versionchanged:: 2.2 + + Path matching was added. .. django-admin-option:: --dry-run, -n diff --git a/docs/releases/2.2.txt b/docs/releases/2.2.txt index 29a6f54f9d..3d1f2783ab 100644 --- a/docs/releases/2.2.txt +++ b/docs/releases/2.2.txt @@ -105,7 +105,8 @@ Minor features :mod:`django.contrib.staticfiles` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* ... +* Added path matching to the :option:`collectstatic --ignore` option so that + patterns like ``/vendor/*.js`` can be used. :mod:`django.contrib.syndication` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/staticfiles_tests/apps/staticfiles_config.py b/tests/staticfiles_tests/apps/staticfiles_config.py index e48a0c8d99..b8b3960c9d 100644 --- a/tests/staticfiles_tests/apps/staticfiles_config.py +++ b/tests/staticfiles_tests/apps/staticfiles_config.py @@ -2,4 +2,4 @@ from django.contrib.staticfiles.apps import StaticFilesConfig class IgnorePatternsAppConfig(StaticFilesConfig): - ignore_patterns = ['*.css'] + ignore_patterns = ['*.css', '*/vendor/*.js'] diff --git a/tests/staticfiles_tests/apps/test/static/test/vendor/module.js b/tests/staticfiles_tests/apps/test/static/test/vendor/module.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/staticfiles_tests/test_management.py b/tests/staticfiles_tests/test_management.py index 3a6d536013..20595ad118 100644 --- a/tests/staticfiles_tests/test_management.py +++ b/tests/staticfiles_tests/test_management.py @@ -319,11 +319,12 @@ class TestCollectionExcludeNoDefaultIgnore(TestDefaults, CollectionTestCase): class TestCollectionCustomIgnorePatterns(CollectionTestCase): def test_custom_ignore_patterns(self): """ - A custom ignore_patterns list, ['*.css'] in this case, can be specified - in an AppConfig definition. + A custom ignore_patterns list, ['*.css', '*/vendor/*.js'] in this case, + can be specified in an AppConfig definition. """ self.assertFileNotFound('test/nonascii.css') self.assertFileContains('test/.hidden', 'should be ignored') + self.assertFileNotFound(os.path.join('test', 'vendor', 'module.js')) class TestCollectionDryRun(TestNoFilesCreated, CollectionTestCase):