Skip to content

Commit be40b2d

Browse files
committed
Handle source map file paths with STATICFILES_DIRS, fail gracefully
If a sourcemap source fails to resolve with the static file finder, log the error but don't raise an exception during collectstatic.
1 parent aaa0295 commit be40b2d

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

pipeline/compressors/cleancss.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@
33
import codecs
44
import json
55
import os
6+
import logging
67

8+
from django.conf import settings as django_settings
79
from django.contrib.staticfiles.storage import staticfiles_storage
10+
from django.core.exceptions import SuspiciousFileOperation
811

912
from pipeline.conf import settings
1013
from pipeline.compressors import SubProcessCompressor
1114
from pipeline.utils import source_map_re, relurl
1215

1316

17+
logger = logging.getLogger('pipeline')
18+
19+
1420
class CleanCSSCompressor(SubProcessCompressor):
1521

1622
def compress_css(self, css):
@@ -56,10 +62,25 @@ def compress_css_with_source_map(self, paths, output_filename):
5662
# Grab urls from staticfiles storage (in case filenames are hashed)
5763
source_map_data = json.loads(source_map)
5864
for i, source in enumerate(source_map_data['sources']):
59-
source_abs_path = os.path.join(output_dir, source)
65+
source_abs_path = os.path.abspath(os.path.join(output_dir, source))
6066
source_rel_path = os.path.relpath(
6167
source_abs_path, staticfiles_storage.base_location)
62-
source_url = staticfiles_storage.url(source_rel_path)
68+
source_url = None
69+
try:
70+
source_url = staticfiles_storage.url(source_rel_path)
71+
except SuspiciousFileOperation:
72+
for static_dir in django_settings.STATICFILES_DIRS:
73+
if not isinstance(static_dir, tuple):
74+
continue
75+
prefix, path = static_dir
76+
if not source_abs_path.startswith(path):
77+
continue
78+
source_rel_path = os.path.relpath(source_abs_path, path)
79+
source_url = staticfiles_storage.url(
80+
os.path.join(prefix, source_rel_path))
81+
if not source_url:
82+
logger.exception("Could not relativize source map file")
83+
continue
6384
source_map_data['sources'][i] = relurl(source_url, output_url)
6485
source_map = json.dumps(source_map_data)
6586

0 commit comments

Comments
 (0)