mirror of
https://github.com/django/django.git
synced 2025-07-05 10:19:20 +00:00
[1.3.X] Fixed #17737 -- Stopped the collectstatic management command from copying the wrong file in repeated runs. Thanks, pigletto.
Backport from trunk (r17612). git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.3.X@17613 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
dad3e55234
commit
523d6167d6
@ -76,6 +76,7 @@ Type 'yes' to continue, or 'no' to cancel: """)
|
|||||||
if confirm != 'yes':
|
if confirm != 'yes':
|
||||||
raise CommandError("Collecting static files cancelled.")
|
raise CommandError("Collecting static files cancelled.")
|
||||||
|
|
||||||
|
processed_files = []
|
||||||
for finder in finders.get_finders():
|
for finder in finders.get_finders():
|
||||||
for path, storage in finder.list(ignore_patterns):
|
for path, storage in finder.list(ignore_patterns):
|
||||||
# Prefix the relative path if the source storage contains it
|
# Prefix the relative path if the source storage contains it
|
||||||
@ -83,10 +84,13 @@ Type 'yes' to continue, or 'no' to cancel: """)
|
|||||||
prefixed_path = os.path.join(storage.prefix, path)
|
prefixed_path = os.path.join(storage.prefix, path)
|
||||||
else:
|
else:
|
||||||
prefixed_path = path
|
prefixed_path = path
|
||||||
|
if prefixed_path in processed_files:
|
||||||
|
continue
|
||||||
if symlink:
|
if symlink:
|
||||||
self.link_file(path, prefixed_path, storage, **options)
|
self.link_file(path, prefixed_path, storage, **options)
|
||||||
else:
|
else:
|
||||||
self.copy_file(path, prefixed_path, storage, **options)
|
self.copy_file(path, prefixed_path, storage, **options)
|
||||||
|
processed_files.append(prefixed_path)
|
||||||
|
|
||||||
actual_count = len(self.copied_files) + len(self.symlinked_files)
|
actual_count = len(self.copied_files) + len(self.symlinked_files)
|
||||||
unmodified_count = len(self.unmodified_files)
|
unmodified_count = len(self.unmodified_files)
|
||||||
@ -196,8 +200,6 @@ Type 'yes' to continue, or 'no' to cancel: """)
|
|||||||
os.makedirs(os.path.dirname(full_path))
|
os.makedirs(os.path.dirname(full_path))
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
shutil.copy2(source_path, full_path)
|
|
||||||
else:
|
|
||||||
source_file = source_storage.open(path)
|
source_file = source_storage.open(path)
|
||||||
self.storage.save(prefixed_path, source_file)
|
self.storage.save(prefixed_path, source_file)
|
||||||
if not prefixed_path in self.copied_files:
|
if not prefixed_path in self.copied_files:
|
||||||
|
@ -245,6 +245,58 @@ class TestBuildStaticExcludeNoDefaultIgnore(BuildStaticTestCase, TestDefaults):
|
|||||||
self.assertFileContains('test/CVS', 'should be ignored')
|
self.assertFileContains('test/CVS', 'should be ignored')
|
||||||
|
|
||||||
|
|
||||||
|
class TestCollectionFilesOverride(BuildStaticTestCase):
|
||||||
|
"""
|
||||||
|
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')
|
||||||
|
f = open(self.testfile_path, 'w+')
|
||||||
|
f.write('duplicate of file2.txt')
|
||||||
|
f.close()
|
||||||
|
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_override(self):
|
||||||
|
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 TestNoFilesCreated(object):
|
class TestNoFilesCreated(object):
|
||||||
|
|
||||||
def test_no_files_created(self):
|
def test_no_files_created(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user