#23986 closed Bug (fixed)
Collectstatic --clear fails if the static dir doesn't exist yet
| Reported by: | Michael | Owned by: | Sztrovacsek |
|---|---|---|---|
| Component: | contrib.staticfiles | Version: | 1.7 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | yes | UI/UX: | no |
Description
The --clear flag on collectstatic fails if the target directory doesn't exist yet.
Traceback (most recent call last):
File "redacted/bin/manage.py", line 16, in <module>
execute_from_command_line(sys.argv)
File "redacted/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
utility.execute()
File "redacted/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "redacted/local/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File "redacted/local/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
output = self.handle(*args, **options)
File "redacted/local/lib/python2.7/site-packages/django/core/management/base.py", line 533, in handle
return self.handle_noargs(**options)
File "redacted/local/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 168, in handle_noargs
collected = self.collect()
File "redacted/local/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 89, in collect
self.clear_dir('')
File "redacted/local/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 202, in clear_dir
dirs, files = self.storage.listdir(path)
File "redacted/local/lib/python2.7/site-packages/django/core/files/storage.py", line 270, in listdir
for entry in os.listdir(path):
OSError: [Errno 2] No such file or directory: '/redacted/public/static/2.1.0-dev'
Adding
if not os.path.exists(self.storage.location):
return
In Command.clear_dir() fixes the issue
Change History (12)
comment:1 by , 11 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|---|
| Type: | Uncategorized → Bug |
comment:2 by , 11 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:3 by , 11 years ago
comment:4 by , 11 years ago
| Has patch: | set |
|---|---|
| Needs tests: | set |
comment:5 by , 11 years ago
| Patch needs improvement: | set |
|---|
comment:6 by , 11 years ago
For a little guidance and to ensure I implement the tests in the best possible way, what would be the best way in adding the test for a missing target directory? Should I be looking at adding a new class something along the lines of TestCollectionClearNoTargetDirectory?
For reference the current test of the --clear option is as follows:
class TestCollectionClear(CollectionTestCase):
"""
Test the ``--clear`` option of the ``collectstatic`` management command.
"""
def run_collectstatic(self, **kwargs):
clear_filepath = os.path.join(settings.STATIC_ROOT, 'cleared.txt')
with open(clear_filepath, 'w') as f:
f.write('should be cleared')
super(TestCollectionClear, self).run_collectstatic(clear=True)
def test_cleared_not_found(self):
self.assertFileNotFound('cleared.txt')
Thanks in advance :)
comment:7 by , 11 years ago
You can just override the STATIC_ROOT setting and call self.run_collectstatic():
@override_settings(STATIC_ROOT=os.path.join(TEST_ROOT, 'project', 'site_media', 'static-does-not-exist')) def test_empty_directory(self): self.run_collectstatic()
but, I think this is not the cleanest solution. You also don't need to call BaseCollectionTestCase.setUp() because it tries to create a directory if it doesn't exist: https://github.com/django/django/blob/master/tests/staticfiles_tests/tests.py#L132
I'd go with a new test case (without using BaseCollectionTestCase mixin).
comment:8 by , 11 years ago
| Owner: | changed from to |
|---|
comment:10 by , 11 years ago
| Patch needs improvement: | unset |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
Looks good to me, thanks!
comment:11 by , 11 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
I've created a pull request for this ticket which can be viewed at https://github.com/django/django/pull/3721. I hope I've done everything to the correctly and to the required standard *fingers crossed*.