From 1c33c0a02a89d7d2090c4f9e2c0c85209281347b Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Thu, 1 Mar 2012 23:02:38 +0000 Subject: [PATCH] Fixed #17737 -- Stopped the collectstatic management command from copying the wrong file in repeated runs. Thanks, pigletto. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17612 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- .../management/commands/collectstatic.py | 10 +++- .../staticfiles_tests/tests.py | 57 ++++++++++++++++++- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/django/contrib/staticfiles/management/commands/collectstatic.py b/django/contrib/staticfiles/management/commands/collectstatic.py index 7004ff0454..850b0132fb 100644 --- a/django/contrib/staticfiles/management/commands/collectstatic.py +++ b/django/contrib/staticfiles/management/commands/collectstatic.py @@ -107,8 +107,10 @@ class Command(NoArgsCommand): prefixed_path = os.path.join(storage.prefix, path) else: prefixed_path = path - found_files[prefixed_path] = (storage, path) - handler(path, prefixed_path, storage) + + if prefixed_path not in found_files: + found_files[prefixed_path] = (storage, path) + handler(path, prefixed_path, storage) # Here we check if the storage backend has a post_process # method and pass it the list of modified files. @@ -207,7 +209,9 @@ Type 'yes' to continue, or 'no' to cancel: """ self.clear_dir(os.path.join(path, d)) def delete_file(self, path, prefixed_path, source_storage): - # Checks if the target file should be deleted if it already exists + """ + Checks if the target file should be deleted if it already exists + """ if self.storage.exists(prefixed_path): try: # When was the target file modified last time? diff --git a/tests/regressiontests/staticfiles_tests/tests.py b/tests/regressiontests/staticfiles_tests/tests.py index 9834885fdd..5c8748ef2c 100644 --- a/tests/regressiontests/staticfiles_tests/tests.py +++ b/tests/regressiontests/staticfiles_tests/tests.py @@ -286,6 +286,61 @@ class TestCollectionDryRun(CollectionTestCase, TestNoFilesCreated): super(TestCollectionDryRun, self).run_collectstatic(dry_run=True) +class TestCollectionFilesOverride(CollectionTestCase): + """ + Test overriding duplicated files by ``collectstatic`` management command. + Check for proper handling of apps order in INSTALLED_APPS even if file modification + dates are in different order: + + 'regressiontests.staticfiles_tests.apps.test', + 'regressiontests.staticfiles_tests.apps.no_label', + + """ + def setUp(self): + self.orig_path = os.path.join(TEST_ROOT, 'apps', 'no_label', 'static', 'file2.txt') + # get modification and access times for no_label/static/file2.txt + self.orig_mtime = os.path.getmtime(self.orig_path) + self.orig_atime = os.path.getatime(self.orig_path) + + # prepare duplicate of file2.txt from no_label app + # this file will have modification time older than no_label/static/file2.txt + # anyway it should be taken to STATIC_ROOT because 'test' app is before + # 'no_label' app in INSTALLED_APPS + self.testfile_path = os.path.join(TEST_ROOT, 'apps', 'test', 'static', 'file2.txt') + with open(self.testfile_path, 'w+') as f: + f.write('duplicate of file2.txt') + os.utime(self.testfile_path, (self.orig_atime - 1, self.orig_mtime - 1)) + super(TestCollectionFilesOverride, self).setUp() + + def tearDown(self): + if os.path.exists(self.testfile_path): + os.unlink(self.testfile_path) + # set back original modification time + os.utime(self.orig_path, (self.orig_atime, self.orig_mtime)) + + def test_ordering_override(self): + """ + Test if collectstatic takes files in proper order + """ + self.assertFileContains('file2.txt', 'duplicate of file2.txt') + + # run collectstatic again + self.run_collectstatic() + + self.assertFileContains('file2.txt', 'duplicate of file2.txt') + + # and now change modification time of no_label/static/file2.txt + # test app is first in INSTALLED_APPS so file2.txt should remain unmodified + mtime = os.path.getmtime(self.testfile_path) + atime = os.path.getatime(self.testfile_path) + os.utime(self.orig_path, (mtime + 1, atime + 1)) + + # run collectstatic again + self.run_collectstatic() + + self.assertFileContains('file2.txt', 'duplicate of file2.txt') + + class TestCollectionNonLocalStorage(CollectionTestCase, TestNoFilesCreated): """ Tests for #15035 @@ -314,7 +369,7 @@ class TestCollectionCachedStorage(BaseCollectionTestCase, "does/not/exist.png", "/static/does/not/exist.png") self.assertStaticRenders("test/file.txt", - "/static/test/file.ea5bccaf16d5.txt") + "/static/test/file.dad0999e4f8f.txt") self.assertStaticRenders("cached/styles.css", "/static/cached/styles.93b1147e8552.css") self.assertStaticRenders("path/",