mirror of
https://github.com/django/django.git
synced 2025-07-03 01:09:12 +00:00
Fixed #35846 -- Ensured consistent path ordering in ManifestStaticFilesStorage manifest files.
This change reuses the existing sorting of `hashed_files` in `ManifestStaticFilesStorage.save_manifest` to also store a sorted `paths` mapping in the manifest file. This ensures stable manifest output that does not change unnecessarily.
This commit is contained in:
parent
58fc40427f
commit
7feafd79a4
@ -496,11 +496,12 @@ class ManifestFilesMixin(HashedFilesMixin):
|
||||
self.save_manifest()
|
||||
|
||||
def save_manifest(self):
|
||||
sorted_hashed_files = sorted(self.hashed_files.items())
|
||||
self.manifest_hash = self.file_hash(
|
||||
None, ContentFile(json.dumps(sorted(self.hashed_files.items())).encode())
|
||||
None, ContentFile(json.dumps(sorted_hashed_files).encode())
|
||||
)
|
||||
payload = {
|
||||
"paths": self.hashed_files,
|
||||
"paths": dict(sorted_hashed_files),
|
||||
"version": self.manifest_version,
|
||||
"hash": self.manifest_hash,
|
||||
}
|
||||
|
@ -154,7 +154,9 @@ Minor features
|
||||
:mod:`django.contrib.staticfiles`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* ...
|
||||
* :class:`~django.contrib.staticfiles.storage.ManifestStaticFilesStorage` now
|
||||
ensures consistent path ordering in manifest files, making them more
|
||||
reproducible and reducing unnecessary diffs.
|
||||
|
||||
:mod:`django.contrib.syndication`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -568,6 +568,20 @@ class TestCollectionManifestStorage(TestHashedFiles, CollectionTestCase):
|
||||
self.assertEqual(manifest_hash, "")
|
||||
self.assertEqual(manifest_content, {"dummy.txt": "dummy.txt"})
|
||||
|
||||
def test_manifest_file_consistent_content(self):
|
||||
original_manifest_content = storage.staticfiles_storage.read_manifest()
|
||||
hashed_files = storage.staticfiles_storage.hashed_files
|
||||
# Force a change in the order of the hashed files.
|
||||
with mock.patch.object(
|
||||
storage.staticfiles_storage,
|
||||
"hashed_files",
|
||||
dict(reversed(hashed_files.items())),
|
||||
):
|
||||
storage.staticfiles_storage.save_manifest()
|
||||
manifest_file_content = storage.staticfiles_storage.read_manifest()
|
||||
# The manifest file content should not change.
|
||||
self.assertEqual(original_manifest_content, manifest_file_content)
|
||||
|
||||
|
||||
@override_settings(
|
||||
STATIC_URL="/",
|
||||
|
Loading…
x
Reference in New Issue
Block a user